Эмбеддинги и word2vec
Как превратить слово в вектор так, чтобы геометрия отражала смысл: близкие по смыслу слова — рядом, а «король − мужчина + женщина» приземляется около «королевы». Эмбеддинги — фундамент семантического поиска, RAG и первый слой любого трансформера.
Интуиция
Модели нужны числа вместо слов. Наивный вариант — one-hot вектор: длина равна размеру словаря, единица стоит на позиции слова, остальное нули. Проблема в том, что такое представление бессмысленно: любые два one-hot вектора ортогональны и равноудалены. «Кот» одинаково далёк и от «пса», и от «карбюратора» — геометрия не знает о смысле ничего.
Выход подсказывает дистрибутивная гипотеза (distributional hypothesis): смысл слова определяется его типичными контекстами. Перефразируя классиков: «скажи мне, с кем рядом слово стоит, — и я скажу, что оно значит». Слова «мяукает», «пушистый» и «кормить» окружают и «кота», и «кошку» — значит, эти слова должны оказаться рядом и в векторном пространстве.
Как работает word2vec
Word2vec (2013) превращает гипотезу в задачу обучения. Два режима:
- Skip-gram — по центральному слову предсказать слова-соседи в окне;
- CBOW (continuous bag of words) — наоборот, по мешку соседей предсказать центральное слово.
Сеть крошечная: слой эмбеддингов и выходной слой. Хитрость в том, что нам не нужны её предсказания — нужен побочный продукт. Если у двух слов похожие контексты, им выгодно иметь близкие векторы: иначе не получится одинаково хорошо предсказывать одних и тех же соседей. Обучение само стягивает похожие слова в плотные кластеры. Итоговый эмбеддинг (embedding) слова — строка обученной матрицы, плотный вектор размерности 100–300 вместо разреженного one-hot на весь словарь.
Похожесть векторов меряют косинусной близостью (cosine similarity) — углом, а не длиной:
1 — векторы сонаправлены, 0 — «ничего общего», −1 — противоположны.
Самое знаменитое свойство — векторная арифметика: король − мужчина + женщина ≈ королева. Направление «мужское → женское» оказывается устойчивым вектором, одинаковым для многих пар. Так же работают «страна → столица», единственное → множественное число и десятки других отношений.
Ниже — игрушечная 2D-карта из 18 слов (настоящие эмбеддинги имеют сотни измерений — это лишь наглядная проекция). Кликайте по словам и запускайте векторную арифметику.
Ограничения и наследники
У word2vec один вектор на слово — и это фундаментальное ограничение. «Ключ» от двери и гаечный «ключ» слипаются в один усреднённый вектор; многозначность (polysemy) статическому эмбеддингу недоступна. Решение принесли контекстные эмбеддинги (contextual embeddings) трансформеров: вектор токена пересчитывается с учётом всего предложения через механизм внимания, поэтому «ключ» в разных фразах получает разные векторы.
Идея эмбеддингов никуда не делась и внутри LLM: первый слой любого трансформера — это таблица эмбеддингов токенов (после токенизации каждый id токена меняется на свою строку этой матрицы). Разница лишь в том, что дальше эти векторы не застывают, а прокачиваются через десятки слоёв внимания, впитывая контекст. Word2vec в этом смысле — «нулевой слой» современных моделей, обученный отдельно.
Сегодня эмбеддинги — рабочая лошадка прода: специальные модели-энкодеры кодируют целые предложения и фрагменты документов в одно пространство. Запрос и документы превращаются в векторы, ближайшие соседи по косинусу — кандидаты в ответ. На этом стоит семантический поиск, дедупликация, кластеризация обращений и весь RAG.
- «Чем плох one-hot?» — все слова равноудалены, смысла в геометрии нет, размерность равна словарю.
- «Почему „кот“ и „пёс“ близки, если рядом в тексте почти не встречаются?» — важна не совместная встречаемость, а похожесть контекстов: соседи у них общие.
- «Skip-gram против CBOW?» — skip-gram предсказывает соседей по слову (лучше для редких слов), CBOW — слово по соседям (быстрее).
- «Чем контекстные эмбеддинги лучше статических?» — многозначные слова получают разные векторы в зависимости от предложения.