المستوى: متوسط. مناسب لو عندك أساسيات برمجة وسمعت عن نماذج اللغة، حتى لو ما اشتغلتش على المحوّلات (Transformers) قبل كده. المصطلحات الصعبة هنشرحها بمثال بسيط الأول ثم علميًا.
لو قريت المقال ده للآخر، هتفهم بالظبط إزاي النموذج بيعرف إن كلمة "هي" في جملة بتتكلم عن "القطة" مش عن "الحديقة". دي وظيفة آلية الانتباه الذاتي، وهي قلب أي نموذج لغة حديث زي GPT وClaude.
آلية الانتباه الذاتي (Self-Attention): إزاي النموذج بيربط الكلمات ببعضها
المشكلة باختصار
الكلمة لوحدها معناها ناقص. "بنك" ممكن تكون مؤسسة مالية أو ضفة نهر، والفرق بيتحدد من الكلام حواليها. النماذج القديمة كانت بتقرأ الجملة كلمة كلمة بالترتيب، فبتنسى أول الجملة لما توصل لآخرها. المحوّلات حلّت ده بإن كل كلمة تبص على كل الكلمات التانية في نفس اللحظة، وتقرّر مين المهم ليها. الآلية دي اسمها الانتباه الذاتي.
المثال البسيط الأول: حفلة مزدحمة
تخيّل إنك في حفلة، وفيه 20 شخص بيتكلموا في نفس الوقت. انت مش بتسمع الكل بنفس الدرجة. ودنك بتركّز على الشخص اللي بيقول اسمك، وبتتجاهل الباقي شوية. دماغك بيوزّع "انتباه" أكتر على المصدر المهم، وأقل على الضوضاء.
آلية الانتباه الذاتي بتعمل نفس الحاجة بالظبط. كل كلمة في الجملة بتسأل باقي الكلمات سؤال واحد: "انت قد إيه مهم بالنسبة لمعناي؟" الكلمات المهمة بتاخد وزن كبير، والبعيدة عن المعنى بتاخد وزن صغير. النتيجة إن كل كلمة بتفهم نفسها في سياق الجملة كلها.
المفهوم علميًا: ثلاثية Query وKey وValue
دلوقتي بعد ما فهمنا الحدس، نبقى دقيقين. كل كلمة بتتحوّل لثلاث نسخ رقمية (متجهات):
- Query (الاستعلام): السؤال اللي الكلمة بتدور بيه، يعني "أنا محتاجة إيه من السياق؟".
- Key (المفتاح): الإعلان اللي كل كلمة بتقوله عن نفسها، يعني "أنا بقدّم المعلومة دي".
- Value (القيمة): المحتوى الفعلي اللي هيتنقل لو الكلمة دي طلعت مهمة.
النموذج بيضرب Query كل كلمة في Key كل الكلمات (حاصل ضرب نقطي) علشان يقيس التشابه. بعدين بيقسم على جذر بُعد المفتاح (√dₖ) علشان الأرقام ما تكبرش أوي وتبوّظ الحساب، وبعدين بيمرّر الناتج على دالة softmax اللي بتحوّله لأوزان مجموعها 1. الأوزان دي بتتضرب في الـ Value، فيطلع تمثيل جديد لكل كلمة محمّل بسياقها. المعادلة الرسمية من ورقة "Attention Is All You Need":
Attention(Q, K, V) = softmax( Q·Kᵀ / √dₖ ) · V
مثال تنفيذي: احسب الانتباه بنفسك
السكربت ده بيحسب الانتباه الذاتي لجملة من 3 كلمات، بتمثيل مبسّط لكل كلمة بأربع أرقام. للتبسيط بنستخدم نفس المتجه كـ Query وKey وValue:
import math
def softmax(row):
m = max(row)
e = [math.exp(x - m) for x in row]
s = sum(e)
return [x / s for x in e]
# 3 كلمات: (القطة) (جريت) (هي) — كل كلمة متجه من 4 أرقام
X = [[1, 0, 1, 0],
[0, 2, 0, 2],
[1, 1, 1, 1]]
d_k = 4
labels = ["القطة", "جريت", "هي"]
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
for i, q in enumerate(X):
scores = [dot(q, k) / math.sqrt(d_k) for k in X] # تشابه مع كل كلمة
w = softmax(scores) # أوزان الانتباه
print(labels[i], [round(v, 2) for v in w])