English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

სტუმარი
1 / ?
უკან გაკვეთილებზე

გრადიენტის პიკები საიდან მოდის

მშვიდი მინი-ბატჩი და შოკური

უმეტესი მინი-ბატჩი ქმნის გრადიენტებს разумანული ზომებით. კროს-ენტროპიის ზარალი მოდელისთვის, რომელიც უკვე დაახლოებით შეხტება მონაცემებს, რჩება ვიწრო დიაპაზონში; უკპროპაგაცია ატარებს ამ სიგნალს უკან მსგავსი ზომის გრადიენტებად.


ზოგიერთი მინი-ბატჩი არა. გრადიენტის პიკების სამი წყარო:


1. გამონაკლისი მაგალითები. ერთი თანმიმდევრობა უკიდურესად იშვიათი ტოკენების კომბინაციით ქმნის შორეულ საშუალოდან loss-ს და შორეულ საშუალოდან გრადიენტს.

2. რიცხვითი კიდის შემთხვევები. თითქმის ნულის softmax-ის მნიშვნელობელი, NaN-ს გამომუშავებელი layernorm, FP16 overflow. თითოეული შეუძლია გამოიწვიოს გრადიენტები, რომლებიც ჩვეულებრივზე ორდერებით უფრო დიდია.

3. განაწილების შეცვლა. ერთი ტრენინგის განმავლობაში მონაცემთა წყაროების შეცვლა მოდელს აჩვენებს ახალ განაწილებას. ANDREA-ს bandit ყოველ 7-დან 42 ნაბიჯამდე ხდება წყაროების წონების ხელახლა გადაწყობა. თითოეული შეცვლა არის მცირე განაწილების შეცვლა.


ANDREA-120M v1: Spike Cascade

v1-ს არ ჰქონდა გრადიენტის კლიპინგი. წყაროების გადასვლები ყოველ 7-დან 42 ნაბიჯამდე bandit-ისგან მოდელს აძლევდა მოკლე შეტევებს repo-docs-ის (სიის სტრუქტურა), შემდეგ gutenberg-ის (გრძელი პროზა), შემდეგ hermes3-general-ის (Q&A). თითოეულმა გადასვლამ გამოიწვია გრადიენტის spike-ები: თითოეული spike დააწვინა წონები დეგენერაციულ ატრაქტორებში 120M მასშტაბზე.


ძირითადი ემპირიული ფაქტი. ANDREA-12M გადარჩა იმავე ბანდიტს კლიპინგის გარეშე. უფრო მცირე წონის მატრიცები უფრო მდგრადია გრადიენტის შოკების მიმართ; ერთი ცუდი ბატჩი ვერ დააწევს 12M პარამეტრს გაუკონტროლებელ ატრაქტორში ისე, როგორც შეუძლია 120M-ის. კლიპინგი უფრო მნიშვნელოვანია მოდელის მასშტაბირებისას.

გლობალური L2 ნორმის კლიპინგი

ორი არჩევანი: Per-Tensor ან გლობალური

გრადიენტის მაგნიტუდების შეზღუდვის ორი გზა:


Per-tensor კლიპინგი. თითოეული გრადიენტის ტენსორის დამოუკიდებელი კლიპინგი. ემბედინგის გრადიენტი კლიპდება თავისი ნორმით; ატენშენის გრადიენტი კლიპდება თავისი ნორმით. მარტივია, მაგრამ არღვევს ფარდობით მასშტაბებს: ერთი ტენსორის მცირე სპაიკი (ახლა ნულოვანი გრადიენტი) ეხლება მეორე ტენსორის უზარმაზარ გრადიენტს (შეუხებელი).


გლობალური L2 ნორმის კლიპინგი. ყველა გრადიენტის ერთ დიდ ვექტორად მიჩნევა. თითოეული პარამეტრის მთლიანი L2 ნორმის გამოთვლა. თუ ნორმა აღემატება max_norm-ს, ყველა გრადიენტის ერთი და იგივე ფაქტორით მასშტაბირება. ინარჩუნებს ფარდობით მაგნიტუდებს ტენსორებს შორის.


ANDREA იყენებს გლობალურ მეთოდს. Pascanu et al. (2013) ემპირიულად დაამტკიცეს, რომ გლობალური კლიპინგი უკეთესად მუშაობს პერ-ტენსორის ვიდრე ტრანსფორმერის სწავლებისთვის.


მათემატიკა

გამოთვალეთ გლობალური L2 ნორმა:


norm = sqrt(sum over all params of g_i^2)


თუ norm <= max_norm, გრადიენტები გადის უცვლელად. თუ norm > max_norm, მასშტაბირება ყველა გრადიენტი max_norm / norm-ით:


g_i_clipped = g_i * (max_norm / norm)


მასშტაბირების შემდეგ, ახალი norm ზუსტად უდრის max_norm-ს. ANDREA იყენებს max_norm = 1.0.

მასშტაბირების ფაქტორის გამოთვლა

დავუშვათ, ერთი ტრენინგის ნაბიჯის დროს, ყველა გრადიენტის გლობალური L2 norm-ი გამოთვლილია როგორც `3.5`. ANDREA-ს `max_norm = 1.0`. გამოთვალე (a) გამოყენებული მასშტაბირების ფაქტორი, (b) რა უდრის ახალი გლობალური L2 norm-ი მასშტაბირების შემდეგ, & (c) რა მოხდებოდა, თუ არაკლიპირებული norm-ი `0.4` იყოს `3.5`-ის ნაცვლად. აჩვენე შენი არითმეტიკა.

რატომ საჭიროა გრადიენტის ნორმის გამოთვლისთვის სამი კერნელი

ნაივური ალგორითმი ვერ მუშაობს GPU-ზე

ფსევდოკოდი გლობალური L2 ნორმის გამოთვლისთვის:


total = 0
თითოეული პარამეტრისთვის p:
თითოეული ელემენტისთვის g პარამეტრ p.grad-ში:
total += g * g
norm = sqrt(total)

GPU-ზე ეს მარტივი ციკლი ორი მიზეზის გამო არ მუშაობს:


1. სეკვენციური აკუმულაცია. ერთი total აკუმულატორი აიძულებს ყველა ძაფს დაელოდოს სხვა ყველა ძაფს, რაც უარყოფს GPU პარალელიზმს.

2. ჰეტეროგენული ტენზორები. ANDREA-120M-ს აქვს ტენზორები სრულიად განსხვავებული ფორმებით: embedding (8449 x 768), attention QKV (768 x 768), layernorm (768). ერთი კერნელი ვერ შეძლებს ეფექტურად გაიაროს ყველა ფორმა.


ANDREA-ს სამკერნელოვანი პაიპლაინი

განაწილეთ მუშაობა სამ CUDA კერნელად microgpt_cuda.cu-ში:


კერნელი 1: k_grad_norm_partial. თითოეული პარამეტრის ტენზორისთვის გამოთვალეთ ნაწილობრივი კვადრატული ჯამი. თითოეული ძაფის ბლოკი ამცირებს ტენზორის ნაწილს; შედეგები ჩაწერილია მცირე scrap ჩამრთველში. პარალელიზმი: ერთი ბლოკი თითო ნაწილზე, ასეულობით ბლოკი ყველა ტენზორის გადაედის.


Kernel 2: k_grad_norm_final. შეამცირე scratch buffer ერთ სკალარზე. მიიღე მისი კვადრატული ფესვი. ერთი მცირე kernel, მუშაობს მიკროწამებში.


Kernel 3: k_grad_scale. თუ norm > max_norm, გამოთვალე scale = max_norm / norm & გამრავლე ყველა გრადიენტის ელემენტი scale-ზე. ერთი გავლა ყველა გრადიენტის ტენზორზე, სრულიად პარალელური.


თანამედროვეობა მნიშვნელოვანია: Pre-Adam

Clipping-ის pipeline მუშაობს AdamW-ის m, v, ან ნებისმიერი პარამეტრის განახლებამდე. რატომ?


ამოკვეთილი გრადიენტები კვებავს AdamW-ის ექსპონენციალურ მოძრავ საშუალოებს. თუ სპაიკი ნებადართული იქნებოდა m & v-ში შეყვანილიყო, ის დააზიანებდა ამ მიმდინარე საშუალოებს & შეანელებდა აღდგენას სპაიკის შემდეგ მრავალი ნაბიჯის განმავლობაში. ამოკვეთა Adam-ამდე ხდის სპაიკის ეფექტს შეზღუდულს მხოლოდ ერთი ცუდი ნაბიჯით.


Gradient Clipping with 3 CUDA Kernels

რატომ სამი კერნელი, ერთის ნაცვლად?

დავუშვათ, ვინმემ შესთავაზა `k_grad_norm_partial` & `k_grad_norm_final`-ის შერწყმა ერთ კერნელში, რომელიც მთლიან გლობალურ ნორმას ერთ გავლებაში გამოთვლის. მიეცით ერთი კონკრეტული მიზეზი, თუ რატომ ჩაიშალავდა ეს შერწყმა ან რატომ იქნებოდა უარესი მუშაობა GPU-ზე. მიუთითეთ, როგორ იზიარებენ GPU-ის ნაჸირებლებლები მეხსიერებას & სინქრონიზდებიან.

როგორ მოკლა No-Clipping v1-ს

Bandit Source Transitions ყოველ 7-დან 42 ნაბიჯამდე

ANDREA-ს bandit მუშაობს ფაზებში. თითოეული ფაზა გრძელდება 7, 14, 21, 28 ან 42 ნაბიჯი (შერჩეული შემთხვევითად). თითოეული ფაზის საზღვარზე წყაროს წონები იცვლება: შესაძლოა repo-docs გაყვეს 0.1-დან 0.6-მდე, gutenberg დაეცეს 0.4-დან 0.1-მდე, hermes3-general გაიზარდოს 0.5-დან 0.7-მდე.


თითოეული გარდამავლობა მოდელისთვის განაწილების შოკია. Loss მოკლედ იზრდება. გრადიენტებიც იზრდება: მოდელი, რომელიც ზოგავდა loss-ს gutenberg-სებული პროზის წინააღმდეგ, ახლა ხედავს repo-docs-სებულ სიების სტრუქტურებს, & გრადიენტები შეიცავს კორექტირებულ სიგნალს, რომელიც შეიძლება იყოს 10x ან 100x ტიპური მაღალბრტყელობის.


v1 Failure Mode

კლიპინგის გარეშე, ეს 10-100x გრადიენტის პიკები მიედინებოდა AdamW-ის m და v საშუალოებში. AdamW-ის გლუვებამ გამოიწვია პიკის ეფექტის შენარჩუნება მრავალ ნაბიჯზე ცუდი ბატჩის შემდეგ. კომბინირებული წონის დეკრიმენტის გარეშე (ვანილის Adam v1-ში), პიკებით გამოწვეული წონის განახლებები გროვდებოდა ფაზებში, სანამ წონები არ გადავიდოდა დეგენერაციულ ატრაქტორში: ერთი ტოკენის ლოგიტი დომინირებდა სოფტმაქსს, შეგნებულ გამომავალს იყო ეს ტოკენი, ტრენინგის კონტექსტი შეიცავდა ამ ტოკენს, გრადიენტი აძლიერებდა ამ ტოკენს. გამეორების ჩაკეტვა.


v2 სტაბილურობა

v2-მე დაამატა კლიპინგი max_norm = 1.0-ით, პარალელურად AdamW-სთან და LR warmup-თან. პიკის ეფექტი m-ზე და v-ზე შეზღუდულია; წონები ვერ გადაიწევს უფრო სწრაფად, ვიდრე lr max_norm = 0.0003 1.0 = 0.0003 თითო პარამეტრზე თითო ნაბიჯზე პიკის დროს. ფაზის ტრანზიციები მაინც იწვევს პიკებს, მაგრამ ეს პიკები შეზღუდულია ოპტიმიზატორამდე მიღწევამდე.


შედეგი: v2 (მონაცემთა ფილტრის v2.5-ისა და v3 შეპარლების შემდეგ) მიაღწია ფაქტობრივ ჩაწოდებას, მრავალპარაგრაფიან თანმიმდევრულობას და 9.5/10 გარე შეფასებებს ბიოლოგიისა და სიგნალური პროცესორის ნიმუშებზე.


მოცულობა-მყიფეობის კავშირი

იგივე ბანდიტი. იგივე მონაცემები. იგივე ჰიპერპარამეტრები გარდა კლიპინგისა. რატომ გადარჩა 12M კლიპინგის გარეშე, ხოლო 120M ჩამოიშალა?


ორი კომპაუნდირებული ფაქტორი:


1. დიდი წონის მატრიცები მეტ ატრაქტორებს ინახავს. 768x768 ყურადღების პროექცია 590K პარამეტრს შეიცავს; თუნდაც მცირე პერ-პარამეტრის ცდენა მნიშვნელოვან ცვლილებებს იწვევს ყურადღების ქცევაში. 384x384 ყურადღების პროექცია 147K პარამეტრს შეიცავს და უფრო შეზღუდულ ქვესივრცეში რჩება.

2. მეტი ფენა ნიშნავს მეტ მულტიპლიკატიურ ურთიერთქმედებას. v3 შეიცავს 12 ტრანსფორმერის ფენას (12M-ის 6-ისგან). სპაიკები გავრცელდება 12 ფენის კომპაუნდირებული არალინეარულობების მეშვეობით; თითოეული ფენა შეუძლია გააძლიეროს წინა ფენის ცდენა.


მყიფეობა კომპაუნდირდება შესაძლებლობასთან. კლიპინგი სავალდებულო ხდება გარკვეული მასშტაბის ზღვარზე; ANDREA ამ ზღვარს 12M-სა და 120M პარამეტრებს შორის ათავსებს.

v1 კასკადის დიაგნოსტიკა

დავუშვათ, v1 ტრენინგის 50,000-ე ნაბიჯზე, ერთი მინი-ბატჩი გამოიმუშავებს გრადიენტს გლობალური L2 ნორმით 50.0 (ტიპური ბატჩები გამოიმუშავებენ ~0.5-ს). თვალ-ყური ადევნეთ რა ხდება AdamW-ის პირველ მომენტს `m`-ს მომდევნო 10 ნაბიჯზე, თუ შემდგომი ბატჩები დაბრუნდებიან ტიპურ გრადიენტის მაგნიტუდებზე. გაითვალისწინეთ როგორ პროპაგირებს `m = beta1 * m + (1 - beta1) * g` სპაიკი beta1=0.9-ით.

სად სხვაგან გამოიყენება კლიპინგი?

ANDREA-ის ბენდიტ-დრაივენ კურიკულუმის მიღმა, დაასახელე **ერთი სხვა** ტრენინგის სცენარი, სადაც გლობალური L2 გრადიენტის კლიპინგი იქნებოდა მსგავსად მნიშვნელოვანი, & მიეცი **ერთი მექანიზმი**, რაც ამას ასე ხდის.

მიმდებარე აქტივობები

სამი ძმა-და უკავშირდება კლიპინგს:


- აქტივობა 10: AdamW. კლიპინგი იცავს AdamW-ის m-ს და v-ს სპაიკის დაბინძურებისგან. კლიპინგის გარეშე, ერთი ცუდი ბატჩი არღვევს ოპტიმიზატორის მდგომარეობას 50+ ნაბიჯზე.

- აქტივობა 11: LR warmup. Warmup ამცირებს lr-ს; კლიპინგი ამცირებს g-ს. ერთად: პირველ ნაბიჯზე, ყველაზე ცუდ შემთხვევაში პარამეტრის განახლება არის lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, ვიდრე 0.0003 * 50 = 0.015 ორივე დამცავის გარეშე. 100,000-ჯერ შემცირება ყველაზე ცუდ შემთხვევაში ადრეული განახლების მაგნიტუდაში.

- აქტივობა 14: მრავალხელსაჭრელი ბანდიტები. ბანდიტის ფაზის სიგრძე (7-დან 42 ნაბიჯამდე) მოკლეა სპეციალურად იმისთვის, რომ ნებისმიერი ერთი წყარო არ გაბატონოს; კლიპინგი არის ის, რაც ხდის ამ ხშირ ტრანზიციებს უსაფრთხოს.


კლიპინგი არის ყველაზე იაფი სტაბილურობის მოგება ტრანსფორმერის სწავლებაში: 3 მცირე CUDA კერნელი, მიკროწამები ნაბიჯზე, გადამწყვეტი გავლენა იმაზე, იქნება თუ არა 120M+ მოდელები კონვერგენტული ან კოლაფსირებული.