Word2Vec

алгоритм

Это 22-й день моего участия в августовском испытании обновлений. Узнайте подробности мероприятия: Испытание августовского обновления

В задачах обработки естественного языка в качестве основной единицы обычно используются слова.Например, если мы хотим проанализировать настроение предложения «Я был в штате Вашингтон», общая практика состоит в том, чтобы сначала разделить предложение на слово.,去过,华盛顿州, так как нейронная сеть не может обрабатывать слова, нам нужно каким-то образом преобразовать эти слова в векторы слов. Вектор слова — это вектор, используемый для представления слова, и его также можно рассматривать как вектор признаков слова. Техника сопоставления слов с реальными векторами доменов также называется встраиванием слов.

Почему бы не использовать горячие векторы

Предположим, что количество различных слов в словаре равноNN, каждое слово может суммироваться от 0 доN1N-1Взаимооднозначное соответствие последовательных целых чисел. Предположим, что соответствующее целое число слова представлено какii, чтобы получить прямое векторное представление слова, мы создаем полностью нулевую длинуNN, и преобразовать его в первыйiiустановить бит 1

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

word2vec

В 2013 году команда Google выпустила инструмент word2vec. Инструмент word2vec в основном содержит две модели:модель со скип-граммомиНепрерывный мешок слов (сокращенно CBOW)и два метода эффективного обучения:отрицательная выборкаиИерархический софтмакс (иерархический софтмакс). Стоит отметить, что вектор слов word2vec лучше выражает сходство и аналогию между разными словами.

Модель слова «прыгать»

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

P(the,man,his,sonhit)P(\text{the},\text{man},\text{his},\text{son}\mid \text{hit})

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

P(thehit)P(manhit)P(hishit)P(sonhit)P(\text{the}\mid \text{hit})·P(\text{man}\mid \text{hit})·P(\text{his}\mid \text{hit})·P(\text{son}\mid \text{hit})

Опишем модель пропуска слов. Предположим, что размер словаряV|V|, мы связываем каждое слово в словаре с 0 доV1|V|-1Однозначное соответствие целых чисел: набор словарных индексовV={0,1,...,V1}V=\{0,1,...,|V|-1\}. Целое число, соответствующее слову в словаре, называется индексом слова при длинеTTтекстовая последовательность,ttслово для моментаw(t)w^{(t)}. Когда размер временного окнаmm, модель пропуска слов должна быть максимизированаВероятность создания фонового слова для любого центрального слова:

t=1Tmjm, j0P(w(t+j)w(t))\ prod_ {t = 1} ^ T {\ prod_ {-m≤j≤m, \ j \ neq 0} {P (w ^ {(t + j)} \ mid w ^ {(t)})}}

Оценка максимального правдоподобия приведенной выше формулы эквивалентна минимизации следующей функции потерь

1Tt=1Tmjm, j0logP(w(t+j)w(t))-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m≤j≤m,\ j\neq 0}\log P(w^{(t+j)}\ середина ш ^ {(т)})

мы можем использоватьv\boldsymbol vвектор слова, представляющий заглавное слово,u\boldsymbol uВекторы слов, представляющие фоновые слова. Другими словами, для индекса в словаре какiiслово, которое само имеет два вектораvi\boldsymbol {v}_iиui\boldsymbol{u}_iВ процессе расчета выбираются разные векторы слов в соответствии с их разными ролями.Эти два вектора всех слов в словаре являются параметрами, которые должна изучить модель скачкообразного изменения слов.. Чтобы внедрить параметры модели в функцию потерь, нам нужно выразить вероятность того, что центральное слово в функции потерь генерирует фоновое слово, используя параметры модели. Предполагается, что вероятности заглавных слов не зависят друг от друга. данное заглавное словоwcw_cИндекс в словареcc, фоновое словоwow_oИндекс в словареoo, вероятность того, что центральное слово в функции потерь генерирует фоновое слово, может быть определена с помощью функции softmax:

P(wowc)=exp(uoTvc)iеVexp(uiTvc)P(w_o|w_c)=\frac{\exp(\boldsymbol{u}_o^T\boldsymbol {v}_c)}{\sum_{i\in V}\exp(\boldsymbol{u}_i^T\boldsymbol{v}_c)}

Когда длина последовательностиTTПри увеличении мы обычно случайным образом выбираем меньшую подпоследовательность для вычисления функции потерь и используем SGD для оптимизации этой функции потерь. Путем вывода мы можем вычислить логарифм вероятности генерации приведенной выше формулы относительно центрального вектора словаvc\boldsymbol {v}_cГрадиент:

logP(wowc)vc=vclogexp(uoTvc)i=1Vexp(uiTvc)=vclogexp(uoTvc)1vclogi=1Vexp(uiTvc)2\begin{aligned} \frac{\partial \log P(w_o\mid w_c)}{\partial \boldsymbol{v}_c}&=\frac{\partial}{\partial \boldsymbol{v}_c}\log\frac{\exp(\boldsymbol{u}_o^T\boldsymbol{v}_c)}{\sum_{i=1}^{|V|}\exp(\boldsymbol{u}_i^T\boldsymbol{v}_c)}\\&=\underbrace {\frac{\partial}{\partial \boldsymbol{v}_c} \log \exp(\boldsymbol{u}_o^T\boldsymbol{v}_c)}_1-\underbrace{\frac{\partial}{\partial \boldsymbol{v}_c}\log \sum_{i=1}^{|V|}\exp(\boldsymbol{u}_i^T{\boldsymbol{v}_c})}_2 \end{aligned}

Первая часть вывода

vclogexp(uoTvc)=vcuoTvc=uo\frac { \partial} {\partial \boldsymbol{v}_c} \color{red}{\log \exp (\boldsymbol{u}_o^T \boldsymbol{v}_c) } = \frac { \partial} {\partial \boldsymbol{v}_c} \color{red}{\boldsymbol{u}_o^T \boldsymbol{v}_c} = \mathbf{\boldsymbol{u}_o}

Вторая часть вывода

vclogi=1Vexp(uiTvc)=1i=1Vexp(uiTvc)vcx=1Vexp(uxTvc)=1Ax=1Vvcexp(uxTvc)=1Ax=1Vexp(uxTvc)vcuxTvc=1i=1Vexp(uiTvc)x=1Vexp(uxTvc)ux=x=1Vexp(uxTvc)i=1Vexp(uiTvc)ux=x=1VP(wxwc)ux\begin{aligned} \frac { \partial} {\partial \boldsymbol{v}_c} \log \sum_{i=1}^{|V|} \exp(\boldsymbol{u}_i^T \boldsymbol{v}_c) & = \frac{1}{\sum_{i=1}^{|V|} \exp(\boldsymbol{u}_i^T \boldsymbol{v}_c)} \cdot \color{red}{ \frac { \partial} {\partial \boldsymbol{v}_c} \sum_{x=1}^{|V|} \exp(\boldsymbol{u}_x^T \boldsymbol{v}_c)} \\ & = \frac{1}{A} \cdot \sum_{x=1}^{|V|} \color{red} {\frac { \partial} {\partial \boldsymbol{v}_c} \exp(\boldsymbol{u}_x^T \boldsymbol{v}_c)} \\ & = \frac{1}{A} \cdot \sum_{x=1}^{|V|} \exp (\boldsymbol{u}_x^T \boldsymbol{v}_c) \color{red} {\frac { \partial} {\partial \boldsymbol{v}_c} \boldsymbol{u}_x^T \boldsymbol{v}_c} \\ & = \frac{1}{\sum_{i=1}^{|V|} \exp(\boldsymbol{u}_i^T \boldsymbol{v}_c)} \sum_{x=1}^{|V|} \exp (\boldsymbol{u}_x^T \boldsymbol{v}_c) \color{red} {\boldsymbol{u}_x} \\ & = \sum_{x=1}^{|V|} \color{red} { \frac{\exp (\boldsymbol{u}_x^T \boldsymbol{v}_c)} {\sum_{i=1}^{|V|} \exp(\boldsymbol{u}_i^T \boldsymbol{v}_c)}} \boldsymbol{u}_x \\ & = \sum_{x=1}^{|V|} \color{red} {P(w_x \mid w_c) }\boldsymbol{u}_x \end{aligned}

В итоге

logP(wowc)vc=uojеVP(wjwc)uj\frac{\partial \log P(w_o\mid w_c)}{\partial \boldsymbol{v}_c}=\boldsymbol{u}_o-\sum_{j\in V}P(w_j\mid w_c)\boldsymbol {u}_j

После получения градиента с помощью приведенного выше расчета мы можем использовать стохастический градиентный спуск для непрерывного повторения параметров модели.vc\boldsymbol {v}_c. Другие параметры моделиuo\boldsymbol {u}_oТаким же образом можно получить итерационный метод. Наконец, для любого индекса в словаре какiiСлово, мы все получаем слово два набора слов для центрального слова и фоновые слова векторvi\boldsymbol {v}_iиui\boldsymbol {u}_i

мешок непрерывных слов

Модель мешка слов похожа на модель скачкообразного изменения слов. Самое большое отличие от модели с прыгающими словами заключается в том, что модель с непрерывным набором словПредсказать заглавное слово со словами, окружающими текстовую последовательность с заглавным словом. Проще говоря, модель с пропуском слов использует центральное слово для предсказания окружающих слов, а модель непрерывного набора слов использует окружающие слова для предсказания центрального слова. Например, для текста «тот», «мужчина», «ударил», «его», «сын» модель мешка слов касается соседних слов «тот», «мужчина», «его». ,"son ​​"Вероятность образования центрального слова "hit" вместе

Модель непрерывного мешка слов должна максимизировать вероятность создания любого центрального слова из фонового слова:

t=1TP(w(t)w(tm),...,w(t1),w(t+1),...,w(t+m))\prod_{t=1}^TP(w^{(t)}\mid w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)})

Оценка максимального правдоподобия приведенной выше формулы эквивалентна минимизации следующей функции потерь

t=1TlogP(w(t)w(tm),...,w(t1),w(t+1),...,w(t+m))-\sum_{t=1}^T\log P(w^{(t)}\mid w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)})

мы можем использоватьv\boldsymbol{v}иu\boldsymbol{u}Векторы, представляющие фоновое слово и центральное слово соответственно (обратите внимание, что модели символа и слова перехода различны). данное заглавное словоwcw_cИндекс в словареcc, фоновое словоwo1,...,wo2mw_{o_1},...,w_{o_{2m}}Индекс в словареo1,...,o2mo_1,...,o_{2m}, вероятность того, что фоновое слово в функции потерь генерирует центральное слово, может быть определена с помощью функции softmax как

P(wcwo1,...,wo2m)=exp[ucT(vo1+...+vo2m)/(2m)]jеVexp[ujT(vo1+...+vo2m)/(2m)]P(w_c\mid w_{o_1},...,w_{o_{2m}})=\frac{\exp[\boldsymbol{u}_c^T(\boldsymbol{v}_{o_1}+...+\boldsymbol{v}_{o_{2m}})/(2m)]}{\sum_{j\in V}\exp[\boldsymbol{u}_j^T(\boldsymbol{v}_{o_1}+...+\boldsymbol{v}_{o_{2m}})/(2m)]}

Аналогично, когда длина последовательностиTTКогда он больше, мы обычно случайным образом выбираем меньшую подпоследовательность для вычисления функции потерь и используем стохастический градиентный спуск для оптимизации функции потерь.Путем дифференцирования мы можем вычислить логарифм указанной выше вероятности генерации по отношению к любому вектору фонового словаvoi(i=1,...,2m)\boldsymbol{v}_{o_i}(i=1,...,2m)Градиент:

logP(wcwo1,...,wo2m)voi=12m(ucjеVexp(ujTvc)iеVexp(uiTvc)uj)\frac{\partial \log P(w_c\mid w_{o_1},...,w_{o_{2m}})}{\partial \boldsymbol{v}_{o_i}}=\frac{1}{2m}(\boldsymbol {u}_c-\sum_{j\in V}\frac{\exp(\boldsymbol u_j^T\boldsymbol v_c)}{\sum_{i\in V}\exp(\boldsymbol u_i^T\boldsymbol v_c)}\boldsymbol u_j)

Приведенная выше формула эквивалентна следующей формуле:

logP(wcwo1,...,wo2m)voi=12m(ucjеVP(wjwc)uj)\frac{\partial \log P(w_c\mid w_{o_1},...,w_{o_{2m}})}{\partial \boldsymbol{v}_{o_i}}=\frac{1}{2m}(\boldsymbol {u}_c-\sum_{j\in V}P(w_j\mid w_c)\boldsymbol u_j)

примерный метод обучения

Можно видеть, что независимо от того, является ли это моделью со скачкообразным изменением слов или моделью непрерывного набора слов, стоимость вычисления градиента на каждом шаге такая же, как и у словаря.VVразмер имеет положительную корреляцию. Очевидно, что этот метод обучения требует значительных вычислительных ресурсов, когда словарь большой. Таким образом, использование вышеуказанного метода обучения на практике затруднено. Мы можем использовать приближенные методы для расчета этих градиентов, тем самым снижая вычислительные затраты. Обычно используемые приблизительные методы обучения включаютотрицательная выборкаиПоследовательный софтмакс

отрицательная выборка

Возьмите модель пропуска слов в качестве примера, чтобы обсудить отрицательную выборку. СловарьVVПричина, по которой размер , появляется в целевой функции, заключается в том, что центральное словоwcw_cГенерировать фоновые словаwow_oВероятностьP(wowc)P(w_o|w_c)Используется Softmax, а softmax учитывает, что фоновым словом может быть любое слово в словаре, и это отражается в знаменателе softmax.

Мы могли бы также изменить угол, предполагая, что центральное словоwcw_cГенерировать фоновые словаwow_oаппроксимируется следующими двумя независимыми совместными событиями

  1. центральное словоwcw_cи фоновое словоwow_oтакже появляются в окне тренировочных данных
  2. центральное словоwcw_cне появляется в окне обучающих данных одновременно с шумовым словом
    • центральное словоwcw_cи первое шумовое словоw1w_1не появляются в окне тренировочных данных одновременно (шумовые словаw1w_1Распределение по шумовым словамP(w)P(w)генерируется случайным образом)
    • ...
    • центральное словоwcw_cиKKшумовое словоwkw_kне появляются в окне тренировочных данных одновременно (шумовые словаwKw_KРаспределение по шумовым словамP(w)P(w)генерируется случайным образом)

мы можем использоватьо(x)=11+exp(x)\sigma(x)=\frac{1}{1+\exp(-x)}функция для выражения заглавного словаwcw_cи фоновое словоwow_oВероятность появления обоих в окне обучающих данных:

P(D=1wo,wc)=о(uoT,vc)P(D=1\mid w_o,w_c)=\sigma(\boldsymbol{u}_o^T,\boldsymbol{v}_c)

Затем центральное словоwcw_cГенерировать фоновые словаwow_oЛогарифмическая вероятность , может быть аппроксимирована как

logP(wowc)=log[P(D=1wo,wc)k=1,wkP(w)KP(D=0wk,wc)]\log P(w_o\mid w_c)=\log[P(D=1\mid w_o,w_c)\prod_{k=1,w_k\sim P(w)}^KP(D=0\mid w_k,w_c)]

Гипотетическое шумовое словоwkw_kИндекс в словареiki_k, приведенную выше формулу можно переписать как

logP(wowc)=log11+exp(uoTvc)+k=1,wkP(w)Klog[111+exp(uikTvc)]\log P(w_o\mid w_c)=\log\frac{1}{1+\exp(-\boldsymbol u_o^T\boldsymbol{v}_c)}+\sum_{k=1,w_k\sim P(w)}^K\log[1-\frac{1}{1+\exp(-\boldsymbol u_{i_k}^T\boldsymbol{v}_c)}]

Поэтому центральное словоwcw_cГенерировать фоновые словаwow_oФункция потерь

logP(wowc)=log11+exp(uoTvc)k=1,wkP(w)Klog11+exp(uikTvc)-\log P(w_o\mid w_c)=-\log\frac{1}{1+\exp(-\boldsymbol u_o^T\boldsymbol{v}_c)}-\sum_{k=1,w_k\sim P(w)}^K\log\frac{1}{1+\exp(\boldsymbol u_{i_k}^T\boldsymbol{v}_c)}

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

Точно так же модель непрерывного мешка слов также может быть подвергнута отрицательной выборке. родственные фоновые словаw(tm),...,w(t1),w(t+1),...,w(t+m)w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)}

Создать заглавное словоwcw_cФункция потерь

logP(w(t)w(tm),...,w(t1),w(t+1),...,w(t+m))-\log P(w^{(t)}\mid w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)})

При отрицательной выборке это можно аппроксимировать как

log11+exp[ucT(vo1+...+vo2m)/(2m)]k=1,wkP(w)Klog11+exp[uikT(vo1+...+vo2m)/(2m)]-\log\frac{1}{1+\exp[-\boldsymbol{u}_c^T(\boldsymbol{v}_{o_1}+...+\boldsymbol{v}_{o_{2m}})/(2m)]}-\sum_{k=1,w_k\sim P(w)}^K\log\frac{1}{1+\exp[\boldsymbol{u}_{i_k}^T(\boldsymbol{v}_{o_1}+...+\boldsymbol{v}_{o_{2m}})/(2m)]}

Последовательный софтмакс

Иерархический softmax использует двоичное дерево. Каждый листовой узел дерева представляет собой словарьVVкаждое слово в . каждое словоwiw_iСоответствующий вектор словvi\boldsymbol{v}_i. Давайте возьмем следующий рисунок в качестве примера, чтобы описать рабочий механизм последовательных слоев softmax.

ПредполагатьL(w)L(w)находится от корневого узла бинарного дерева до репрезентативного словаwwколичество узлов на пути листовых узлов и установитьn(w,i)n(w,i)во-первыхiiузел, вектор этого узла равенun(w,j)\boldsymbol{u}_{n(w,j)}. Возьмем приведенную выше картинку в качестве примера,L(w3)=4L(w_3)=4. Затем любые слова, которые должны быть рассчитаны с помощью модели с пропуском слов и модели набора непрерывных слов.wiw_iсгенерированное словоwwВероятность:

P(wwi)=j=1L(w)1о([n(w,j+1)=left_child(n(w,j))]un(w,j)Tvi)P(w\mid w_i)=\prod_{j=1}^{L(w)-1}\sigma([n(w,j+1)=left\_child(n(w,j))]·\boldsymbol{u}_{n(w,j)}^T\boldsymbol{v}_i)

Среди них, еслиxxправда,[x]=1[x]=1;Напротив[x]=1[x]=-1

так како(x)+о(x)=1\sigma(x)+\sigma(-x)=1,wiw_iВероятность появления любого слова в словаре равна 1:

w=1VP(wwi)=1\sum_{w=1}^VP(w\mid w_i)=1

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

P(w3wi)=о(un(w3,1)Tvi)о(un(w3,2)Tvi)о(un(w3,3)Tvi)P(w_3\mid w_i)=\sigma(\boldsymbol{u}_{n(w_3,1)}^T\boldsymbol{v}_i)·\sigma(-\boldsymbol{u}_{n(w_3,2)}^T\boldsymbol{v}_i)·\sigma(\boldsymbol{u}_{n(w_3,3)}^T\boldsymbol{v}_i)

Исходя из этого, мы можем использовать стохастический градиентный спуск для итеративного вычисления всех векторов слов в словаре в модели пропуска слова и модели непрерывного набора слов.v\boldsymbol{v}и вектор нелистовых узловu\boldsymbol{u}. Вычислительная стоимость каждой итерации определяется выражениемO(V)O(|V|)Уменьшить до высоты бинарного дереваO(logV)O(\log|V|)

Последний вопрос, как устроено бинарное дерево иерархического софтмакса?

Бинарное дерево Дерево Хаффмана здесь, вес - это частота встречаемости слова в корпусе