.. _sec_word2vec:
Эмбеддинг слов (word2vec)
=========================
Естественный язык — это сложная система, используемая для выражения
смыслов. В этой системе слова являются базовой единицей смысла. Как
следует из названия, *векторы слов* — это векторы, используемые для
представления слов, которые также можно рассматривать как векторы
признаков или представления слов. Техника отображения слов в
вещественные векторы называется *эмбеддингом слов*. В последние годы
эмбеддинг слов постепенно стал базовым знанием в области обработки
естественного языка.
Векторы с одним активным элементом — плохой выбор
-------------------------------------------------
В разделе :numref:`sec_rnn-scratch` мы использовали one-hot-векторы
для представления слов (символы также считаются словами). Предположим,
что количество различных слов в словаре (размер словаря) равно
:math:`N`, и каждому слову соответствует уникальное целое число (индекс)
от :math:`0` до :math:`N-1`. Чтобы получить one-hot-векторное
представление для любого слова с индексом :math:`i`, мы создаём вектор
длины :math:`N`, состоящий из нулей, и устанавливаем значение элемента
на позиции :math:`i` равным 1. Таким образом, каждое слово
представляется в виде вектора длины :math:`N`, который может быть
непосредственно использован нейронными сетями.
Хотя одномерные векторы слов легко конструировать, обычно они не
являются хорошим выбором. Основная причина заключается в том, что
одномерные векторы слов не позволяют точно выразить степень сходства
между различными словами, например, с помощью *косинусного сходства*,
которое мы часто используем. Для векторов
:math:`\mathbf{x}, \mathbf{y} \in \mathbb{R}^d` их косинусное сходство
равно косинусу угла между ними:
.. math:: \frac{\mathbf{x}^\top \mathbf{y}}{\|\mathbf{x}\| \|\mathbf{y}\|} \in [-1, 1].
Поскольку косинусное сходство между one-hot-векторами любых двух
различных слов равно нулю, one-hot-векторы не могут кодировать сходства
между словами.
Самостоятельное обучение word2vec
---------------------------------
Инструмент `word2vec `__
был предложен для решения указанной выше проблемы. Он отображает каждое
слово в вектор фиксированной длины, причём эти векторы позволяют лучше
выражать сходство и аналогичные отношения между различными словами.
Инструмент word2vec включает две модели, а именно *skip-gram*
:cite:`Mikolov.Sutskever.Chen.ea.2013` и *continuous bag of words*
(CBOW) :cite:`Mikolov.Chen.Corrado.ea.2013`. Для получения
семантически значимых представлений их обучение опирается на условные
вероятности, которые можно рассматривать как предсказание некоторых слов
на основе некоторых из окружающих их слов в корпусе. Поскольку обучение
происходит на данных без меток, как skip-gram, так и continuous bag of
words являются моделями с самообучением.
В дальнейшем мы рассмотрим эти две модели и методы их обучения.
.. _subsec_skip-gram:
Модель Skip-Gram
----------------
Модель *skip-gram* предполагает, что слово может использоваться для
генерации окружающих его слов в текстовой последовательности. Возьмем
текстовую последовательность «the», «man», «loves», «his», «son» в
качестве примера. Пусть слово «loves» будет *центральным словом*, а
размер контекстного окна равен 2. Как показано на
:numref:`fig_skip_gram`, при заданном центральном слове «loves» модель
skip-gram рассматривает условную вероятность генерации *контекстных
слов*: «the», «man», «his» и «son», которые находятся на расстоянии не
более двух слов от центрального слова:
.. math:: P(\textrm{"the"},\textrm{"man"},\textrm{"his"},\textrm{"son"}\mid\textrm{"loves"}).
Предположим, что контекстные слова генерируются независимо при заданном
центральном слове (т. е. условие условной независимости). В этом случае
вышеуказанная условная вероятность может быть переписана как
.. math:: P(\textrm{"the"}\mid\textrm{"loves"})\cdot P(\textrm{"man"}\mid\textrm{"loves"})\cdot P(\textrm{"his"}\mid\textrm{"loves"})\cdot P(\textrm{"son"}\mid\textrm{"loves"}).
.. _fig_skip_gram:
.. figure:: ../img/skip-gram.svg
Модель skip-gram рассматривает условную вероятность генерации
окружающих контекстных слов при заданном центральном слове.
В модели skip-gram каждое слово имеет два :math:`d`-мерных векторных
представления для вычисления условных вероятностей. Более конкретно, для
любого слова с индексом :math:`i` в словаре обозначим через
:math:`\mathbf{v}_i\in\mathbb{R}^d` и
:math:`\mathbf{u}_i\in\mathbb{R}^d` его два вектора, используемые
соответственно в качестве *центрального* слова и слова *контекста*.
Условная вероятность появления любого слова контекста :math:`w_o` (с
индексом :math:`o` в словаре) при заданном центральном слове :math:`w_c`
(с индексом :math:`c` в словаре) может быть смоделирована с помощью
операции софтмакс над скалярными произведениями векторов:
.. math:: P(w_o \mid w_c) = \frac{\exp(\mathbf{u}_o^\top \mathbf{v}_c)}{ \sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)},
:label: eq_skip-gram-softmax
где :math:`\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}` — множество
индексов словаря. Рассмотрим текстовую последовательность длины
:math:`T`, в которой слово на шаге времени :math:`t` обозначается как
:math:`w^{(t)}`. Предположим, что контекстные слова генерируются
независимо при заданном центральном слове. Для размера контекстного окна
:math:`m` функция правдоподобия модели Skip-Gram представляет собой
вероятность генерации всех контекстных слов при заданном центральном
слове:
.. math:: \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),
где любые временные шаги, меньшие :math:`1` или большие :math:`T`, могут
быть опущены.
Обучение
~~~~~~~~
Параметры модели skip-gram — это векторы центрального слова и
контекстного слова для каждого слова в словаре. В процессе обучения мы
находим параметры модели, максимизируя функцию правдоподобия (то есть
применяя метод максимального правдоподобия). Это эквивалентно
минимизации следующей функции потерь:
.. math:: - \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \textrm{log}\, P(w^{(t+j)} \mid w^{(t)}).
При использовании стохастического градиентного спуска для минимизации
функции потерь на каждой итерации мы можем случайным образом выбрать
более короткую подпоследовательность и вычислить (стохастический)
градиент по этой подпоследовательности для обновления параметров модели.
Чтобы вычислить этот (стохастический) градиент, нам необходимо получить
градиенты логарифма условной вероятности по вектору центрального слова и
вектору контекстного слова. В общем случае, согласно
:eq:`eq_skip-gram-softmax`, логарифм условной вероятности,
включающей любую пару центрального слова :math:`w_c` и контекстного
слова :math:`w_o`, равен
.. math:: \log P(w_o \mid w_c) =\mathbf{u}_o^\top \mathbf{v}_c - \log\left(\sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)\right).
:label: eq_skip-gram-log
С помощью дифференцирования мы можем получить его градиент по вектору
центрального слова :math:`\mathbf{v}_c`:
.. math:: \begin{aligned}\frac{\partial \textrm{log}\, P(w_o \mid w_c)}{\partial \mathbf{v}_c}&= \mathbf{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\mathbf{u}_j^\top \mathbf{v}_c)\mathbf{u}_j}{\sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}\\&= \mathbf{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\exp(\mathbf{u}_j^\top \mathbf{v}_c)}{ \sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \mathbf{v}_c)}\right) \mathbf{u}_j\\&= \mathbf{u}_o - \sum_{j \in \mathcal{V}} P(w_j \mid w_c) \mathbf{u}_j.\end{aligned}
:label: eq_skip-gram-grad
Обратите внимание, что вычисление в :eq:`eq_skip-gram-grad` требует
знания условных вероятностей всех слов в словаре при условии, что
:math:`w_c` является центральным словом. Градиенты для остальных
векторов слов могут быть получены аналогичным образом.
После обучения для любого слова с индексом :math:`i` в словаре мы
получаем как векторы центрального слова :math:`\mathbf{v}_i`, так и
векторы контекстного слова :math:`\mathbf{u}_i`. В задачах обработки
естественного языка векторы центрального слова модели skip-gram обычно
используются в качестве представлений слов.
Модель непрерывного суммирования слов (CBOW)
--------------------------------------------
Модель *непрерывного мешка слов* (CBOW) аналогична модели skip-gram.
Главное отличие модели непрерывного мешка слов от модели skip-gram
заключается в том, что она предполагает, что центральное слово
генерируется на основе окружающих его слов контекста в текстовой
последовательности. Например, в той же текстовой последовательности
«the», «man», «loves», «his» и «son», где «loves» является центральным
словом, а размер окна контекста равен 2, модель непрерывного мешка слов
рассматривает условную вероятность генерации центрального слова «loves»
на основе слов контекста «the», «man», «his» и «son» (как показано на
:numref:`fig_cbow`), которая равна
.. math:: P(\textrm{"loves"}\mid\textrm{"the"},\textrm{"man"},\textrm{"his"},\textrm{"son"}).
.. _fig_cbow:
.. _обучение-1:
.. figure:: ../img/cbow.svg
Модель непрерывного мешка слов (CBOW) рассматривает условную
вероятность генерации центрального слова при заданных окружающих его
словах контекста.
Поскольку в модели непрерывного мешка слов (CBOW) используется несколько
контекстных слов, их векторы усредняются при вычислении условной
вероятности. Конкретно, для любого слова с индексом :math:`i` в словаре
обозначим через :math:`\mathbf{v}_i\in\mathbb{R}^d` и
:math:`\mathbf{u}_i\in\mathbb{R}^d` его два вектора, используемые в
качестве вектора *контекстного* слова и *центрального* слова (в модели
skip-gram их значения меняются местами) соответственно. Условная
вероятность генерации любого центрального слова :math:`w_c` (с индексом
:math:`c` в словаре) при заданных окружающих его контекстных словах
:math:`w_{o_1}, \ldots, w_{o_{2m}}` (с индексами
:math:`o_1, \ldots, o_{2m}` в словаре) может быть смоделирована
следующим образом:
.. math:: P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\exp\left(\frac{1}{2m}\mathbf{u}_c^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \exp\left(\frac{1}{2m}\mathbf{u}_i^\top (\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}}) \right)}.
:label: fig_cbow-full
Для краткости обозначим
:math:`\mathcal{W}_o= \{w_{o_1}, \ldots, w_{o_{2m}}\}` и
:math:`\bar{\mathbf{v}}_o = \left(\mathbf{v}_{o_1} + \ldots + \mathbf{v}_{o_{2m}} \right)/(2m)`.
Тогда :eq:`fig_cbow-full` можно упростить до
.. math:: P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\mathbf{u}_c^\top \bar{\mathbf{v}}_o\right)}{\sum_{i \in \mathcal{V}} \exp\left(\mathbf{u}_i^\top \bar{\mathbf{v}}_o\right)}.
Рассмотрим текстовую последовательность длины :math:`T`, где слово на
шаге времени :math:`t` обозначается как :math:`w^{(t)}`. Для размера
контекстного окна :math:`m` функция правдоподобия модели непрерывного
мешка слов представляет собой вероятность генерации всех центральных
слов при заданных словах контекста:
.. math:: \prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).
Обучение
~~~~~~~~
Обучение моделей непрерывного мешка слов (CBOW) практически не
отличается от обучения моделей skip-gram. Метод максимального
правдоподобия для модели непрерывного мешка слов эквивалентен
минимизации следующей функции потерь:
.. math:: -\sum_{t=1}^T \textrm{log}\, P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).
Заметим, что
.. math:: \log\,P(w_c \mid \mathcal{W}_o) = \mathbf{u}_c^\top \bar{\mathbf{v}}_o - \log\,\left(\sum_{i \in \mathcal{V}} \exp\left(\mathbf{u}_i^\top \bar{\mathbf{v}}_o\right)\right).
Дифференцированием мы можем получить его градиент по любому вектору
контекстного слова :math:`\mathbf{v}_{o_i}`\ (:math:`i = 1, \ldots, 2m`)
в виде
.. math:: \frac{\partial \log\, P(w_c \mid \mathcal{W}_o)}{\partial \mathbf{v}_{o_i}} = \frac{1}{2m} \left(\mathbf{u}_c - \sum_{j \in \mathcal{V}} \frac{\exp(\mathbf{u}_j^\top \bar{\mathbf{v}}_o)\mathbf{u}_j}{ \sum_{i \in \mathcal{V}} \exp(\mathbf{u}_i^\top \bar{\mathbf{v}}_o)} \right) = \frac{1}{2m}\left(\mathbf{u}_c - \sum_{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \mathbf{u}_j \right).
:label: eq_cbow-gradient
Градиенты для остальных векторов слов можно получить аналогичным
образом. В отличие от модели skip-gram, модель непрерывного мешка слов
(CBOW) обычно использует векторы контекстных слов в качестве
представлений слов.
Итоги
-----
- Векторы слов — это векторы, используемые для представления слов,
которые также можно рассматривать как векторы признаков или
представления слов. Техника отображения слов в вещественные векторы
называется эмбеддингом слов.
- Инструмент word2vec содержит как модель skip-gram, так и модель
непрерывного мешка слов (continuous bag of words).
- Модель skip-gram предполагает, что слово может использоваться для
генерации окружающих его слов в текстовой последовательности, тогда
как модель continuous bag of words предполагает, что центральное слово
генерируется на основе окружающих его контекстных слов.
Упражнения
----------
1. Какова вычислительная сложность вычисления каждого градиента? Какие
могут возникнуть проблемы, если размер словаря огромен?
2. Некоторые устойчивые словосочетания в английском языке состоят из
нескольких слов, например «new york». Как обучать их векторные
представления? Подсказка: см. раздел 4 в статье word2vec
:cite:`Mikolov.Sutskever.Chen.ea.2013`.
3. Давайте проанализируем архитектуру word2vec на примере модели
skip-gram. Какова связь между скалярным произведением двух векторов
слов в модели skip-gram и косинусным сходством? Почему для пары слов
с близким значением косинусное сходство их векторов (обученных с
помощью модели skip-gram) может быть высоким?
`Обсуждения `__