Word2vec: как обучают эмбеддинги (skip-gram и CBOW)

Word2vec превратил дистрибутивную гипотезу в практичный алгоритм: научи маленькую сеть угадывать соседей — и побочным продуктом получишь осмысленные векторы слов.

word2vec — метод обучения эмбеддингов слов: нейросеть учится предсказывать слова по их контексту, а обученные веса и становятся векторами слов.

Гениальная хитрость

Нам не нужны размеченные данные — у нас есть сам текст. Word2vec ставит сети «поддельную» задачу: по слову угадать его соседей (или наоборот). Сама задача никому не нужна. Важно, что для её решения сеть вынуждена выучить хорошие представления слов — и эти представления мы забираем как эмбеддинги. Это пример самообучения (self-supervised): метки берутся из самого текста.

Две архитектуры

Word2vec бывает в двух вариантах, зеркальных друг другу.

Skip-gramпо центральному слову предсказывает слова-соседи
CBOWпо соседям предсказывает центральное слово

Skip-gram лучше работает с редкими словами и небольшими корпусами; CBOW быстрее и хорош на частых словах. Идея в обоих — связать слово с его контекстом.

Обучающие пары skip-gram

Для skip-gram с окном 1 берём каждое слово как «центр» и каждого его непосредственного соседа как «цель». Сгенерируем такие пары — это и есть обучающие примеры.

def skipgram_pairs(sentence, window=1):
    words = sentence.split()
    pairs = []
    for i, center in enumerate(words):
        for j in range(max(0, i - window), min(len(words), i + window + 1)):
            if i != j:
                pairs.append((center, words[j]))
    return pairs

for c, ctx in skipgram_pairs("кот пьёт тёплое молоко", window=1):
    print("центр:", c, "-> предсказать соседа:", ctx)

Вывод:

центр: кот -> предсказать соседа: пьёт
центр: пьёт -> предсказать соседа: кот
центр: пьёт -> предсказать соседа: тёплое
центр: тёплое -> предсказать соседа: пьёт
центр: тёплое -> предсказать соседа: молоко
центр: молоко -> предсказать соседа: тёплое

На таких парах, собранных с миллиардов слов, сеть и учится. Каждое слово получает вектор; обучение двигает векторы так, чтобы по центру было легче угадать соседей. Слова с общими соседями стягиваются вместе.

Что внутри (без формул)

Архитектура предельно простая: один скрытый слой без нелинейности. У каждого слова есть вектор-эмбеддинг. Сеть берёт вектор центрального слова и через веса пытается предсказать, какие слова рядом. Ошибку предсказания используют, чтобы чуть подвинуть векторы. После миллионов шагов векторы устаканиваются так, что отражают смысл. Сам скрытый слой — это и есть таблица эмбеддингов.

Что в итоге получается

  • У каждого слова словаря — плотный вектор (например, 300 чисел).
  • Близкие по смыслу слова имеют близкие векторы (косинус высокий).
  • Векторы можно переиспользовать в любой задаче: подать в классификатор, искать похожие слова, мерить близость документов.

Похожие по духу методы — GloVe (учится на глобальной статистике совстречаемости) и fastText (учитывает подслова, поэтому справляется с незнакомыми словами и формами). Все они дают статичные эмбеддинги: у слова один вектор независимо от предложения — и в этом, как увидим дальше, их ограничение.

Итог

  • Word2vec учит сеть предсказывать соседей — побочный продукт — векторы слов.
  • Skip-gram: центр → соседи; CBOW: соседи → центр.
  • Метки берутся из самого текста (самообучение), разметка не нужна.
  • Результат — плотные эмбеддинги, где смысловая близость = геометрическая.
Проверьте себя
1. В чём разница между skip-gram и CBOW?
ASkip-gram предсказывает соседей по центральному слову, CBOW — центральное слово по соседям
BSkip-gram работает только с числами, CBOW — с текстом
CCBOW не использует нейросеть
DОни дают принципиально разные типы данных
2. Почему word2vec не требует размеченных вручную данных?
AОн вообще не обучается
BМетки (соседние слова) берутся из самого текста — это самообучение
CОн использует готовый словарь синонимов
DОн работает только на размеченных корпусах
3. Что является полезным результатом обучения word2vec?
AТочное предсказание соседних слов
BПлотные векторы (эмбеддинги) слов, отражающие их смысл
CСписок стоп-слов
DМатрица ошибок классификатора
Поддержать проект