المستوى: مبتدئ — المقال ده لأي حد سمع عن ChatGPT وعايز يفهم القطعة الأساسية اللي بتخلّيه "يفهم" الجملة. مفيش شرط تعرف رياضيات متقدمة.
آلية الانتباه (Attention): إزاي الذكاء الاصطناعي بيعرف الكلمة بتشير لمين
بعد ما تخلّص المقال ده هتفهم القطعة اللي بنى عليها ChatGPT وClaude وكل نماذج اللغة الحديثة. اسمها Attention، وهي السبب إن النموذج بيربط الكلمات ببعض صح بدل ما يقراها واحدة واحدة.
المشكلة باختصار
خُد الجملة دي: "القطة التعبانة قعدت لأنها كانت نعسانة". لما توصل لكلمة "أنها"، دماغك بيعرف فورًا إنها بتتكلم عن "القطة" مش عن أي حاجة تانية. النموذج لازم يعمل نفس الربط ده. من غير آلية تربط الكلمات بذكاء، النموذج بيتوه في الجمل الطويلة ويغلط في المعنى.
الفكرة بمثال بسيط: الحفلة الصاخبة
تخيّل إنك في حفلة زحمة وصوت عالي. ناس كتير بتتكلم في وقت واحد. فجأة حد في الطرف التاني نطق اسمك. هتلاقي دماغك ركّز على الصوت ده لوحده وفلتر باقي الضوضاء.
ده بالظبط اللي بيعمله الانتباه. لكل كلمة، النموذج بيقرّر: مين الكلمات التانية المهمة ليّا دلوقتي؟ وبيدّي كل كلمة "وزن". الكلمة المهمة بتاخد وزن عالي، والباقي وزن قليل. كلمة "أنها" بتدّي وزن كبير لـ "القطة"، ووزن صغير لباقي الكلمات.
الشرح العلمي: Query و Key و Value
دلوقتي بعد ما وضحت الصورة، نبقى دقيقين. كل كلمة النموذج بيحوّلها لـ 3 حاجات (كلها قوائم أرقام):
- Query (استعلام): يعني "أنا بدوّر على إيه؟".
- Key (مفتاح): يعني "أنا بعرض إيه للكلمات التانية؟".
- Value (قيمة): يعني "المعلومة اللي هقدّمها لو حد ركّز عليّا".
النموذج بيضرب الـ Query بتاع كل كلمة في الـ Key بتاع كل كلمة تانية. الناتج بيقوله قد إيه الكلمتين مرتبطين. بعدها بيمرّر النتايج على دالة اسمها softmax علشان تحوّلها لأوزان مجموعها 1. الأوزان دي هي "الانتباه". أخيرًا بيجمع الـ Values مضروبة في الأوزان دي، فيطلع تمثيل جديد لكل كلمة "شايف" سياقها كله. لأن كل كلمة بتبص على كل الكلمات في نفس الجملة، الآلية دي اسمها Self-Attention.
مثال تنفيذي: انتباه في أقل من 20 سطر
الكود ده بيحسب self-attention بسيط بـ NumPy. انسخه وشغّله زي ما هو:
import numpy as np
def softmax(x):
e = np.exp(x - x.max(axis=-1, keepdims=True))
return e / e.sum(axis=-1, keepdims=True)
# 4 كلمات، كل كلمة متمثّلة بـ 3 أرقام (تمثيل مبسّط)
X = np.array([
[1.0, 0.0, 1.0], # القطة
[0.9, 0.1, 0.8], # التعبانة
[0.2, 1.0, 0.1], # قعدت
[1.0, 0.1, 0.9], # أنها
])
d = X.shape[1]
Q, K, V = X, X, X # في الواقع بتتضرب في مصفوفات متعلَّمة
scores = Q @ K.T / np.sqrt(d) # قد إيه كل كلمة قريبة من التانية
weights = softmax(scores) # أوزان الانتباه (مجموع كل صف = 1)
output = weights @ V # التمثيل الجديد مع السياق
print(np.round(weights, 2))
# صف "أنها" هيدّي أعلى وزن لـ "القطة" لأن تمثيلهم متقارب
لو غيّرت أرقام كلمة "أنها" تبقى قريبة من "قعدت"، هتلاقي الوزن اتنقل. ده بيوريك إن الانتباه مش ثابت، بيتغيّر حسب المحتوى.
ليه ده مهم عمليًا؟ وبأرقام
الآلية دي اتقدّمت في ورقة "Attention Is All You Need" سنة 2017، وهي أساس معمارية الترانسفورمر اللي شغّالة عليها كل النماذج الكبيرة النهارده. مثال واقعي: لو عندك جملة فيها 1000 كلمة، النموذج بيحسب علاقة كل كلمة بكل كلمة، يعني حوالي 1,000,000 عملية مقارنة. وعلشان يمسك أنواع علاقات مختلفة في نفس الوقت (نحوية، معنوية)، بيستخدم كذا "رأس انتباه" بالتوازي، ممكن يوصلوا 96 رأس في النماذج الكبيرة.
الـ trade-off اللي لازم تعرفه
الانتباه الكامل قوي، لكن تكلفته بتكبر بمربّع طول النص. لو ضاعفت عدد الكلمات من 1000 لـ 2000، الحسابات مابتزدش الضعف، بتزيد 4 أضعاف تقريبًا (من مليون لـ 4 مليون). يعني بتكسب فهم دقيق للسياق، بتخسر سرعة وذاكرة كل ما النص يطول. عشان كده ظهرت حلول زي FlashAttention والانتباه المتناثر (Sparse Attention) علشان يخفّفوا التكلفة دي.
متى لا تستخدم الانتباه الكامل
لو بتشتغل على نصوص طويلة جدًا (100 ألف كلمة أو أكتر) في كل استدعاء، الانتباه الكامل هيبقى غالي ومكلّف على الذاكرة. هنا الأنسب حلول انتباه خطّي أو متناثر. وكمان لو مهمتك بسيطة جدًا وبتعتمد على أنماط قصيرة وثابتة، ممكن موديل أخف (زي شبكة CNN صغيرة) يكفّي من غير تعقيد الترانسفورمر. الافتراض هنا إنك بتوازن بين الدقة والتكلفة.
الخطوة التالية
افتح محرّر Python وشغّل الكود اللي فوق. بعدها غيّر أرقام أي كلمة وشوف مصفوفة الأوزان بتتغيّر إزاي. لو فهمت ليه صف كلمة معيّنة بيدّي وزنه لكلمة تانية، تبقى مسكت جوهر الترانسفورمر كله.
المصادر
- Vaswani et al., "Attention Is All You Need", 2017 — arxiv.org/abs/1706.03762 (الورقة الأصلية للترانسفورمر وآلية الانتباه).
- Jay Alammar, "The Illustrated Transformer" — jalammar.github.io/illustrated-transformer (شرح مصوّر لـ Query/Key/Value).
- Dao et al., "FlashAttention", 2022 — arxiv.org/abs/2205.14135 (تخفيض تكلفة الانتباه على الذاكرة).
- توثيق softmax في NumPy/الرياضيات — en.wikipedia.org/wiki/Softmax_function.