الدرس 3 من 9

الـ Transformers والـ Attention

الاختراع اللي غيّر المجال كله في ٢٠١٧.

المشكلة: الكلمة معناها بيتغير حسب السياق

كلمة «عين» في «عيني وجعاني» غير «عين ماية» غير «عين من أعيان البلد». والضمير في «الحيوان مقدرش يعدي الشارع عشان هو كان تعبان»، «هو» هنا الحيوان مش الشارع. لازم الموديل يبص على الكلمات التانية عشان يفهم كل كلمة.

الـ Attention: كل كلمة بتسأل الباقيين

فكرة الـ Self-Attention: كل كلمة بتبص على كل الكلمات التانية في الجملة، وتقرر تدي لكل واحدة أهمية قد إيه، وبعدين تحدّث معناها بمزيج من معاني الكلمات المهمة. كل ده بيتحسب بضرب مصفوفات ومعاه softmax، يعني حاجات انت عارفها كلها.

Attention(Q, K, V) = softmax(Q·Kᵀ / √d) · VQ سؤال كل كلمة، و K بطاقة تعريف كل كلمة، و V المعلومة اللي بتقدمها
Query الكلمة بتسأل: أنا بدور على إيه؟
Key كل كلمة بتعلن: أنا عندي إيه؟
Value المعلومة اللي الكلمة بتديها لو اتختارت.
multi-head كذا attention بالتوازي، كل واحد بيدور على نوع علاقة مختلف.

شوف موديل حقيقي بيعمل كده

هنسأل موديل BERT الكلمة «it» بتبص على مين في جملة الحيوان والشارع، في طبقة من طبقاته العميقة:

attention.py
import matplotlib.pyplot as plt
from transformers import AutoTokenizer, AutoModel

tok = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModel.from_pretrained("bert-base-uncased", output_attentions=True)

sentence = "The animal did not cross the street because it was too tired."
inputs = tok(sentence, return_tensors="pt")
attn = model(**inputs).attentions[9][0].mean(dim=0)   # layer 10, averaged over heads

tokens = tok.convert_ids_to_tokens(inputs["input_ids"][0])
it = tokens.index("it")
words = tokens[1:-1]                                   # drop [CLS] and [SEP]
weights = attn[it, 1:-1].detach()
weights = weights / weights.sum()

plt.figure(figsize=(8, 3))
colors = ["#E0A800" if w == "animal" else "#3776AB" for w in words]
plt.bar(range(len(words)), weights, color=colors)
plt.xticks(range(len(words)), words, rotation=45)
plt.title('Where does "it" look? (BERT, layer 10)')
plt.tight_layout()
plt.show()

أعلى عمود هو «animal»: الموديل ربط الضمير بالحيوان مش بالشارع. محدش علّمه قواعد النحو، اتعلمها من قراية كميات ضخمة من النصوص. (مش كل طبقة ولا كل head بتعمل كده، كل واحدة بتتخصص في نوع علاقة.)

نوعين أساسيين من الـ Transformers

النوعبيعمل إيهأمثلة
Encoderبيقرا النص كله مرة واحدة ويفهمهBERT، وموديلات الـ embeddings والتصنيف
Decoderبيولّد نص كلمة ورا كلمةClaude و GPT و Llama

الـ LLM بيولّد إزاي؟

موديل اللغة الكبير (LLM) في الأساس بيعمل حاجة واحدة: يتوقع الـ token الجاي. بياخد كل اللي اتكتب، يطلع احتمال لكل token في قاموسه (بالـ softmax من المرحلة ٣)، يختار واحد، يضيفه، ويكرر. الرد الطويل اللي بتقراه اتكتب كده، token ورا token.

والـ temperature بتتحكم في الاختيار ده: قيمة قليلة يعني يختار الأعلى احتمالاً غالباً (ردود ثابتة ومتوقعة)، وقيمة عالية يعني يدي فرصة لاختيارات أقل احتمالاً (ردود أكتر تنوع وإبداع).

الدرس اللي فات