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

un

ضيف
1 / ?

الانتباه بالإضافة إلى MLP، متكرر

هيكل كتلة المحول Pre-Norm


الطبقتان الفرعيتان

تحتوي كتلة محول على طبقتين فرعيتين بالضبط، تعمل كل منهما على تسلسل رموز بشكل [batch, seq_len, d_model]: [END OF OUTPUT]


1. طبقة الاهتمام متعدد الرؤوس. الرموز تنظر إلى بعضها البعض. النشاط 68 غطى هذا بالتفصيل. شكل الإخراج يطابق شكل الإدخال.

2. طبقة MLP التقديمية الأمامية. كل رمز يتحول بشكل مستقل عبر perceptron ذو طبقتين. لا يوجد تدفق معلومات بين الرموز. شكل الإخراج يطابق شكل الإدخال.


كلا الطبقتين الفرعيتين تحافظان على الشكل [batch, seq_len, d_model]. هذا الحفاظ يسمح بتكديس الكتل: إخراج الطبقة N يغذي إدخال الطبقة N+1 دون حيل في الأشكال.


ما يساهم به كل طبقة فرعية

الاهتمام ينقل المعلومات عبر المواضع: يمكن لرمز في الموضع 17 سحب معلومات من المواضع 1 إلى 16. الـMLP تحول المعلومات داخل كل موضع: تمثيل الرمز يُعاد تشكيله عبر دوال غير خطية مُتَعَلَّمَة، لكنه لا يرى جيرانه أبداً.


ترتيب الكتل يتناوب بين هاتين العمليتين. انتباه الطبقة 1 يمزج المواقع. MLP الطبقة 1 يعيد تشكيل لكل موقع. انتباه الطبقة 2 يمزج مرة أخرى، الآن فوق التمثيلات المعاد تشكيلها. هذا التناوب يزيد من القوة التعبيرية مع العمق.


كومة ANDREA


Variantn_layern_headd_modelmlp_dim
ANDREA-12M6123841536
ANDREA-120M12127683072
ANDREA-480M162415366144

لاحظ mlp_dim = 4 × d_model عبر العائلة. هذا النسبة يحافظ عليها في معظم الـ transformers الحديثة تقريبًا. القسم 3 يشرح السبب.

تسمية الطبقات الفرعية

كتلة الـ transformer تحتوي على طبقتين فرعيتين. سمِّهما بالترتيب، ولكل واحدة حدد ما إذا كانت تنقل المعلومات عبر المواضع (من توكن إلى توكن) أو تحول المعلومات داخل موضع واحد (مستقل لكل توكن). جملة واحدة لكل طبقة فرعية.

لماذا تُهمّ الروابط المتخطية

نمط المتبقي

كل طبقة فرعية تلف حسابها في رابطة متبقية. الإخراج يضيف الإدخال مرة أخرى:


x = x + Attention(LayerNorm(x))     # طبقة الاهتمام الفرعية
x = x + MLP(LayerNorm(x))           # طبقة فرعية MLP

داخل كل طبقة فرعية، الدالة Attention(...) أو MLP(...) تنتج دلتا. الكتلة لا تحل محل الإدخال؛ بل تضيف تصحيحًا متعلمًا.


لماذا هذا مهم

ثلاث أسباب تجعل الاتصالات المتبقية تهيمن على الهياكل العميقة:


1. تدفق التدرج. أثناء الانتشار العكسي، يوفر الإضافة مسارًا مباشرًا للتدرجات من الإخراج إلى الإدخال، متجاوزًا الطبقة الفرعية. في كومة من 12 طبقة بدون بقايا، سيفقد إشارة التدرج قبل الوصول إلى التمثيلات المضمنة؛ مع البقايا، يبقى حجم التدرج صالحًا عبر مئات الطبقات.


2. تهيئة الهوية. عند التهيئة، تنتج أوزان الطبقة الفرعية مخرجات صغيرة. تعني الاتصال الباقي أن الطبقة N تمرر في البداية تقريبًا دون تغيير. يتعلم التدريب الدلتا تدريجيًا من نقطة بداية عاملة.


3. التعلم التركيبي. تتعلم كل كتلة تهيئة، لا استبدالًا. قد تضيف الطبقة 1 معلومات موضعية. قد تضيف الطبقة 2 هيكلًا نحويًا. قد تضيف الطبقة 7 علاقات دلالية. يتراكم التيار الباقي.


تطبيع الطبقة

قبل كل طبقة فرعية، يعيد LayerNorm تصحيح تمثيل كل رمز إلى متوسط صفر وتباين وحدة، ثم يطبق مكسبًا وانحيازًا مُتَعَلَّمًا لكل ميزة:


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

يتم حساب المتوسط والتباين عبر بُعد d_model، بشكل منفصل لكل رمز (token). متغيرا متعلمين (gamma، beta، كل منهما بشكل [d_model]) يعيدان النطاق التعبيري. التوحيد يحافظ على التنشيطات في نطاق رقمي مستقر؛ بدون ذلك، تتكتل الاضطرابات الصغيرة في التدريب إلى تدرجات NaN.

**التوحيد قبل** مقابل **التوحيد بعد**

خيار دقيق لكنه حاسم

طريقتان لتوصيل تطبيع الطبقة في الطبقة الفرعية المتبقية:


ما بعد التطبيع (الورقة الأصلية لعام 2017):

x = LayerNorm(x + Attention(x))

يأتي تطبيع الطبقة بعد إضافة المتبقي. يتم تطبيع التيار المتبقي نفسه في كل طبقة.


قبل التطبيع (المعيار الحديث، المستخدم في ANDREA):

x = x + Attention(LayerNorm(x))

يوجد تطبيع الطبقة قبل الطبقة الفرعية، داخل فرع المتبقي. يبقى تدفق المتبقي غير متطبّع؛ فقط الإدخال إلى الطبقة الفرعية يتم إعادة توقييمه.


لماذا فاز قبل التطبيع

التطبيع اللاحق يتدرب بشكل سيء بدون تسخين معدل التعلم وتعديل دقيق لمعاملات الفرقية. تنفجر التدرجات في الطبقات المبكرة لأن كل تطبيع طبقة يعكر الحالة المتراكمة لتدفق المتبقي. الورقة الأصلية لعام 2017 استخدمت التطبيع اللاحق مع تعديل واسع؛ الأعمال اللاحقة (GPT-2، LLaMA، ANDREA) قامت بتوحيد قبل التطبيع.


تتدرب Pre-norm بثبات. يتراكم تدفق الباقي النظيف عبر جميع الطبقات؛ يتم تطبيع مدخلات الطبقة الفرعية فقط للاستقرار العددي. تُفضل المحولات الحديثة pre-norm افتراضيًا، ويُرث & ANDREA ذلك الخيار.


معادلة الكتلة النهائية

دمج الباقيات، تطبيع الطبقة في موضع pre-norm، وكلا الطبقتين الفرعيتين يعطي كتلة & ANDREA الكاملة:


```python
def block_forward(x):
```
x = x + Attention(LayerNorm(x))   # طبقة الاهتمام
x = x + MLP(LayerNorm(x))         # طبقة MLP
return x

طبقتان فرعيتان، إضافتان متبقتان، تطبيعان طبقيتان (ملاحظة: كل طبقة فرعية لها تطبيع طبقي خاص بها؛ ANDREA-120M لديها 24 تطبيعًا طبقيًا عبر 12 كتلة بالإضافة إلى واحدة نهائية في المخرج، أي 25 إجمالاً). كرر 12 مرة. هذا هو جذع ANDREA-120M.

لماذا يُثبت Pre-Norm التدريب

تستخدم ANDREA pre-norm: `x = x + Attention(LayerNorm(x))`. قارن مع post-norm: `x = LayerNorm(x + Attention(x))`. أعطِ سببًا واحدًا من منظور تدفق التدرج لماذا يتدرب pre-norm بشكل أكثر استقرارًا من post-norm في الكومات العميقة. ارجع إلى التيار المتبقي في إجابتك.

طبقتان خطيتان، تنشيط واحد

ثلاث عمليات

طبقة 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) ≈ 0.5 × (1 + tanh(sqrt(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

تجريبيًا، تصل الـ transformers المدربة باستخدام GELU إلى خسارة أقل من الـ transformers المدربة باستخدام ReLU عند نفس عدد المعاملات. الأمر المهم هو السلاسة حول الصفر: القطع الحاد لـ ReLU عند الصفر ينتج انقطاعات في التدرجات؛ منحنى GELU السلس يوفر تدرجات أنظف للانتشار العكسي.


محرك تدريب ANDREA microgpt_cuda.cu يحتوي على نواة GELU مكتوبة يدويًا لـ CUDA. تستخدم النواة التقريب باستخدام tanh أعلاه؛ وحدات معالجة الرسوميات الحديثة تحتوي على tanh كعملية تعليمة واحدة.

حساب معاملات MLP

ANDREA-120M لديها `d_model=768`، `mlp_dim=3072`، & `n_layer=12`. احسب إجمالي المعاملات في مصفوفات أوزان MLP (`W_1` & `W_2`) عبر جميع 12 كتلة. تجاهل التحيزات. أظهر حساباتك. ثم اذكر ما هي النسبة المئوية من إجمالي معاملات ANDREA-120M البالغ ~120M التي تمثلها (قرب إلى عشرية واحدة).

اثنتا عشرة كتلة تتكون منها 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)               # التركيز + MLP مع بقايا
x = LayerNorm(x)                       # التطبيع النهائي
logits = x · token_embed.T             # أوزان مشتركة لإسقاط الإخراج
return logits

ستة خطوط. الجزء الأساسي يعيش داخل block_forward، الذي يُدعى اثني عشر مرة. البِدْعَات (Embeddings) تبدأ الأنبوب؛ الإزالة المرتبطة للبِدْعَات (نفس المصفوفة المستخدمة للبحث عن الإدخال، معكوسة الاتجاه لإسقاط الإخراج) تنهيه.


العمق كتركيب

كل كتلة تقرأ تيار الباقي (residual stream)، تحسب دلتا، وتضيفها مرة أخرى. بعد اثنتي عشرة مرورية، يحتوي التيار على المساهمات المتراكمة من كل كتلة. داخليًا، تميل الطبقات إلى التخصص:


- الطبقات المبكرة (1-3): أنماط نحوية، هيكل موضعي

- الطبقات الوسطى (4-8): علاقات الكلمات، حدود العبارات

- الطبقات المتأخرة (9-12): المحتوى الدلالي، استرجاع الحقائق


يظهر هذا التخصص من ضغط التدريب، وليس من خيارات التصميم المعماري. نفس تصميم الكتلة المتجانسة ينتج طبقات متخصصة عند تدريبها على اللغة.


إجمالي معاملات الكتلة


المكونلكل كتلةعبر 12 كتلة
إسقاطات الاهتمام (4×W)2.36M28.3M
أوزان MLP (W_1 + W_2)4.72M56.6M
معايير الطبقة (gamma, beta)~3K (تافه)~37K
الإجمالي لكل كتلة~7.1M~85M

85M معلمة في الجذع. أضف ~13M في تضمينات الرموز (8449 مفردات × 768 d_model × 2 للإدخال/الإخراج المرتبط) بالإضافة إلى معيار طبقة نهائي، ويصل عدد معلمات ANDREA-120M إلى حوالي 120M. تصميم الكتلة يمثل ثلثي الإجمالي؛ التضمينات الباقي.

تتبع رمز واحد عبر كتلة واحدة

متجه رمز بـ 768 بعدًا يدخل الكتلة 7 من ANDREA-120M. سلك ما يحدث له داخل الكتلة (في هيكل pre-norm). اذكر: كلا معياري الطبقة، كلا الطبقتين الفرعيتين، كلا الإضافات المتبقية، والشكل النهائي. حدد على الأقل مكانًا واحدًا حيث يبقى التيار المتبقي دون مساس ومكانًا واحدًا حيث يتم تعديله.