المحولات والاهتمام الذاتي
“كل كلمة تتحدث مباشرة إلى كل كلمة أخرى — الاهتمام بالجملة بأكملها دفعةً واحدة”
غوص عميق في آليات الانتباه: الضرب النقطي المُحجَّم والانتباه متعدد الرؤوس والترميز الموضعي وBERT encoder مقابل GPT decoder.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
الضرب النقطي المقيَّس
الانتباه الأساسي: مدى ارتباط كل استعلام بكل مفتاح — القياس بـ√d_k للاستقرار
متعدد الرؤوس
H دوال انتباه متوازية مدمجة ومُسقَطة — كل رأس يلتقط جانباً مختلفاً من العلاقات
الترميز الموضعي
يُضخِّ معلومات موضع الرمز (بلا تكرار) — أنماط sin/cos بترددات مختلفة
الطبقة الفرعية FFN
التغذية الأمامية الموضعية بعد كل كتلة انتباه — تُسقِط لبُعد أكبر ثم تُقلِّص
▶محاكاة تفاعلية
⬡هندسة النموذج
المشكلة في الشبكات التكررية التي حلّها المحوّل
تعالج RNNs التسلسلات رمزاً بعد رمز — لفهم العلاقة بين الكلمة 1 والكلمة 500، يجب أن تتدفق المعلومات عبر 499 حالة وسيطة. تحل المحولات هذا بالسماح لأي موضع بالانتباه مباشرةً لأي موضع آخر في خطوة واحدة. هذا المسار المباشر مع الحساب المتوازي هو سبب استبدال RNNs بالمحولات في كل شيء تقريباً.
الانتباه كاستعلام ناعم لقاعدة البيانات
فكر في الانتباه كمخزن قيمة-مفتاح قابل للتفاضل. لديك استعلام (ما تبحث عنه)، مفاتيح (واصفات كل ذاكرة)، وقيم (المحتوى الفعلي). يحسب الانتباه التشابه بين الاستعلام وجميع المفاتيح، يُطبّق softmax، ثم يُعيد مجموعاً موزوناً للقيم.
التحجيم بـ√d_k يمنع الضروب النقطية من الكبر (مما يجعل softmax حاداً جداً، مما يقتل تدفق التدرج عبر التوزيع).
الانتباه متعدد الرؤوس: لماذا رؤوس متعددة؟
رأس انتباه واحد يمكنه الانتباه وفق معيار واحد فقط (مثل التوافق النحوي). الرؤوس المتعددة تتعلم أنماط انتباه مختلفة في آنٍ واحد: الرأس 1 للنحو، الرأس 2 للدلالة، الرأس 3 للإحالة. كل رأس يُسقط Q وK وV إلى فضاء فرعي أقل بُعداً.
BERT مقابل GPT: المشفر مقابل المفكك
BERT يستخدم انتباهاً ثنائي الاتجاه — كل رمز ينتبه لجميع الرموز الأخرى. مثالي للفهم (التصنيف، NER) لكن لا يستطيع توليد النص من اليسار لليمين. GPT يستخدم انتباهاً مقنعاً (سببياً) — كل رمز ينتبه للرموز السابقة فقط. يُتيح التوليد الذاتي التراجعي.
كتلة مشفر المحوّل
تضمينات الإدخال E = تضمين_رمز + ترميز_موضعي
الانتباه الذاتي متعدد الرؤوس: Q=EW_Q، K=EW_K، V=EW_V
Attention(Q,K,V) = softmax(QKᵀ/√d_k)V
إضافة وتطبيع: x₁ = NormLayer(E + Attention(E))
شبكة التغذية الأمامية: FFN(x₁) = ReLU(x₁W₁ + b₁)W₂ + b₂
إضافة وتطبيع: x₂ = NormLayer(x₁ + FFN(x₁))
تكرار لـL طبقة
انتباه الضرب النقطي المعياري من الصفر
import torch import torch.nn.functional as F import math def scaled_dot_product_attention(Q, K, V, mask=None): class="tok-str">""" Q, K, V: (batch, heads, seq_len, d_k) """ d_k = Q.shape[-class="tok-num">1] class="tok-comment"># Attention scores scores = torch.matmul(Q, K.transpose(-class="tok-num">2, -class="tok-num">1)) / math.sqrt(d_k) class="tok-comment"># Causal mask (GPT-style) if mask is not None: scores = scores.masked_fill(mask == class="tok-num">0, float(class="tok-str">'-inf')) class="tok-comment"># Softmax over key dimension attn_weights = F.softmax(scores, dim=-class="tok-num">1) class="tok-comment"># Weighted sum of values return torch.matmul(attn_weights, V), attn_weights class MultiHeadAttention(torch.nn.Module): def __init__(self, d_model, n_heads): super().__init__() self.d_k = d_model // n_heads self.n_heads = n_heads self.W_q = torch.nn.Linear(d_model, d_model) self.W_k = torch.nn.Linear(d_model, d_model) self.W_v = torch.nn.Linear(d_model, d_model) self.W_o = torch.nn.Linear(d_model, d_model) def forward(self, Q, K, V, mask=None): B, T, D = Q.shape class="tok-comment"># Project + split into heads Q = self.W_q(Q).view(B, T, self.n_heads, self.d_k).transpose(class="tok-num">1, class="tok-num">2) K = self.W_k(K).view(B, T, self.n_heads, self.d_k).transpose(class="tok-num">1, class="tok-num">2) V = self.W_v(V).view(B, T, self.n_heads, self.d_k).transpose(class="tok-num">1, class="tok-num">2) x, weights = scaled_dot_product_attention(Q, K, V, mask) class="tok-comment"># Concat heads + project x = x.transpose(class="tok-num">1, class="tok-num">2).contiguous().view(B, T, D) return self.W_o(x), weights
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.