DeepLearning Blog

Word Embeddings

Published Feb. 18, 2026, 1:18 p.m. by a.glazyrin

Векторные Представления Слов (Word Embeddings)

То, как модели машинного обучения "видят" данные, отличается от того, как это делаем мы (люди). Например, мы легко можем понять текст "Я увидел кота", но наши модели не могут — им нужны векторы признаков. Такие векторы, или эмбеддинги слов (word embeddings) , являются представлениями слов, которые можно подавать на вход вашей модели.

Как это работает: Таблица поиска (Look-up Table / Словарь)

На практике у вас есть словарь допустимых слов; вы выбираете этот словарь заранее. Для каждого слова из словаря таблица поиска содержит его эмбеддинг. Этот эмбеддинг можно найти, используя индекс слова в словаре (т.е. вы ищете эмбеддинг в таблице по индексу слова).

Чтобы учесть неизвестные слова (те, которых нет в словаре), обычно словарь содержит специальный токен UNK. В качестве альтернативы, неизвестные токены можно игнорировать или присваивать им нулевой вектор.

Главный вопрос этой лекции: как мы получаем эти векторы слов?

Представление в виде дискретных символов: One-hot векторы

Самое простое, что можно сделать — представить слова в виде one-hot векторов: для i-го слова в словаре вектор имеет 1 на i-м измерении и 0 на остальных. В машинном обучении это самый простой способ представления категориальных признаков.

Вы, вероятно, можете догадаться, почему one-hot векторы — не лучший способ представления слов. Одна из проблем заключается в том, что для больших словарей эти векторы будут очень длинными: размерность вектора равна размеру словаря. На практике это нежелательно, но эта проблема не самая критичная.

Что действительно важно, так это то, что эти векторы ничего не знают о словах, которые они представляют. Например, one-hot векторы "думают", что cat так же близок к dog, как и к table! Можно сказать, что one-hot векторы не улавливают смысл.

Но откуда нам знать, что такое "смысл"?

Дистрибутивная семантика (Distributional Semantics)

Чтобы отразить смысл слов в их векторах, нам сначала нужно определить понятие смысла, которое можно использовать на практике. Для этого давайте попробуем понять, как мы, люди, узнаем, какие слова имеют схожее значение.

Lena: Пример взят из конспектов Джейкоба Эйзенштейна по NLP; пример с tezgüino первоначально появился у Линь (Lin) в 1998 году.

Как только вы увидели, как незнакомое слово используется в разных контекстах, вы смогли понять его значение. Как вы это сделали?

Гипотеза состоит в том, что ваш мозг искал другие слова, которые могут быть использованы в тех же контекстах, нашел некоторые (например, wine) и сделал вывод, что tezgüino имеет значение, сходное с этими другими словами. Это и есть дистрибутивная гипотеза (distributional hypothesis) :

Слова, которые часто встречаются в похожих контекстах, имеют схожее значение.

Lena: Часто можно встретить формулировку "Ты узнаешь слово по компании, которую оно держит" со ссылкой на Дж. Р. Фёрса (J. R. Firth) в 1957 году, но на самом деле ответственных было гораздо больше, и гораздо раньше. Например, Харрис (Harris) в 1954 году.

Это чрезвычайно ценная идея: ее можно использовать на практике, чтобы заставить векторы слов отражать их значение. Согласно дистрибутивной гипотезе, "отразить значение" и "отразить контексты" — это, по сути, одно и то же. Следовательно, все, что нам нужно сделать, это поместить информацию о контекстах слова в его представление.

Главная идея: Нам нужно вложить информацию о контекстах слова в его векторное представление.

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

Частотные методы (Count-Based Methods)

Давайте вспомним нашу главную идею:

Главная идея: Мы должны вложить информацию о контекстах в векторы слов.

Частотные методы понимают эту идею буквально:

Как: Вручную вложить эту информацию на основе глобальной статистики по корпусу.

Общая процедура проиллюстрирована выше и состоит из двух шагов: (1) построить матрицу "слово-контекст", (2) уменьшить ее размерность. Есть две причины для уменьшения размерности. Во-первых, исходная матрица очень велика. Во-вторых, поскольку многие слова встречаются лишь в немногих из возможных контекстов, эта матрица потенциально содержит много неинформативных элементов (например, нулей).

Чтобы оценить сходство между словами/контекстами, обычно нужно вычислить скалярное произведение нормализованных векторов слов/контекстов (т.е. косинусное сходство (cosine similarity) ).

Чтобы определить частотный метод, нам нужно определить две вещи:

  • возможные контексты (включая то, что означает "слово встречается в контексте"),
  • понятие ассоциации, т.е. формулы для вычисления элементов матрицы.

Ниже мы приводим пару популярных способов сделать это.

Простой подход: подсчет совместной встречаемости (Co-Occurence Counts)

Самый простой подход — определить контексты как каждое слово в окне размера L. Элемент матрицы для пары (слово w, контекст c) — это количество раз, которое w встречается в контексте c. Это очень базовый (и очень, очень старый) метод получения эмбеддингов.

Некогда известная модель HAL (1996) также является модификацией этого подхода.

Положительная взаимная информация (PPMI)

Здесь контексты определяются как и раньше, но мера ассоциации между словом и контекстом более умная: положительная PMI (или сокращенно PPMI). Мера PPMI широко считается передовым методом для моделей дистрибутивного сходства "до-нейронной" эпохи.

Важно: связь с нейросетевыми моделями!
Оказывается, некоторые нейросетевые методы, которые мы рассмотрим (Word2Vec), как было показано, неявно аппроксимируют факторизацию матрицы PMI (со сдвигом). Оставайтесь с нами!

Латентно-семантический анализ (LSA): Понимание документов

Латентно-семантический анализ (LSA) анализирует коллекцию документов. В то время как в предыдущих подходах контексты служили только для получения векторов слов и впоследствии отбрасывались, здесь мы также заинтересованы в векторах контекстов, или, в данном случае, документов. LSA — одна из простейших тематических моделей (topic models): косинусное сходство между векторами документов можно использовать для измерения сходства между документами.

Термин "LSA" иногда относится к более общему подходу применения SVD к матрице "терм-документ", где элементы могут быть вычислены разными способами (например, простая совместная встречаемость, tf-idf или какая-то другая взвешенная мера).

Внимание, анимация! На странице LSA в Википедии есть хорошая анимация процесса обнаружения тем в матрице "документ-слово" — посмотрите!

Word2Vec: Предсказательный метод (Prediction-Based Method)

Давайте снова вспомним нашу главную идею:

Главная идея: Мы должны вложить информацию о контекстах в векторы слов.

В то время как частотные методы понимали эту идею буквально, Word2Vec использует ее иначе:

Как: Изучить векторы слов, обучая их предсказывать контексты.

Word2Vec — это модель, параметрами которой являются векторы слов. Эти параметры оптимизируются итеративно для достижения определенной цели. Цель заставляет векторы слов "знать" контексты, в которых слово может появиться: векторы обучаются предсказывать возможные контексты соответствующих слов. Как вы помните из дистрибутивной гипотезы, если векторы "знают" о контекстах, они "знают" значение слова.

Word2Vec — это итеративный метод. Его основная идея заключается в следующем:

  1. Взять огромный текстовый корпус;
  2. Пройтись по тексту скользящим окном, перемещаясь на одно слово за раз. На каждом шаге есть центральное слово (central word) и слова контекста (context words) (другие слова в этом окне);
  3. Для центрального слова вычислить вероятности слов контекста;
  4. Скорректировать векторы, чтобы увеличить эти вероятности.

Lena: Идея визуализации взята из курса Стэнфорда CS224n.

Целевая функция: Отрицательное логарифмическое правдоподобие (Negative Log-Likelihood)

Для всего текста мы можем вычислить вероятность (правдоподобие) увидеть все слова контекста для всех центральных слов. Затем мы берем среднее отрицательное логарифмическое правдоподобие — это и есть наша функция потерь, которую нужно минимизировать.

Заметьте, как хорошо функция потерь согласуется с нашим планом: пройти по тексту скользящим окном и вычислить вероятности.

Как вычислить вероятность контекстного слова по центральному?

Для каждого слова мы будем использовать два вектора: * один вектор — когда оно является центральным словом; * другой вектор — когда оно является словом контекста.

(После обучения векторов обычно отбрасывают векторы контекста и используют только векторы центральных слов.)

Вероятность увидеть конкретное слово контекста при заданном центральном слове вычисляется как соотношение "сходства" (скалярного произведения) их векторов. Используется функция softmax, которая превращает набор чисел (мер сходства со всеми словами словаря) в распределение вероятностей.

Как обучать: Градиентный спуск по одному слову за раз (Gradient Descent, One Word at a Time)

Мы обновляем наши векторы с помощью градиентного спуска, но делаем это не для всего текста сразу, а по одному маленькому шагу за раз. Каждое обновление выполняется для одной конкретной пары "центральное слово — одно из его слов контекста".

Возьмем конкретный шаг. Например, у нас есть предложение "... cute cat likes fish ..." с центральным словом cat. Мы выбираем одно слово контекста, например cute. Наша цель на этом шаге — увеличить сходство между вектором центрального слова cat и вектором контекста cute и одновременно немного уменьшить сходство между вектором cat и векторами контекста всех остальных слов в словаре.

Это может звучать странно: зачем нам уменьшать сходство между cat и, скажем, table? Но не волнуйтесь: поскольку мы делаем обновления для каждого слова контекста (и для всех центральных слов в тексте), в среднем по всем обновлениям наши векторы изучат правильные распределения возможных контекстов.

Более быстрое обучение: Негативное сэмплирование (Negative Sampling)

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

Но почему мы должны рассматривать все векторы контекста? Представим, что на текущем шаге мы рассматриваем векторы контекста не для всех слов, а только для текущей цели (cute) и нескольких случайно выбранных слов. Как и раньше, мы увеличиваем сходство между cat и cute. Но теперь мы также выбираем несколько случайных слов (например, dog, table, car) и уменьшаем сходство между cat и их контекстными векторами.

Поскольку у нас большой корпус, в среднем по всем обновлениям мы обновим каждый вектор достаточное количество раз, и векторы все равно смогут довольно хорошо изучить связи между словами.

Выбор негативных примеров

Каждое слово имеет лишь несколько "истинных" контекстов. Поэтому случайно выбранные слова с очень высокой вероятностью будут "негативными", т.е. не истинными контекстами. Эта простая идея используется не только для эффективного обучения Word2Vec, но и во многих других приложениях.

Word2Vec случайным образом выбирает негативные примеры на основе частотности слов в корпусе, но с небольшой корректировкой, чтобы немного чаще выбирать редкие слова.

Варианты Word2Vec: Skip-Gram и CBOW

Существует два варианта Word2Vec: Skip-Gram и CBOW.

  • Skip-Gram — это модель, которую мы рассматривали до сих пор: она предсказывает слова контекста по заданному центральному слову. Skip-Gram с негативным сэмплированием (SGNS) — самый популярный подход.
  • CBOW (Continuous Bag-of-Words) — предсказывает центральное слово по сумме (или среднему) векторов слов контекста. Эта простая сумма векторов слов и называется "мешком слов" (bag of words), что и дало название модели.

Дополнительные замечания

Оригинальные статьи Word2Vec: * Efficient Estimation of Word Representations in Vector Space (Mikolov et al., 2013) * Distributed Representations of Words and Phrases and their Compositionality (Mikolov et al., 2013)

Здесь мы приведем некоторые из самых важных моментов, которые нужно знать.

Идея не нова

Идея изучения векторных представлений слов (дистрибутивных представлений) не нова. Например, были попытки изучать векторы слов как часть более крупной сети, а затем извлекать слой эмбеддингов.

Что было действительно неожиданным в Word2Vec, так это его способность быстро изучать высококачественные векторы слов на огромных наборах данных и для больших словарей. И, конечно, все те интересные свойства, такие как способность выполнять семантические аналогии (король - мужчина + женщина = королева), быстро сделали Word2Vec очень известным.

Зачем нужны два вектора?

Как вы помните, в Word2Vec мы обучаем два вектора для каждого слова: один для случая, когда оно является центральным, и другой — когда контекстным. После обучения векторы контекста обычно отбрасываются.

Это один из трюков, который сделал Word2Vec таким простым. Разделение на два набора векторов упрощает оптимизацию. Хотя стандартной практикой является отбрасывание векторов контекста, было показано, что усреднение векторов слова и контекста может быть более полезным.

Связь с факторизацией PMI-матрицы

Было показано, что Word2Vec SGNS (Skip-Gram with Negative Sampling) неявно аппроксимирует факторизацию специально преобразованной матрицы "слово-контекст" (матрицы PMI).

Влияние размера окна

Размер скользящего окна оказывает сильное влияние на результат. Меньший размер окна (2-5) дает больше синтаксической информации (слова с похожими грамматическими функциями), в то время как больший размер окна (5-10) дает больше семантической информации (слова, встречающиеся в похожих темах).

0.0
0 оценок
5★
0
4★
0
3★
0
2★
0
1★
0

Оставить отзыв

Нажмите на звезду для оценки от 1 до 5
Необязательно. Используется только для связи
0/2000

Комментарии

Все С ответами Проверенные Только 4-5★