自然言語処理
NLP
word2vec
WordEmbedding
Skip-gram

はじめに

Word2vecのモデルの一つであるSkip-Gramについて説明する。

Skip-Gram

Skip-Gramとは、雑に言うと、「ある単語が与えられたときに、その周囲に現れる単語を予測する」という問題を考え、これを精度よく答えられるように各単語の分散表現ベクトルを学習していくモデルである。

今以下のような語彙リストと文を考える。
V={$I$, $am$, $like$, $a$, $student$, $apple$}

$I$ $am$ $a$ $student$.

$am$を今注目する単語とする。このとき、$P(I|am)$と$P(a|am)$が高くなってほしい。逆に$P(like|am)$が低くなってほしい。

Skip-Gramのモデルは下記のように定式化できる。

\max \dfrac{1}{T}\prod_{t=1}^{T} \prod_{-m\le j \le m, j\neq 0}P(w^{(t+j)}|w^{(t)})             \tag{1} 

$w^{t}$を今注目する単語とし、周囲の前後$m$個単語について出現する条件付き確率を計算する。この条件付き確率を文全体を通して最大化する。ここで、$m$はウインドウサイズ(window size)と呼ぶ。$T$はの文の長さとする。

次に、(1)式を変形して、次のようになる。

\min-\dfrac{1}{T}\sum_{t=1}^{T} \sum_{-m\le j \le m, j\neq 0}\log P(w^{(t+j)}|w^{(t)})         \tag{2}

ここで、(2)式の中の確率の部分について詳しく説明する。
語彙のリストを$V$とする。注目する単語を中心語(center word)と呼び、$w_{c}$と表す。周囲の単語を背景語(outside word)と呼び、$w_{o}$と表す。中心語$w_{c}$を表すベクトルは$v_{c}$とする。背景語$w_{o}$を表すベクトルは$u_{o}$とする。

$w_{c}$の周囲に$w_{o}$が出現する確率はsoftmax関数を使って次のように計算する。

p(w_{o}|w_{c})=\dfrac{\exp(\textbf{u}_{o}^{T}\textbf{v}_{c})}{\sum_{i \in \textit{V}} \exp(\textbf{u}_{i}^{T}\textbf{v}_{c})}   \tag{3}

ここで注意すべきところは、任意の単語wは中心語として使われる時もあるし、背景語として使われる時もある。したがって、任意の単語は二種類のベクトル表示がある。

学習する際に交差エントロピー関数を使って学習すればよいが、そのときの勾配の計算は次のようになる。

\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{v}_{c}}=
\textbf{u}_{o} - \sum_{j \in \textit{V}}\dfrac{\exp(\textbf{u}_{j}^{T}\textbf{v}_{c})}{\sum_{i \in \textit{V}}\exp(\textbf{u}_{i}^{T}\textbf{v}_{c})}\textbf{u}_{j}   \tag{4}
\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{u}_{o}}=
\textbf{v}_{c} - \dfrac{\exp(\textbf{u}_{o}^{T}\textbf{v}_{c})}{\sum_{i \in \textit{V}}\exp(\textbf{u}_{i}^{T}\textbf{v}_{c})}\textbf{v}_{c}   \tag{5}

また、(4)式と(5)式はそれぞれ次のように変形できる。

\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{v}_{c}}=
\textbf{u}_{o} - \sum_{j \in \textit{V}}P(w_{j}|w_{c})\textbf{u}_{j}   \tag{6}
\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{u}_{o}}=
\textbf{v}_{c} - P(w_{o}|w_{c})\textbf{v}_{c}   \tag{7}

(6)式から分かるように、一つの$v_{c}$について勾配を求めるには、$j \in V$を満たすすべての$w_{j}$について出現する確率を求める必要があるため、Skip-Gramの計算量が非常に大きい(実質不可能)。したがって、これを避けるため、Skip-GramではNegative Samplingという手法が使われて、Skip-Gram Negative Sampling(SGNS)と呼ばれることが多い。