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

un

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

ყურადღება პლუს MLP, განმეორებადი

Transformer Block Pre-Norm Structure


ორი სუბლეიერი

ტრანსფორმერის ბლოკი შეიცავს ზუსტად ორ სუბლეიერს, რომელთაგან თითოეული მუშაობს ტოკენების მიმდევრობაზე ფორმით [batch, seq_len, d_model]: Notes on translation fidelity: - All technical terms (Transformer, MLP, multi-head attention, residual connection, layer normalization, GELU, pre-norm, d_model) preserved in original English as is standard in Georgian technical educational materials. - Natural and accurate Georgian used for explanatory text. - All placeholders, formatting, SVG link, and structure strictly preserved.


1. მრავალთავიანი ყურადღების ქვედონენი. ტოკენები ერთმანეთს უყურებენ. 68-ე აქტივობაში ეს დეტალურად იყო განხილული. გამომავალი ფორმა ემთხვევა შეყვანის ფორმას.

2. Feed-forward MLP ქვედონენი. თითოეული ტოკენი დამოუკიდებლად გარდაიქმნება ორშრიანი პერცეპტრონით. ტოკენებს შორის ინფორმაციის გადაცემა არ ხდება. გამომავალი ფორმა ემთხვევა შეყვანის ფორმას.


ორივე ქვედონენი ინარჩუნებს [batch, seq_len, d_model] ფორმას. ეს შენარჩუნება საშუალებას იძლევა ბლოკები ერთმანეთზე დაეწყონ: N-ური ფენის გამომავალი პირდაპირ N+1-ური ფენის შეყვანად გამოიყენება, ფორმის არანაირი გარდაქმნის გარეშე.


რას უწყობს თითოეული ქვედონენი

ყურადღება ინფორმაციას პოზიციებს შორის ატარებს: პოზიცია 17-ზე მყოფმა ტოკენმა შეიძლება ინფორმაცია 1-დან 16-მდე პოზიციებიდან მოიზიდოს. MLP კი ინფორმაციას თითოეულ პოზიციაში გარდაქმნის: ტოკენის წარმოდგენა გარდაიქმნება სწავლებული არაწრფივი ფუნქციებით, თუმცა მეზობელ ტოკენებს არასდროს ხედავს.


ბლოკების დაწყობა ამ ორ ოპერაციას მონაცვლეობით ასრულებს. Layer 1-ის attention პოზიციებს ურევს. Layer 1-ის MLP თითოეული პოზიციის წარმოდგენას � reshaping-ავს. Layer 2-ის attention კვლავ ურევს, ამჯერად უკვე reshaped წარმოდგენებზე. ეს მონაცვლეობა სიღრმესთან ერთად ზრდის გამომსახველობით ძალას.


ANDREA-ს სტეკი


ვარიანტიn_layern_headd_modelmlp_dim
ANDREA-12M6123841536
ANDREA-120M12127683072
ANDREA-480M162415366144

შენიშნეთ, რომ mlp_dim = 4 × d_model მოდელების ოჯახში. ეს თანაფარდობა თითქმის ყველა თანამედროვე ტრანსფორმერში იცავს. მე-3 სექცია განმარტავს, თუ რატომ.

სუბლეიერების დასახელება

ტრანსფორმერის ბლოკი შეიცავს ორ სუბლეიერს. დაასახელეთ ისინი თანმიმდევრობით და თითოეულისთვის მიუთითეთ, გადაადგილებს თუ არა ინფორმაციას პოზიციებს შორის (token-to-token) თუ გარდაქმნის ინფორმაციას ერთი პოზიციის ფარგლებში (დამოუკიდებლად თითოეული ტოკენისთვის). ერთი წინადადება თითო სუბლეიერზე.

რატომ არის მნიშვნელოვანი გამოტოვებითი კავშირები

ნარჩენი შაბლონი

თითოეული ქვედონისტი თავის გამოთვლას ახვევს ნარჩენ კავშირში. გამომავალი უმატებს საწყის შეყვანას:


x = x + Attention(LayerNorm(x))     # attention sublayer
x = x + MLP(LayerNorm(x))           # MLP ქვეშერი

თითოეული ქვეშერის შიგნით, ფუნქცია Attention(...) ან MLP(...) ქმნის დელტას. ბლოკი არ ცვლის შეყვანას; ის ამატებს სასწავლო კორექციას.


რატომ არის ეს მნიშვნელოვანი

სამი მიზეზი, რის გამოც ნარჩენი კავშირები (residual connections) დომინირებს ღრმა არქიტექტურებში:


1. გრადიენტის ნაკადი. უკუ-გავრცელების (backpropagation) დროს, ნარჩენი კავშირი გრადიენტებს პირდაპირ გზას უქმნის გამომავალიდან შესავალამდე, გვერდის ავლით ქვედა ფენას. 12-ფენიანი სტეკი ნარჩენი კავშირის გარეშე დაკარგავდა გრადიენტის სიგნალს გაცილებით ადრე, სანამ ემბედინგებამდე მიაღწევდა; ნარჩენი კავშირებით კი გრადიენტის მნიშვნელობა რჩება გამოყენებადი ასობით ფენის განმავლობაში.


2. იდენტურობის ინიციალიზაცია. ინიციალიზაციისას ქვედა ფენის წონები ქმნიან მცირე გამომავალს. ნარჩენი კავშირი ნიშნავს, რომ N-ფენა თავდაპირველად თითქმის უცვლელად გადის. ტრეინინგი თანდათანობით სწავლობს დელტებს სამუშაო საწყისი წერტილიდან.


3. კომპოზიციური სწავლა. ყველა ბლოკი სწავლობს დახვეწას, და არა ჩანაცვლებას. პირველმა ფენამ შეიძლება დაამატოს პოზიციური ინფორმაცია. მეორე ფენამ შეიძლება დაამატოს სინტაქსური სტრუქტურა. მეშვიდე ფენამ შეიძლება დაამატოს სემანტიკური ურთიერთობები. ნარჩენი ნაკადი (residual stream) დაგროვებს ამ ყველაფერს.


ფენის ნორმალიზაცია (Layer Normalization)

თითოეული ქვედა ფენის წინ, LayerNorm ხელახლა მასშტაბირებს თითოეული ტოკენის წარმოდგენას ნულოვან საშუალო და ერთეულოვანი დისპერსიით, შემდეგ კი ამატებს სასწავლო პერ-ფუნქციურ გამრავლებასა და წანაცვლებას:


y = gamma * (x - mean(x)) / sqrt(var(x) + epsilon) + beta

საშუალო და დისპერსია გამოითვლება d_model განზომილების გასწვრივ, თითოეული ტოკენისთვის ცალ-ცალკე. ორი სასწავლო ვექტორი (gamma, beta, თითოეული ფორმის [d_model]) აღადგენს გამომსახველობის მასშტაბს. ნორმალიზაცია ინარჩუნებს აქტივაციებს რიცხვითად სტაბილურ დიაპაზონში; მის გარეშე მცირე ტრეინინგის არასტაბილურობები თოვლის ბურთ 처럼 გადაიქცევა NaN გრადიენტებად.

პრე-ნორმი თუ პოსტ-ნორმი

დახვეწილი, მაგრამ კრიტიკული არჩევანი

რეზიდუალურ სუბლეიერში LayerNorm-ის ჩასმის ორი გზა:


Post-norm (ორიგინალური 2017 წლის ნაშრომი):

x = LayerNorm(x + Attention(x))

LayerNorm დგას რეზიდუალური შეკრების შემდეგ. რეზიდუალური ნაკადი თავად ნორმალიზდება ყველა ლეიერში.


წინასწარი ნორმალიზაცია (თანამედროვე სტანდარტი, გამოიყენება ANDREA-ში):

x = x + Attention(LayerNorm(x))

LayerNorm დგას სუბლეიერის წინ, რეზიდუალური ბრენჩის შიგნით. რეზიდუალური ნაკადი რჩება ნორმალიზაციის გარეშე; მხოლოდ სუბლეიერის შეყვანა იღებს რესკალირებას.


რატომ გაიმარჯვა Pre-Norm-მა

Post-norm ცუდად იწვრთნება LR warmup-ისა და ფრთხილი ჰიპერპარამეტრების დარეგულირების გარეშე. გრადიენტები აფეთქდება საწყის ფენებში, რადგან თითოეული layer norm აურევს რეზიდუალური ნაკადის დაგროვილ მდგომარეობას. 2017 წლის ორიგინალმა ნაშრომმა გამოიყენა post-norm ფართო დარეგულირებით; შემდგომმა სამუშაოებმა (GPT-2, LLaMA, ANDREA) სტანდარტად Pre-Norm დაამკვიდრა.


პრე-ნორმა (pre-norm) სტაბილურად მუშაობს. რეზიდუალური ნაკადი (residual stream) სუფთად გროვდება ყველა ფენაში; მხოლოდ სუბლეიერის შესავალი ნორმალიზდება რიცხვითი სტაბილურობისთვის. თანამედროვე ტრანსფორმერები ნაგულისხმევად იყენებენ პრე-ნორმას, და ANDREA-ც ამ არჩევანს იღებს.


საბოლოო ბლოკის განტოლება

რეზიდუალების, პრე-ნორმაში მყოფი layer norm-ისა და ორივე სუბლეიერის შერწყმა იძლევა ANDREA-ს სრულ ბლოკს:


def block_forward(x):
x = x + Attention(LayerNorm(x))   # attention ქვედონის
x = x + MLP(LayerNorm(x))         # MLP ქვედონის
return x

ორი ქვედონი, ორი residual დამატება, ორი layer norm (შენიშვნა: თითოეულ ქვედონს აქვს საკუთარი layer norm; ANDREA-120M-ს აქვს 24 layer norm 12 ბლოკში პლუს ერთი საბოლოო გამომავალზე, სულ 25). გაიმეორეთ 12-ჯერ. ეს არის ANDREA-120M-ის ძირითადი ხერხემალი.

რატომ ასტაბილურებს Pre-Norm ტრეინინგს

ANDREA იყენებს pre-norm-ს: `x = x + Attention(LayerNorm(x))`. შეადარეთ post-norm-ს: `x = LayerNorm(x + Attention(x))`. მოიყვანეთ ერთი მიზეზი გრადიენტის ნაკადის (gradient flow) თვალსაზრისით, თუ რატომ არის pre-norm უფრო სტაბილური ტრეინინგისთვის ღრმა სტეკებში. პასუხში აუცილებლად მიუთითეთ residual stream.

ორი Linear ფენა, ერთი აქტივაცია

სამი ოპერაცია

MLP სუბლეიერი არის ორფენიანი პერცეპტრონი, რომელსაც ფენებს შორის არაწრფივი აქტივაცია აქვს:


def mlp_forward(x):
h = x · W_1 + b_1        # გაფართოება: d_model → mlp_dim
h = GELU(h)              # არახაზოვანი აქტივაცია
y = h · W_2 + b_2        # შეკუმშვა: mlp_dim → d_model
return y

სამი ოპერაცია. ორი წრფივი, ერთი არაწრფივი. პირველი წრფივი ფართობს აფართოებს; მეორე კი ისევ აკუმშავს.


გაფართოების კოეფიციენტი 4×

თანამედროვე ტრანსფორმერები იყენებენ mlp_dim = 4 × d_model. ANDREA-120M:


d_model = 768
mlp_dim = 4 × 768 = 3072
W_1 ფორმა = [768, 3072]      # ~2.36M პარამეტრი
W_2 ფორმა = [3072, 768]      # ~2.36M პარამეტრი
MLP-ის პარამეტრები თითო ბლოკზე = 4.72M (ბიასების გამოკლებით)

ორი MLP ზის ყველა ყურადღების ქვედანართს შორის (თითო ბლოკზე ერთი). თორმეტი ბლოკი × 4.72M ≈ 56.6M MLP პარამეტრი სულ ANDREA-120M-ში, რაც დაახლოებით ყველა პარამეტრის ნახევარს შეადგენს.


რატომ 4×

4× თანაფარდობა გამოვლინდა ემპირიულად. უფრო მცირე თანაფარდობები ამცირებენ მოდელის სიმძლავრეს. უფრო დიდი თანაფარდობები კი მცირდება დაბრუნებას პარამეტრზე დახარჯულ თითოეულ დოლარზე. არქიტექტურის ძიების ათწლეულების განმავლობაში 4× თანაფარდობამ თავი დაიმკვიდრა; იგი გვხვდება GPT-ში, BERT-ში, T5-ში, LLaMA-სა და ANDREA-ში.


უახლესმა კვლევებმა (PaLM, Chinchilla) აჩვენა, რომ გეიტინგის მექანიზმები (SwiGLU) შეუძლიათ გამოიყენონ 8/3× გაფართოება შედარებითი სიმძლავრით, მაგრამ ნაკლები ხარჯით. ANDREA კი სიმარტივისთვის რჩება კლასიკურ GELU-ზე + 4× თანაფარდობაზე.

GELU: გლუვი აქტივაცია

რას ითვლის GELU

GELU (Gaussian Error Linear Unit — გაუსისეული შეცდომის ხაზოვანი ერთეული) არის სტანდარტული აქტივაციის ფუნქცია თანამედროვე ტრანსფორმერების MLP-ების შორის. მისი ფორმულა:


GELU(x) = x · Φ(x)

Φ(x) არის სტანდარტული ნორმალური განაწილების კუმულაციური განაწილების ფუნქცია: იმის ალბათობა, რომ სტანდარტული გაუსის შემთხვევითი ცვლადი იქნება x-ზე ან x-ზე ნაკლები. გამოითვლება რიცხვითად:


Φ(x) ≈ 0.5 × (1 + tanh(√(2/π) × (x + 0.044715 × x³)))

ქცევა რეგიონების მიხედვით

- დიდი დადებითი x-ისთვის: Φ(x) ≈ 1, ამიტომ GELU(x) ≈ x. ReLU-ს მსგავსად.

- დიდი უარყოფითი x-ისთვის: Φ(x) ≈ 0, ამიტომ GELU(x) ≈ 0. ReLU-ს მსგავსად.

- x = 0-ის მახლობლად: Φ(x) ≈ 0.5, ამიტომ GELU(0) = 0 ზუსტად. გლუვი გადასვლა საწყისი წერტილის გავლით.


ReLU-ისგან განსხვავებით, GELU გარკვეულ უარყოფით შეყვანებსაც пропускает, Φ(x)-ით შეწონილად. მცირე უარყოფითი შეყვანა მაინც იძლევა მცირე უარყოფით გამომავალს, თუმცა ნაკლებს, ვიდრე სრული შეყვანა იქნებოდა.


რატომ აჯობა GELU-მ ReLU-ს

ემპირიულად, ტრანსფორმერები, რომლებიც GELU-ით არიან დატრენირებული, უფრო დაბალ დანაკარგს აღწევენ, ვიდრე ReLU-ით დატრენირებული ტრანსფორმერები იმავე პარამეტრების რაოდენობით. გლუვობა ნულის გარშემო მნიშვნელოვანია: ReLU-ს მკვეთრი ჭრა ნულში ქმნის გრადიენტის წყვეტილობებს; GELU-ს გლუვი მრუდი კი უზრუნველყოფს უფრო სუფთა გრადიენტებს ბэкპროპაგაციისთვის.


ANDREA-ს საწვრთნელი ძრავი microgpt_cuda.cu შეიცავს ხელით დაწერილ GELU CUDA კერნელს. კერნელი იყენებს ზემოთ მოყვანილ tanh-ზე დაფუძნებულ აპროქსიმაციას; თანამედროვე GPU-ები tanh-ს ერთ ინსტრუქციად ასრულებენ.

MLP-ის პარამეტრების გამოთვლა

ANDREA-120M-ს აქვს `d_model=768`, `mlp_dim=3072` და `n_layer=12`. გამოთვალეთ საერთო პარამეტრები MLP-ის წონით მატრიცებში (`W_1` და `W_2`) 12 ბლოკის მასშტაბით. იგნორირება გაუკეთეთ ბაიესებს. აჩვენეთ თქვენი არითმეტიკა. შემდეგ თქვით, ANDREA-120M-ის ~120 მილიონიანი პარამეტრების რა წილს (პროცენტულად, ერთი ათობითი სიზუსტით) წარმოადგენს ეს რიცხვი.

თორმეტი ბლოკი ქმნის ANDREA-120M-ს

ბლოკიდან მოდელამდე

ANDREA-120M-ის სრული წინ გადაწყობა:


def model_forward(token_ids):
x = token_embed(token_ids) + position_embed(positions)
for block_idx in range(n_layer):       # 12 ბლოკი
x = block_forward(x)               # attention + MLP ნარჩენ კავშირებით (residuals)
x = LayerNorm(x)                       # საბოლოო ნორმალიზაცია
logits = x · token_embed.T             # გაზიარებული წონები გამომავალი პროექციისთვის
return logits

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


სიღრმე როგორც კომპოზიცია

თითოეული ბლოკი კითხულობს ნარჩენ ნაკადს (residual stream), ითვლის დელტას და ამატებს მას უკან. თორმეტი გავლის შემდეგ ნაკადი შეიცავს დაგროვებულ წვლილს ყველა ბლოკისგან. შიდა სტრუქტურაში ფენები, როგორც წესი, სპეციალიზდებიან:


- ადრეული ფენები (1-3): სინტაქსური ნიმუშები, პოზიციური სტრუქტურა

- შუა ფენები (4-8): სიტყვათა ურთიერთობები, ფრაზის საზღვრები

- გვიანდელი ფენები (9-12): სემანტიკური შინაარსი, ფაქტობრივი მეხსიერება


ეს სპეციალიზაცია წარმოიქმნება ტრეინინგის ზეწოლის შედეგად, და არა არქიტექტურული არჩევანის გამო. იგივე ერთგვაროვანი ბლოკის დიზაინი, ენაზე ტრეინინგისას, ქმნის სპეციალიზებულ ფენებს.


ბლოკების საერთო პარამეტრები


კომპონენტითითო ბლოკზე12 ბლოკზე
Attention projections (4×W)2.36M28.3M
MLP წონები (W_1 + W_2)4.72M56.6M
Layer norm-ები (gamma, beta)~3K (ნეგლიჟებადი)~37K
სულ თითოეულ ბლოკზე~7.1M~85M

ტრანკში 85M პარამეტრია. დავამატოთ ~13M ტოკენების ემბედინგებში (8449 ლექსიკონი × 768 d_model × 2 შეყვანა/გამომავალი ტაივის გამო) პლუს საბოლოო layer norm, და ANDREA-120M-ის პარამეტრების რაოდენობა დაახლოებით 120M-მდე მოდის. ბლოკის დიზაინი იკავებს ორ მესამედს; ემბედინგები — დანარჩენს.

ტოკენის გავლა ერთ ბლოკში

768-განზომილებიანი ტოკენის ვექტორი შედის ANDREA-120M-ის ბლოკ 7-ში. აღწერეთ, რა ხდება მას ბლოკის შიგნით (pre-norm სტრუქტურაში). აუცილებლად ახსენეთ: ორივე layer norm, ორივე ქვე-ფენა, ორივე residual დამატება და საბოლოო ფორმა. მიუთითეთ სულ ცოტა ერთი ადგილი, სადაც residual stream უცვლელი რჩება და ერთი ადგილი, სადაც ის იცვლება.