.. _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) может быть высоким? `Обсуждения `__