تخطَّ إلى المحتوى

🤖 شرح الذكاء الاصطناعي وتعلّم الآلة

Embeddings في NLP

الدرس 42 من 50· ⏱ 6 دقائق قراءة· 🗓 آخر تحديث: ١٩ سبتمبر ٢٠٢٦

بعد فهم 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 في مهام الإنتاج

# مثال: إيجاد مستندات قريبة من استعلام
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) تعلّم ربطًا بين اللغات.

الخطوات التالية

🔍 لمكتبات embeddings حديثة: sentence-transformers، fasttext (يدعم العربية).

شرح Embeddings في NLP — الذكاء الاصطناعي وتعلّم الآلة بالعربي
Embeddings في NLPالذكاء الاصطناعي وتعلّم الآلة بالعربي · The Code Fix

📚 لمزيد من التعمّق في الذكاء الاصطناعي وتعلّم الآلة، راجِع توثيق scikit-learn الرسمي.

هل كان هذا الدرس مفيدًا؟