بعد فهم Tokenization، نأتي لأهمّ مفهوم في تمثيل النصوص للنماذج: Embedding — تحويل كل token إلى متجه رقمي كثيف يحمل معنى.
لماذا نحتاج Embeddings؟
النماذج الرياضية لا تفهم النصوص، بل تفهم الأرقام. السؤال: أيّ أرقام؟
المحاولة 1: One-hot encoding
import numpy as np
vocab = {"king": 0, "queen": 1, "man": 2, "woman": 3, "apple": 4}
vocab_size = len(vocab)
def one_hot(word, vocab, vocab_size):
idx = vocab[word]
vec = np.zeros(vocab_size)
vec[idx] = 1.0
return vec
print(one_hot("king", vocab, vocab_size))
# [1. 0. 0. 0. 0.]
print(one_hot("queen", vocab, vocab_size))
# [0. 1. 0. 0. 0.]
المشاكل:
print(np.dot(one_hot("king", vocab, vocab_size),
one_hot("queen", vocab, vocab_size)))
# 0.0 ← لا يحمل أي معلومات عن التشابه
print(np.dot(one_hot("king", vocab, vocab_size),
one_hot("apple", vocab, vocab_size)))
# 0.0 ← نفس النتيجة!
عيوب one-hot:
- لا يوجد معنى:
"king"و"queen"متشابهتان دلاليًا لكنهما متعامدتان رياضيًا. - Sparse وكبير: vocab بحجم 100k = متجهات بطول 100k، 99.99% أصفار.
- لا تعميم: كل كلمة وحدة مستقلة.
المحاولة 2: Dense Embedding
one-hot → [0, 0, 1, 0, 0, 0, ...] متجه متفرّق 100k بُعد
embedding → [0.42, -0.15, 0.88, 0.31, ...] متجه كثيف ~100 بُعد
Embedding = متجه كثيف ذو أبعاد قليلة (مثل 50–1024) يمثّل token في فضاء يُحفظ فيه التشابه الدلالي.
Cosine Similarity — قياس التشابه
Cosine similarity يقيس الزاوية بين متجهين (لا الحجم):
cos(a, b) = (a · b) / (||a|| × ||b||)
- = 1: متطابقان.
- = 0: متعامدان.
- = −1: متعاكسان.
import numpy as np
def cos_sim(a, b):
a, b = np.array(a, dtype=float), np.array(b, dtype=float)
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
# متجهات تعليمية (3 أبعاد للوضوح)
king = [1.0, 1.0, 0.0]
queen = [0.9, 0.95, 0.05]
man = [0.8, 0.0, 0.6]
woman = [0.75, 0.05, 0.65]
apple = [0.0, 0.1, 0.1]
print(f"king-queen = {cos_sim(king, queen):.3f}") # 0.999
print(f"man-woman = {cos_sim(man, woman):.3f}") # 0.996
print(f"king-man = {cos_sim(king, man):.3f}") # 0.566
print(f"queen-woman = {cos_sim(queen, woman):.3f}") # 0.580
print(f"king-apple = {cos_sim(king, apple):.3f}") # 0.500
print(f"man-apple = {cos_sim(man, apple):.3f}") # 0.424
قراءة النتائج (في فضاء toy هذا فقط):
"king"قريب جدًا من"queen"(كلاهما ملوك)."man"قريب من"woman"(جنس)."king"و"man"أقل تشابهًا."king"و"apple"أقل من التشابه بين ملك-ملكة.
تنبيه مهمّ: هذه متجهات تعليمية صغيرة (3 أبعاد)، والمقارنة بينها توضيحية. لا توجد عتبة عالمية لـ cosine similarity تحدّد "متشابه" أو "غير متشابه". عتبة التشابه تعتمد على:
- فضاء الـ embedding نفسه (بُعد، corpus، النموذج).
- المهمة (بحث، تصنيف، تجميع).
- توزيع نقاط البيانات في فضاء النموذج.
في فضاء toy هذا، قيمة مثل
0.50أقلّ من قيمة0.99على نفس الزوج المرتبط — لكن لا تنقل هذا الاستنتاج إلى فضاء embedding حقيقي دون قياس.
متجهات Embedding في PyTorch
nn.Embedding = جدول بحث يربط كل index token بمتجه متعلّم:
import torch
import torch.nn as nn
vocab_size = 10000
embedding_dim = 64
# أنشئ embedding layer — الأوزان تبدأ عشوائية
embed = nn.Embedding(num_embeddings=vocab_size, embedding_dim=embedding_dim)
# 5 token indices
token_ids = torch.tensor([3, 17, 42, 8, 99])
vectors = embed(token_ids)
print(vectors.shape) # torch.Size([5, 64])
print(vectors[0, :5]) # أوّل 5 أبعاد من تمثيل token 3
كيف تتعلّم الـ Embeddings؟
في Wave 4 تعلّمنا أن nn.Embedding تُسجَّل تلقائيًا كـ Parameter. خلال التدريب:
1. النموذج يستخدم embedding في مهمة (مثل تصنيف).
2. الخسارة تحسب كم أخطأ.
3. التدرّجات تتدفّق عكسيًا إلى embedding weights.
4. الأوزان تتحدّث لتُقلّل الخسارة.
5. مع الوقت، الأوزان تتعلّم أن tokens متشابهة (تظهر في سياقات متشابهة)
تنتهي بمتجهات قريبة.
النتيجة: ليس بالضرورة أن النموذج يُبرمج قواعد "king - man + woman ≈ queen"، لكن في الواقع تظهر أنماط مذهلة في embeddings المدربة على corpus كبير.
Word2Vec — حدسيًا (2013)
Word2Vec = خوارزمية كلاسيكية شهيرة لتعلّم word embeddings. الفكرة:
الكلمات التي تظهر في سياقات متشابهة
لها معانٍ متشابهة
طريقتان:
| الطريقة | المبدأ |
|---|---|
| CBOW | توقع الكلمة من السياق المحيط |
| Skip-gram | توقع السياق المحيط من الكلمة |
مثال Skip-gram:
الجملة: "the cat sat on the mat"
عند تمثيل "sat"، السياق المتوقع:
[the, cat, on, the, mat]
بعد تدريب Skip-gram على corpus كبير:
# vector("king") - vector("man") + vector("woman") ≈ vector("queen")
# (هذا تقريب، وليس قاعدة مطلقة)
ملاحظة تاريخية: Word2Vec شهير لأنه أوّل من أظهر هذا النوع من التشابه الدلالي بوضوح. لكن في 2026 لا يُدرَّب Word2Vec مباشرة في الإنتاج — استخدم BERT/Sentence-Transformers بدلاً منه.
Embeddings الحديثة
نماذج Transformer الحديثة (مثل BERT، Sentence-BERT) تُنتج contextual embeddings:
embedding("bank") في "river bank" ≠ embedding("bank") في "bank account"
نفس الكلمة لها متجه مختلف حسب السياق. هذه embeddings أقوى بكثير من Word2Vec.
تفاصيل self-attention و Q/K/V موجودة في معمارية Transformers. هنا نقول فقط: embeddings تصبح مدخلًا لطبقات attention لاحقة.
Embeddings في مهام الإنتاج
1. البحث الدلالي (Semantic Search)
# مثال: إيجاد مستندات قريبة من استعلام
query_embedding = model.encode("ما هو التعلّم العميق؟")
doc_embeddings = model.encode(docs)
# cosine similarity بين query وكل doc
scores = util.cos_sim(query_embedding, doc_embeddings)
2. RAG (Retrieval-Augmented Generation)
استعلام → embedding → بحث في vector DB → استرجاع context → LLM
Wave 7 ستغطّي RAG بالتفصيل.
3. التوصية (Recommendation)
# تشفير user/item في embedding space متقارب
user_vec = embed(user_id)
item_vec = embed(item_id)
score = user_vec @ item_vec # dot product = preference
كيف تستخدم Embeddings في Wave 5
في مشروع تحليل المشاعر، سنستخدم TF-IDF (وليس dense embeddings) لأنه:
- ✅ سريع وخفيف.
- ✅ يعمل جيدًا مع بيانات تدريب صغيرة.
- ✅ مفاهيم واضحة (word-level).
- ✅ يربط مباشرة بـ TF-IDF + Logistic Regression في Wave 3.
Dense embeddings الحديثة تتفوّق عادةً، لكن لمشروع تعليمي على بيانات محدودة، TF-IDF خيار ممتاز.
أخطاء شائعة
- "embedding يحفظ المعنى الكامل": يحفظ جوانب من المعنى المُهمّة للمهمة المُدرَّب عليها.
- "cosine similarity = المسافة": ليسا نفس الشيء. cosine يقيس الزاوية، المسافة (Euclidean) تحسّ بالحجم.
- "كلمات متشابهة معنويًا لها cosine عالية": يعتمد على corpus والـ tokenizer. embeddings سيّئة التدريب قد لا تعكس ذلك.
- "Embedding dimension أكبر = أفضل": حتى حدّ. بُعد كبير جدًا مع بيانات قليلة → overfitting.
- "تطبيع embedding مفيد دائمًا": نعم غالبًا، لكن يجب اختباره على مهمتك.
- "Embedding عربي ≠ Embedding إنجليزي": في نموذج واحد، عادةً تُستخدم تمثيلات مختلفة لكل لغة. النماذج متعددة اللغات (mBERT, XLM-R) تعلّم ربطًا بين اللغات.
الخطوات التالية
- Sentiment Analysis — تطبيق شامل على مهام NLP.
- معمارية Transformers — كيف تُستخدم embeddings داخل attention.
- مشروع تحليل المشاعر — TF-IDF + Logistic Regression.
- Logistic Regression — المصنّف الذي سنستخدمه.
🔍 لمكتبات embeddings حديثة:
sentence-transformers،fasttext(يدعم العربية).