الـ Transformers والـ Attention
الاختراع اللي غيّر المجال كله في ٢٠١٧.
المشكلة: الكلمة معناها بيتغير حسب السياق
كلمة «عين» في «عيني وجعاني» غير «عين ماية» غير «عين من أعيان البلد». والضمير في «الحيوان مقدرش يعدي الشارع عشان هو كان تعبان»، «هو» هنا الحيوان مش الشارع. لازم الموديل يبص على الكلمات التانية عشان يفهم كل كلمة.
الـ Attention: كل كلمة بتسأل الباقيين
فكرة الـ Self-Attention: كل كلمة بتبص على كل الكلمات التانية في الجملة، وتقرر تدي لكل واحدة أهمية قد إيه، وبعدين تحدّث معناها بمزيج من معاني الكلمات المهمة. كل ده بيتحسب بضرب مصفوفات ومعاه softmax، يعني حاجات انت عارفها كلها.
Query الكلمة بتسأل: أنا بدور على إيه؟Key كل كلمة بتعلن: أنا عندي إيه؟Value المعلومة اللي الكلمة بتديها لو اتختارت.multi-head كذا attention بالتوازي، كل واحد بيدور على نوع علاقة مختلف.شوف موديل حقيقي بيعمل كده
هنسأل موديل BERT الكلمة «it» بتبص على مين في جملة الحيوان والشارع، في طبقة من طبقاته العميقة:
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 بتتحكم في الاختيار ده: قيمة قليلة يعني يختار الأعلى احتمالاً غالباً (ردود ثابتة ومتوقعة)، وقيمة عالية يعني يدي فرصة لاختيارات أقل احتمالاً (ردود أكتر تنوع وإبداع).