CS224N: векторы слов — SVD, word2vec, GloVe и их оценка (конспект)
Пересказ конспектов Stanford CS224N о векторах слов: почему одногорячее кодирование не годится, счётные методы и SVD, word2vec (CBOW и skip-gram), отрицательное сэмплирование и иерархический softmax, GloVe, внутренняя и внешняя оценка, аналогии, обучение классификатора поверх векторов.
1. Зачем словам векторы
Заголовок раздела «1. Зачем словам векторы»Язык — дискретная символьная система: слово «кот» ничем не похоже на «кошку» как строка, хотя по смыслу они близки. Задачи NLP варьируются от простых (проверка орфографии, поиск синонимов) до сложных (машинный перевод, ответы на вопросы, диалог), и почти всем нужно представление слов, в котором видна похожесть.
Простейшее представление — одногорячий вектор (one-hot): словарь из слов, у каждого слова вектор длины с единственной единицей. Беда в том, что любые два разных одногорячих вектора ортогональны: скалярное произведение «отеля» и «мотеля» равно нулю, как и «отеля» и «кошки». Хочется сжать слова в пространство гораздо меньшей размерности , где близкие по смыслу слова лежат рядом. Идея, на которой строятся все методы ниже, — распределительная гипотеза: значение слова определяется контекстами, в которых оно встречается.
2. Счётные методы и SVD
Заголовок раздела «2. Счётные методы и SVD»Матрица «слово — документ». Считаем, сколько раз слово встречается в документе . Матрица получается размером , где — число документов, — огромной.
Матрица совместной встречаемости в окне. Считаем, сколько раз слово встречается в окне заданной ширины вокруг слова . Матрица размером , симметричная. Затем применяем к ней сингулярное разложение и оставляем первых сингулярных векторов: строки (иногда умноженные на сингулярные числа) — -мерные векторы слов.
Небольшой пример на игрушечном корпусе из трёх предложений с окном 1 (наш код):
import numpy as np
corpus = ["I like deep learning .", "I like NLP .", "I enjoy flying ."]words = sorted({w for s in corpus for w in s.split()})idx = {w: i for i, w in enumerate(words)}
# матрица совместной встречаемости с окном 1X = np.zeros((len(words), len(words)))for s in corpus: toks = s.split() for i, w in enumerate(toks): for j in (i - 1, i + 1): if 0 <= j < len(toks): X[idx[w], idx[toks[j]]] += 1
U, S, Vt = np.linalg.svd(X)emb = U[:, :2] * S[:2] # двумерные векторы слов
def cos(a, b): return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))print(cos(emb[idx["like"]], emb[idx["enjoy"]])) # ≈ 1.0print(cos(emb[idx["like"]], emb[idx["NLP"]])) # ≈ 0.02«like» и «enjoy» оказались почти одинаковыми векторами: оба стоят после «I» и перед существительным. Это и есть распределительная гипотеза в действии.
Недостатки, которые перечисляют конспекты: размер матрицы меняется при каждом новом слове; она очень разреженная и огромная (порядка ); SVD стоит квадратично (и больше) по размеру; нужны «костыли» против перекоса частот. Костыли тоже перечислены: выбрасывать служебные слова («the», «he»), взвешивать встречи по расстоянию в окне, заменять счётчики корреляцией Пирсона с обнулением отрицательных значений. Итерационные методы ниже решают эти проблемы изящнее.
3. word2vec: учим векторы, предсказывая контекст
Заголовок раздела «3. word2vec: учим векторы, предсказывая контекст»Вместо того чтобы считать глобальную статистику, заведём модель, параметры которой и есть векторы слов, и будем учить её на простой задаче предсказания по одному окну за раз. Это word2vec (Миколов и др., 2013). У каждого слова два вектора: — когда слово «в центре», и — когда оно «в контексте» (матрицы и размером и ).
Сначала конспект вводит понятие языковой модели: вероятность последовательности слов. Униграммная модель считает слова независимыми, биграммная — зависящими от предыдущего слова. Обе грубы, но подсказывают идею: учить вероятности слов по соседям.
CBOW (Continuous Bag of Words) предсказывает центральное слово по окружающим словам:
- берём векторы контекстных слов и усредняем: ;
- считаем оценки и вероятности ;
- минимизируем кросс-энтропию с истинным центральным словом, то есть .
Skip-gram делает наоборот: по центральному слову предсказывает каждое слово контекста. Ключевое предположение — наивное байесовское: при данном центральном слове слова контекста независимы, так что функция потерь — сумма по окну:
Отрицательное сэмплирование
Заголовок раздела «Отрицательное сэмплирование»Знаменатель softmax — сумма по всему словарю, то есть на каждый шаг. Отрицательное сэмплирование (negative sampling) заменяет многоклассовую задачу бинарной: «пара (центр, контекст) взята из корпуса или подделана?» Для настоящей пары и случайных слов из шумового распределения :
Первый член тянет вверх скалярное произведение настоящей пары, второй — вниз для подделанных. Шумовое распределение — униграммные частоты в степени : это подтягивает редкие слова. Пример из конспекта: вероятность 0,9 становится , а 0,01 — (до перенормировки), то есть редкое слово сэмплируется втрое чаще относительно частого, чем без степени.
Иерархический softmax
Заголовок раздела «Иерархический softmax»Альтернатива — иерархический softmax: слова словаря — листья двоичного дерева, и вероятность слова — произведение вероятностей поворотов «влево/вправо» на пути от корня, где каждый поворот — сигмоида от скалярного произведения вектора внутреннего узла с . Стоимость падает до . Миколов и др. строили дерево Хаффмана: частые слова получают короткие пути. По наблюдениям авторов конспекта, иерархический softmax лучше работает для редких слов, а отрицательное сэмплирование — для частых слов и векторов меньшей размерности.
4. GloVe: глобальная статистика плюс обучение
Заголовок раздела «4. GloVe: глобальная статистика плюс обучение»Счётные методы быстро обучаются и используют всю статистику корпуса, но плохо решают аналогии и перекошены частыми словами. word2vec хорошо решает аналогии, но смотрит на корпус окно за окном и не использует глобальные счётчики напрямую. GloVe (Global Vectors; Пеннингтон, Сокер, Мэннинг, 2014) объединяет оба подхода.
Пусть — сколько раз слово встречается в контексте слова . GloVe учит векторы так, чтобы скалярное произведение приближало логарифм счётчика, и решает задачу взвешенных наименьших квадратов:
где весовая функция гасит вклад редких пар (и равна нулю при ), но не даёт очень частым парам доминировать. Конспект выводит эту цель из функции потерь skip-gram: если сгруппировать одинаковые пары слов, кросс-энтропия становится взвешенной суммой по матрице , а кросс-энтропию заменяют квадратичной ошибкой по логарифмам ненормированных вероятностей, чтобы не считать дорогую нормировку. Итог: модель обучается быстро, масштабируется на огромные корпуса и хорошо работает даже на маленьких корпусах и с небольшими векторами.
5. Как оценивать векторы слов
Заголовок раздела «5. Как оценивать векторы слов»Внутренняя оценка (intrinsic) проверяет векторы на специальной быстрой подзадаче: аналогии, корреляция с человеческими оценками похожести. Она быстрая и помогает понять систему, но полезна, только если коррелирует с реальными задачами. Внешняя оценка (extrinsic) — качество на настоящей задаче (например, распознавание именованных сущностей): честнее, но медленнее, и при неудаче непонятно, виноваты векторы или остальная система.
Аналогии. Для «a : b :: c : ?» ищем слово , максимизирующее косинус между и (слова задачи исключаются). Классический пример — «мужчина : король :: женщина : королева». Подводные камни: аналогии про факты зависят от корпуса (столицы и президенты меняются), а синтаксические («big : bigger :: fast : faster») проверяют другое, чем семантические.
Что показали эксперименты (таблица в конспекте взята из статьи о GloVe). Три главных наблюдения: качество сильно зависит от метода (векторы GloVe размерности 300 на сравнимых корпусах решали аналогии лучше skip-gram, CBOW и вариантов SVD); качество растёт с размером корпуса (аналогию не решить, если слова не встречались при обучении); слишком маленькая размерность не может закодировать нужные различия — чтобы различить «король», «королева», «мужчина» и «женщина», нужны хотя бы два измерения вроде «пол» и «власть». Слишком большая размерность, казалось бы, должна вести к переобучению, но, как показали Инь и Шэнь (статья «On the Dimensionality of Word Embedding»), skip-gram и GloVe к этому устойчивы. Практический совет из конспекта: для GloVe обычно хорошо работает окно в 8 слов вокруг центрального.
Корреляция с людьми. Другой внутренний тест — сравнить косинусы векторов с оценками похожести пар слов, которые дали люди (наборы вроде WordSim353). Отдельная тема — многозначность: одно слово, несколько смыслов. Конспект упоминает подход с несколькими векторами на слово: кластеризуем контексты вхождений и учим по вектору на кластер.
6. Обучение поверх векторов: внешние задачи
Заголовок раздела «6. Обучение поверх векторов: внешние задачи»Типичная постановка: классифицировать слова или окна (например, тональность или тип сущности) по векторам слов. Конспект обсуждает:
- Переобучать ли векторы. Если обучающая выборка задачи маленькая, лучше не трогать предобученные векторы: дообучение сдвинет только слова из выборки, и похожие слова, которых в ней не было, «разъедутся». Если выборка большая — дообучение помогает.
- Softmax-классификатор с регуляризацией поверх векторов (а при дообучении векторов число параметров резко растёт и переобучение становится серьёзнее).
- Оконную классификацию: слово классифицируется вместе с соседями — вектор окна склеивается из векторов слов, потому что значение слова зависит от контекста.
- Нелинейные классификаторы (нейросети), которые могут провести более сложную границу, чем линейный softmax, — переход к следующей лекции о нейросетях.
Что из этого живо в 2026 году
Заголовок раздела «Что из этого живо в 2026 году»Статические векторы word2vec и GloVe в больших моделях заменены контекстными представлениями трансформеров и обучаемыми слоями эмбеддингов. Но идеи никуда не делись: отрицательное сэмплирование живёт в контрастивном обучении (CLIP, поисковые эмбеддинги для RAG), распределительная гипотеза — в самом предобучении LLM, а аналогии и смещения (bias) в векторах — в работах по интерпретируемости и этике. Подробнее — в уроке 4.3.1 «Векторы слов».
Словарик
Заголовок раздела «Словарик»| EN | RU |
|---|---|
| one-hot vector | одногорячий вектор |
| distributional hypothesis | распределительная гипотеза |
| co-occurrence matrix | матрица совместной встречаемости |
| CBOW, skip-gram | «непрерывный мешок слов», skip-gram |
| negative sampling, noise distribution | отрицательное сэмплирование, шумовое распределение |
| hierarchical softmax, Huffman tree | иерархический softmax, дерево Хаффмана |
| intrinsic vs extrinsic evaluation | внутренняя и внешняя оценка |
| word analogy | аналогия слов |
| window classification | оконная классификация |