المستوى: متوسط. مناسب لو عندك أساسيات برمجة وسمعت عن نماذج اللغة، حتى لو ما اشتغلتش على المحوّلات (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])
المخرجات:
القطة [0.42, 0.16, 0.42]
جريت [0.02, 0.87, 0.12]
هي [0.16, 0.42, 0.42]
ركّز على صف كلمة "هي": الأوزان [0.16, 0.42, 0.42]. الكلمة وزّعت انتباهها، وأعطت نصيب أكبر لكلمة "جريت" ولنفسها، وأقل لكلمة "القطة". لو غيّرت الأرقام اللي بتمثّل الكلمات، هتلاقي مصفوفة الأوزان بتتغيّر معاها. دي نفس الفكرة اللي بتشتغل داخل GPT، بس بمتجهات طولها مئات الأرقام بدل 4.
سيناريو واقعي ورقم يهمّك
الجمال في الانتباه إن كل كلمة بتشوف كل الكلمات. المشكلة إن ده مكلّف. لو عندك n كلمة، النموذج بيحسب n×n علاقة، يعني التعقيد O(n²). الأثر العملي: لو ضاعفت طول السياق من 1000 إلى 2000 كلمة، حسبة الانتباه ما بتزيدش الضعف، بتزيد 4 أضعاف. ولو رحت لـ 4000 كلمة بقت 16 ضعف.
عشان كده لما بتشوف نموذج بيقول "نافذة سياق 128 ألف توكن"، ده مش رقم مجاني. ده بيترجم لذاكرة وحساب بيكبروا تربيعيًا مع الطول. الافتراض هنا إننا بنتكلم عن الانتباه الكامل (full attention) زي ما في الورقة الأصلية، اللي كان فيها النموذج الأساسي بأبعاد d_model=512 و8 رؤوس انتباه.
الـ Trade-offs: بتكسب إيه وبتخسر إيه
الانتباه الكامل بيديك أعلى جودة، لأن أي كلمة تقدر توصل لأي كلمة تانية على طول من غير ما المعلومة تضيع في الطريق. ده اللي بيخلّي النماذج تفهم علاقات بعيدة داخل النص. الثمن: تكلفة تربيعية في الحساب والذاكرة. البديل هو الانتباه المتفرّق (sparse) أو الخطّي (linear) اللي بينزّل التكلفة، بس بيضحّي بجزء من قدرة النموذج على ربط كل شيء بكل شيء. القاعدة: كل ما قرّبت من الانتباه الكامل، الجودة أعلى والتكلفة أعلى.
متى لا تستخدم الانتباه الكامل
لو بتشتغل على تسلسلات طويلة جدًا (مئات الآلاف من التوكنز)، الانتباه الكامل هيخنقك في الذاكرة. هنا الأنسب انتباه متفرّق، أو تقسيم النص واسترجاع الأجزاء المهمة فقط (RAG). وكمان لو مهمتك بسيطة وصغيرة، زي تصنيف جملة قصيرة، نموذج أبسط ممكن يوصّلك لنفس النتيجة بتكلفة أقل بكتير. الانتباه أداة قوية، مش حل لكل مشكلة.
الخطوة التالية
افتح Google Colab، انسخ السكربت اللي فوق وشغّله. بعدين غيّر أرقام الكلمة التالتة (هي) لأرقام أقرب لكلمة "القطة"، وشوف وزن الانتباه بينهم بيزيد إزاي. لو الأوزان اتغيّرت زي ما هو متوقّع، يبقى فهمت الفكرة من جوّاها. لو مش واضحة، ابعتلي مصفوفة المخرجات وهنفكّكها سوا.
المصادر
- Vaswani et al., "Attention Is All You Need", 2017 — arxiv.org/abs/1706.03762
- النسخة الكاملة (NeurIPS) — papers.neurips.cc
- Jay Alammar, "The Illustrated Transformer" — jalammar.github.io/illustrated-transformer
- تحليل تعقيد الانتباه الذاتي O(n²) — apxml.com