プログラミングと機械学習のメモ
日付: カテゴリ: 自然言語処理
word2vecとは、ニューラルネットワークを用いた単語の分散表現の一種であり、単語の類似度の算出や、単語の足し算ができる。有名なのは、「王様」-「男」+「女」=「王女」を計算で算出できるという例である。具体的な例が見たい方は、次のブログの下の方の「SGNSの結果を見よう」を参考にしていただきたい。
近年の自然言語処理の中で、word2vecは簡単に実装でき、結果が直感的にわかりやすいため、多用されている。しかし、実際中身はどうであるかはちゃんとは理解できていなかったので、今更ではあるがここにまとめる。
word2vecには、CBOWとSkip-Gramの2種類が存在するが、ここでは精度が高いと言われているSkip-Gramを解説する。
Skip-Gramはある単語が与えられたときに、周辺単語が何であるかを予測するタスクをニューラルネットワークで解かせ、その中間層を単語のベクトルとして取得する。以下では、中間層は200次元とする。
単語ベクトルはone-hotなので、中間層のベクトルはInputからの重み行列の該当単語の行成分をそのまま取ってきているだけである。この層をEmbedding Layerという。このようにして学習した中間層を取得し、単語の分散表現を得ている。
【追記】
言葉だとわかりづらいと思うので、Embedding Layerの説明を追加。one-hotの計算は結局重み行列の行成分を取り出しているだけ。
通常のSkip-Gramでは、単語数の多値分類になるので、単語数が増えれば0に近づける学習が非常に多く、効率が悪い(例えば、周りの10単語を学習するにしても1となるのはその10単語だけで、それ以外の単語は全て0として学習される)。そこで、周辺単語以外の単語をサンプリングして、二値分類にしてしまおうというのがSGNSである。
周辺単語以外の単語のサンプリング方法は、単語頻度によって重みをつける。ただし、そのまま頻度を使用すると頻出しない単語がほとんど出てこないため、単語の個数に3/4乗するとよいらしい。つまり、それぞれの単語$w_i$が選ばれる確率は次の式になる。
\[ P(w_i)=\frac{|w_i|^{3/4}}{\sum_{w_j}|w_j|^{3/4}} \]これにより、通常のSkip-Gramより高速に学習することができる。
次回では、pytorchによる実装を試みる。