Phase 05: NLP: Foundations to Advanced

إضافة الكلمة Word2Vec من الصفر

كلمة هي الشركة التي تبقيها، قم بتدريب شبكة سطحية على تلك الفكرة و الهندسة تسقط.

Type: Build

Languages: Python

Prerequisites: Phase 5 · 02 (BoW + TF-IDF), Phase 3 · 03 (Backpropagation from Scratch)

Time: ~75 minutes

المشكلة

يعرف (تف-إيدف)dogوpuppyإنها كلمات مختلفة. لا يعرف أنها تعني نفس الشيء تقريبا.dogلا يمكن أن تجميع إلى مراجعة حول puppyيمكنك أن تكتب على هذا عن طريق إدراج المختلفات، ولكن هذا يفشل في المصطلحات النادرة، الجارغون المجال، وكل لغة لم تتوقعها.

تريد تمثيلاً حيثdogوpuppyالأرض قريبة من بعضها البعض في الفضاءking - man + womanأرض قريبةqueenحيث تم تدريب عارضةdogيُنقل بعض الإشارات إلىpuppyمجاناً

Word2Vec أعطتنا هذا الفضاء. شبكة عصبية طبقتين، تم تشغيل تريليون رمز، نشرت في عام 2013. الهندسة المعمارية بسيطة بشكل محرج تقريبا. النتائج أعادت تشكيل NLP لمدة عقد.

المفهوم

Distributional hypothesis(الأول، 1957): "تعرف كلمة من خلال الشركة التي تحافظ عليها". إذا ظهرت كلمتان في سياقين متشابهين، فمن المحتمل أن تعني أشياء متشابهة.

Word2Vec يأتي في طعمين، كلاهما يستغل هذه الفكرة.

  • Skip-gram.مع كلمة مركزية، توقع الكلمات المحيطة.cat -> (the, sat, on)مع حجم النافذة 2.
  • CBOW (continuous bag of words).بالنظر إلى الكلمات المحيطة، توقع المركز.(the, sat, on) -> cat. . .

إنّ لغة "سكيپ-جرام" بطيئة في التدريب، ولكنها تتعامل مع الكلمات النادرة بشكل أفضل.

الشبكة لديها طبقة واحدة مخفية بدون عدم وجود خطية. المدخل هو متجه واحد حار على المفردات. الخروج هو softmax على المفردات. بعد التدريب، يمكنك إلقاء الطبقة الخروج. الوزن الطبقة الخفية هي التوابع.

one-hot(center) ── W ──▶ hidden (d-dim) ── W' ──▶ softmax(vocab)
                          ^
                          this is the embedding

الخدعة: "البالغة المكثفة من 100 ألف كلمة" مكلفة للغاية.negative samplingتحويلها إلى مهمة تصنيف ثنائية. توقع "هل ظهرت هذه الكلمة السياقية بالقرب من هذه الكلمة المركزية ، نعم أو لا". قم بعمل عينة من الكلمات السلبية (غير المتواصلة) لكل زوج تدريب بدلاً من حساب softmax على كل المفردات.

بناءها

الخطوة الأولى: أزواج التدريب من مجموعة

pythondef skipgram_pairs(docs, window=2):
    pairs = []
    for doc in docs:
        for i, center in enumerate(doc):
            for j in range(max(0, i - window), min(len(doc), i + window + 1)):
                if i == j:
                    continue
                pairs.append((center, doc[j]))
    return pairs
python>>> skipgram_pairs([["the", "cat", "sat", "on", "mat"]], window=2)
[('the', 'cat'), ('the', 'sat'),
 ('cat', 'the'), ('cat', 'sat'), ('cat', 'on'),
 ('sat', 'the'), ('sat', 'cat'), ('sat', 'on'), ('sat', 'mat'),
 ...]

كل زوج (مركز، سياق) في نافذة هو مثال إيجابي للتدريب.

الخطوة الثانية: إضافة الجداول

-ماثريتينWهو جدول إضافة الكلمة المركزية (الذي تحمله). W'هو جدول الكلمات السياقية (غالبا ما يتم التخلص منها، في بعض الأحيان يتم متوسطها مع W)

pythonimport numpy as np


def init_embeddings(vocab_size, dim, seed=0):
    rng = np.random.default_rng(seed)
    W = rng.normal(0, 0.1, size=(vocab_size, dim))
    W_prime = rng.normal(0, 0.1, size=(vocab_size, dim))
    return W, W_prime

الحجم الكلامي 10k و dim 100 هو واقعي؛ للتدريس، 50 الكلامي x 16 dim يكفي لرؤية الهندسة.

الخطوة الثالثة: هدف أخذ العينات السلبي

لكل زوج إيجابي(center, context)، عينةkتعليمي النموذج حتى النقطة المنتجW[center] · W'[context]هو مرتفع للإيجابيات و منخفض للإيجابيات

pythondef sigmoid(x):
    return 1.0 / (1.0 + np.exp(-np.clip(x, -20, 20)))


def train_pair(W, W_prime, center_idx, context_idx, negative_indices, lr):
    v_c = W[center_idx]
    u_pos = W_prime[context_idx]
    u_negs = W_prime[negative_indices]

    pos_score = sigmoid(v_c @ u_pos)
    neg_scores = sigmoid(u_negs @ v_c)

    grad_center = (pos_score - 1) * u_pos
    for i, u in enumerate(u_negs):
        grad_center += neg_scores[i] * u

    W[context_idx] = W[context_idx]
    W_prime[context_idx] -= lr * (pos_score - 1) * v_c
    for i, neg_idx in enumerate(negative_indices):
        W_prime[neg_idx] -= lr * neg_scores[i] * v_c
    W[center_idx] -= lr * grad_center

الصيغة السحرية: الخسارة اللوجستية على الزوجة الإيجابية (تريد sigmoid بالقرب من 1) بالإضافة إلى الخسارة اللوجستية على الزوجات السلبية (تريد sigmoid بالقرب من 0). تدفق المعدلات إلى الجداولين. المشتق الكامل في الورق الأصلي؛ تمر عبرها مرة واحدة مع قلم ورق إذا كنت تريد أن يلتصق.

الخطوة الرابعة: تدريب على جسم الألعاب

pythondef train(docs, dim=16, window=2, k_neg=5, epochs=100, lr=0.05, seed=0):
    vocab = build_vocab(docs)
    vocab_size = len(vocab)
    rng = np.random.default_rng(seed)
    W, W_prime = init_embeddings(vocab_size, dim, seed=seed)
    pairs = skipgram_pairs(docs, window=window)

    for epoch in range(epochs):
        rng.shuffle(pairs)
        for center, context in pairs:
            c_idx = vocab[center]
            ctx_idx = vocab[context]
            negs = rng.integers(0, vocab_size, size=k_neg)
            negs = [n for n in negs if n != ctx_idx and n != c_idx]
            train_pair(W, W_prime, c_idx, ctx_idx, negs, lr)
    return vocab, W

بعد فترات كافية على مجموعة كبيرة، الكلمات التي تشارك السياقات لها تركيبات مركزية مماثلة. على مجموعة لعبة، ترى التأثير ضعيفا. على مليارات الرموز، ترى ذلك بشكل كبير.

الخطوة 5: خدعة التشابه

pythondef nearest(vocab, W, target_vec, topk=5, exclude=None):
    exclude = exclude or set()
    inv_vocab = {i: w for w, i in vocab.items()}
    norms = np.linalg.norm(W, axis=1, keepdims=True) + 1e-9
    W_norm = W / norms
    target = target_vec / (np.linalg.norm(target_vec) + 1e-9)
    sims = W_norm @ target
    order = np.argsort(-sims)
    out = []
    for i in order:
        if i in exclude:
            continue
        out.append((inv_vocab[i], float(sims[i])))
        if len(out) == topk:
            break
    return out


def analogy(vocab, W, a, b, c, topk=5):
    v = W[vocab[b]] - W[vocab[a]] + W[vocab[c]]
    return nearest(vocab, W, v, topk=topk, exclude={vocab[a], vocab[b], vocab[c]})

على المتجهات المهنية المسبقة لـ 300d Google News:

python>>> analogy(vocab, W, "man", "king", "woman")
[('queen', 0.71), ('monarch', 0.62), ('princess', 0.59), ...]

king - man + woman = queenليس لأن النموذج يعرف ما هو الملكية لأن المتجه(king - man)يحتجز شيئا مثل "ملكي" ، و إضافة ذلك إلى womanأراضي بالقرب من منطقة الملكيات

استخدمها

كتابة Word2Vec من الصفر هو التدريس.gensim. . .

pythonfrom gensim.models import Word2Vec

sentences = [
    ["the", "cat", "sat", "on", "the", "mat"],
    ["the", "dog", "ran", "across", "the", "room"],
]

model = Word2Vec(
    sentences,
    vector_size=100,
    window=5,
    min_count=1,
    sg=1,
    negative=5,
    workers=4,
    epochs=30,
)

print(model.wv["cat"])
print(model.wv.most_similar("cat", topn=3))

للعمل الحقيقي، لا تدربين Word2Vec بنفسك تقريباً. تنزيل متجهات متدربة مسبقاً.

  • GloVe نهج ستانفورد للتعامل مع المصفوفات المشتركة. نقاط التفتيش 50d، 100d، 200d، 300d. تغطية عامة جيدة. الدروس 04 تغطي GloVe بشكل خاص.
  • fastText Word2Vec التوسيع فيسبوك الذي يدمج حرف n-جرام. يتعامل مع الكلمات خارج المفردات عن طريق إعداد كلمات فرعية. الدروس 04.
  • Pretrained Word2Vec on Google News 300d، 3M لغة الكلمات، نشرت 2013. لا يزال يتم تنزيلها يوميا.

عندما Word2Vec لا يزال يفوز في 2026

  • التدريب على الموجات الطبية في ساعة على جهاز كمبيوتر محمول، الحصول على المتجهات المتخصصة لا نموذج عام التقاط.
  • الهندسة المميزة في نمط التشابهgender_vector = mean(man - woman pairs).استغرقها من كلمات أخرى للحصول على محور محايد بين الجنسين . ما زال يستخدم في أبحاث العدالة
  • التفسير. 100d صغير بما فيه الكفاية لتحديد عبر PCA أو t-SNE و في الواقع ترى تشكيل المجموعات.
  • أي مكان يجب أن يبدأ الإستنتاج على الجهاز دون GPU.

عندما يفشل Word2Vec

جدار البوليسمياbankلديه متجه واحدriver bankوfinancial bankشاركهاtable(صفحة بيانات مقابل أثاث) يشاركها. مصنف أسفل نهر لا يمكن التمييز بين الحواس من المتجه.

حلّت التوابع السياقية (ELMo، BERT، كل محول منذ) هذا الأمر عن طريق إنتاج متجه مختلف لكل ظهور لل كلمة بناءً على السياق المحيط. وهذا هو القفز من Word2Vec إلى BERT: من ثابت إلى سياقي. المرحلة 7 تغطي نصف المحول.

مشكلة خارج المفردات هي الفشل الآخر.Zoomer-approvedإذا لم يكن في بيانات التدريب. لا يوجد عكس. fastText يصلح هذا مع تركيب الكلمات الفرعية (المدرس 04).

أرسله

إبقواoutputs/skill-embedding-probe.md:

markdown---
name: embedding-probe
description: Inspect a word2vec model. Run analogies, find neighbors, diagnose quality.
version: 1.0.0
phase: 5
lesson: 03
tags: [nlp, embeddings, debugging]
---

You probe trained word embeddings to verify they are working. Given a `gensim.models.KeyedVectors` object and a vocabulary, you run:

1. Three canonical analogy tests. `king : man :: queen : woman`. `paris : france :: tokyo : japan`. `walking : walked :: swimming : ?`. Report the top-1 result and its cosine.
2. Five nearest-neighbor tests on domain-specific words the user supplies. Print top-5 neighbors with cosines.
3. One symmetry check. `similarity(a, b) == similarity(b, a)` to within float precision.
4. One degenerate check. If any embedding has a norm below 0.01 or above 100, the model has a training bug. Flag it.

Refuse to declare a model good on analogy accuracy alone. Analogy benchmarks are gameable and do not transfer to downstream tasks. Recommend intrinsic + downstream evaluation together.

التمارين

  1. Easy.إدارة حلقة التدريب على مجموعة صغيرة (20 جملة عن القطط والكلاب) بعد 200 دورة، التحققnearest(vocab, W, W[vocab["cat"]])العائداتdogفي أعلى 3، وإلا، قم بتعزيز الفترات أو المفردات.
  2. Medium.إضافة عينة فرعية من الكلمات المتكررة. الكلمات ذات التردد أعلاه 10^-5يتم إلقاءها من أزواج التدريب مع احتمال متناسب مع ترددها.
  3. Hard.قم بتدريب نموذج على مجموعة الأخبار العشرين. احسب محورين للتحيز:he - sheوdoctor - nurse. مشروع كلمات المهنة على كلا المحاور. تقرير المهن التي لديها أكبر فجوة التحيز. هذا هو نوع من السؤال العدالة الباحثين يستخدمون.

الشروط الرئيسية

TermWhat people sayWhat it actually means
Word embeddingWord as a vectorA dense, low-dim (typically 100-300) representation learned from context.
Skip-gramWord2Vec trickPredict context words from center word. Slower than CBOW, better for rare words.
Negative samplingTraining shortcutReplace softmax over full vocab with binary classification against k random words.
Static embeddingOne vector per wordSame vector regardless of context. Fails on polysemy.
Contextual embeddingContext-sensitive vectorDifferent vector for each occurrence based on surrounding words. What transformers produce.
OOVOut of vocabularyWord not seen in training. Word2Vec cannot produce a vector for these.

المزيد من القراءة

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.