SwiGLU
تضرب SwiGLU إسقاطًا منشّطًا بواسطة SiLU في إسقاط خطي ثانٍ، لتشكّل طبقة التغذية الأمامية ذات البوابة داخل Llama وPaLM وQwen. يتضمن الشرح شفرة برمجية.
SwiGLU (وحدة خطية مسوّرة بـSwish) هي صيغة مسوّرة من طبقة التغذية الأمامية في المحوّلات. تسقط متجه كل وحدة رمزية مرتين، وتمرر أحد الإسقاطين عبر SiLU (Swish)، وهي دالة تنشيط، ثم تضرب الإسقاطين عنصرًا بعنصر، وتسقط الناتج مجددًا إلى عرض النموذج: FFN(x) = (SiLU(xW) ⊙ xV)W₂. قدّمها Noam Shazeer في ورقة عام 2020 بعنوان تحسّن صيغ GLU أداء Transformer، وأصبحت منذ ذلك الحين كتلة التغذية الأمامية في النماذج اللغوية الكبيرة (LLMs) مثل PaLM وLlama وMistral وQwen. وعلى عكس ReLU أو GELU، اللتين تعملان على كل قيمة بصورة مستقلة، تحتوي SwiGLU على أوزان متعلَّمة، ما يجعلها طبقة صغيرة قائمة بذاتها.
آلية عمل SwiGLU#
توسّع شبكة التغذية الأمامية القياسية في Transformer (FFN) متجه كل وحدة رمزية باستخدام مصفوفة أوزان واحدة، وتطبّق دالة تنشيط، ثم تضغطه مجددًا باستخدام مصفوفة ثانية. تستبدل SwiGLU المصفوفة الأولى ودالة التنشيط بوحدة خطية مسوّرة (GLU)، لها إسقاطان متوازيان للمدخل نفسه:
- إسقاط البوابة: يمر xW عبر SiLU، أي x · σ(x)، منتجًا قيمًا قريبة من الصفر للمدخلات السالبة بشدة، وقريبة من المدخل للمدخلات الموجبة.
- إسقاط القيمة: يبقى xV خطيًا وينقل المحتوى.
- الضرب عنصرًا بعنصر: يتيح ضرب الإسقاطين للبوابة زيادة كل سمة مخفية أو خفضها أو جعلها قريبة من الصفر بحسب المدخل، ثم يعيد إسقاط الإخراج W₂ الناتج إلى عرض النموذج.
تعود فكرة البوابة إلى GLU التي ابتكرها Dauphin وزملاؤه، إذ استخدموا بوابة سيغمويد في نماذج اللغة الالتفافية المسوّرة عام 2016. اختبرت ورقة Shazeer البنية نفسها مع دوال بوابة مختلفة، وسمّت كل صيغة بحسب دالة التنشيط: تستخدم GLU سيغمويد، وReGLU تستخدم ReLU، وGEGLU تستخدم GELU، وSwiGLU تستخدم Swish، بينما لا تستخدم الطبقة الثنائية الخطية أي دالة تنشيط. وعلى غرار قاعدة T5 البرمجية، تحذف هذه الطبقات حدود الانحياز.
لماذا حلّت SwiGLU محل ReLU وGELU في LLMs#
تستخدم طبقات التغذية الأمامية المسوّرة ثلاث مصفوفات أوزان بدلًا من اثنتين، لذا قلّص Shazeer العرض المخفي بمعامل 2/3 للحفاظ على تساوي عدد المعلمات والحسابات، من 3,072 إلى 2,048 وحدة في نموذج T5-base. وبالحجم نفسه، حققت SwiGLU قيمة الارتباك اللوغاريتمي بلغت 1.636 على البيانات المحجوبة بعد 524,288 خطوة تدريب، مقابل 1.677 لـReLU و1.679 لـGELU، كما حققت متوسط درجات أعلى في معياري GLUE وSuperGLUE لـفهم اللغة. لا تقدم الورقة تفسيرًا نظريًا للتحسن؛ وتعزو خاتمتها نجاح هذه البنى، «مثل كل شيء آخر، إلى العناية الإلهية».
امتد هذا النجاح إلى النماذج الكبيرة. اعتمدت PaLM من Google تقنية SwiGLU عام 2022، واستبدلت LLaMA من Meta دالة ReLU بـSwiGLU عام 2023، مستخدمةً عرضًا مخفيًا قدره 2/3 × 4d مقربًا إلى أعلى مضاعف لـ256، ما يعطي 11,008 وحدات مخفية لنموذج 7B ذي الأبعاد 4,096. وأبقت Llama 2 وLlama 3 وMistral وQwen على هذا التصميم، وفي نماذج مزيج الخبراء (MoE) مثل Mixtral، يكون كل خبير كتلة تغذية أمامية من نوع SwiGLU.
تنفيذ SwiGLU في PyTorch#
ينشئ المقتطف التالي من PyTorch طبقة تغذية أمامية قياسية باستخدام ReLU وطبقة SwiGLU لنموذج ذي 512 بُعدًا، ثم يقارن أحجامهما:
import torch
import torch.nn.functional as F
from torch import nn
d_model = 512
x = torch.randn(4, d_model) # four token vectors
# Standard transformer FFN: two matrices around a 4x wider ReLU hidden layer
relu_ffn = nn.Sequential(nn.Linear(d_model, 2048, bias=False), nn.ReLU(), nn.Linear(2048, d_model, bias=False))
# SwiGLU FFN: three matrices, hidden width cut to about 2/3 of 2048
w_gate = nn.Linear(d_model, 1365, bias=False)
w_value = nn.Linear(d_model, 1365, bias=False)
w_out = nn.Linear(1365, d_model, bias=False)
y = w_out(F.silu(w_gate(x)) * w_value(x)) # (SiLU(xW) * xV) W2
relu_params = sum(p.numel() for p in relu_ffn.parameters())
swiglu_params = sum(m.weight.numel() for m in (w_gate, w_value, w_out))
print(f"ReLU FFN: output {tuple(relu_ffn(x).shape)}, {relu_params:,} parameters")
print(f"SwiGLU FFN: output {tuple(y.shape)}, {swiglu_params:,} parameters")يطبع ReLU FFN: output (4, 512), 2,097,152 parameters وSwiGLU FFN: output (4, 512), 2,096,640 parameters. عند استخدام 1,365 وحدة مخفية، أي نحو 2/3 من 2,048، تحتوي مصفوفات SwiGLU الثلاث على عدد أوزان يكاد يطابق تمامًا ما تحتويه مصفوفتا ReLU، لذا يعود أي اختلاف في الجودة إلى البوابة. تدمج تطبيقات كثيرة مصفوفتَي البوابة والقيمة في إسقاط واحد، وتقسم ناتجه إلى نصفين، ما ينفذ عملية ضرب مصفوفية كبيرة واحدة بدلًا من عمليتين أصغر.
SwiGLU مقابل المصطلحات ذات الصلة#
- SiLU (Swish): SiLU هي الدالة التي تعمل عنصرًا بعنصر داخل البوابة. أما SwiGLU فهي الطبقة المسوّرة الكاملة ذات الإسقاطات الثلاثة.
- GLU وGEGLU: صيغتان شقيقتان تستخدمان بوابة سيغمويد أو GELU. حققت GEGLU نتائج مماثلة لـSwiGLU في اختبارات Shazeer، بقيمة ارتباك لوغاريتمي بلغت 1.633، وتستخدم نماذج Gemma من Google هذه الصيغة.
- الانتباه: ينتج الانتباه أيضًا أوزانًا تعتمد على البيانات، لكنه يمزج المعلومات بين الوحدات الرمزية. أما SwiGLU فتُبوّب السمات داخل كل وحدة رمزية على نحو مستقل.
- نماذج الرؤية: تظهر طبقات التغذية الأمامية المسوّرة أيضًا في نماذج الرؤية والنماذج متعددة الوسائط. يعمل YOLOE، وهو كاشف ذو مفردات مفتوحة طوره باحثون من جامعة Tsinghua ومتاح ضمن حزمة Ultralytics، على تحسين تضمينات نصوص مطالبات الفئات باستخدام كتلة SwiGLU متبقية تُشغّل مرة واحدة لكل استدعاء
set_classes()، ثم تُزال عند التصدير، فلا تضيف أي تكلفة لكل إطار.










