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: соседи → центр.
- Метки берутся из самого текста (самообучение), разметка не нужна.
- Результат — плотные эмбеддинги, где смысловая близость = геометрическая.