前々回、単語の意味理解の一つとして、
コーパスを利用して共起語に着目する
手法を解説した。
これは、
次元が大きくなりすぎるという問題点があり、
それをなんとか削減したかった。
今回は、そんな問題点を回避するために、
前回解説したニューラルネットワークを
利用する方法を解説しよう。
これに、単語の分散表現と呼ばれる
ベクトルを使用する。
このニューラルネットワークのモデルとして、
二つを紹介していこう。
なお、本講座は以下の本を参考に進めている。
もしよかったら、中身を覗いてみて欲しい。
単語の分散表現
単語の分散表現とは、
大規模なコーパスとニューラルネットワークを
用いて得られる、
単語の意味を表すベクトルのことだ。
前々回の共起語ベクトルと似ているが、
ちょっと違うので注意しよう。
分散表現は通常は数百次元で、
共起語の数万ベクトルに比べれば相当少ない。
また、共起語ベクトルでは
ほとんどがゼロとなっていたが、
分散表現は各成分が0以外の実数値を取る。
イメージなのだが、
各単語をベクトル空間の中に埋め込む
ようなものだ。
このようなイメージから、
単語埋め込みと呼ばれることもある。
分散表現を求めるツール
先に、ツールを一つ紹介しよう。
分散表現のベクトルを計算してくれる
ツールとして、word2vecというものがある。
概要は…Wiki先生に頼ろう。
これは、自分でコーパスを用意して、
学習用のハイパーパラメータを
指定することにより、単語ごとに
分散表現を求めてくれるのだ。
このコーパスも、
すでに配布してくれるサイト様があるので、
よかったら調べてみよう。
分散表現を求めるモデル
ここからは、実際に分散表現を
どのように求めているのか、
二つのモデルを紹介しよう。
以下の二つで、両方とも
ニューラルネットワークを用いた手法だ。
- skip-gram
- CBOW
また、説明の都合上、コーパスに出現する
単語の種類数を\(N\)としよう。
skip-gram
skip-gramは、
コーパスにおけるそれぞれの単語の出現から、
前後\(n\)単語以内に出現する
単語(=共起語)を予測する。
このために利用するのが、
以下の条件となるニューラルネットワークだ。
- 入力層のユニット数:\(N\)
- 中間層のユニット数:\(L\)
- 出力層のユニット数:\(N\)
入力層と出力層の各ユニットは、
出現する\(N\)個の単語に対応している。
それに対し、中間層は\(L\)個と書いたが、
これは大体数百個くらい。
ここでやりたいことは、
ある単語一つだけを入力して、
その共起語が他よりも高い出力をすること。
というわけで、この入力ベクトルは、
対象の単語だけ1、他は0のベクトルだ。
このような、一つだけ1で、
他が0であるベクトルのことを
one-hotベクトルと呼ぶ。
ここで、今\(i\)番目の単語について
見るとしよう。
つまり、入力は\(i\)番目だけ1の
one-hotベクトルだ。
前回の解説と同じように、
\(i\)番目の入力層ユニット\(x_i\)から、
\(j\)番目の中間層ユニットへの辺の重みを
\(w_{ji}\)と置こう。
すると、中間層への入力\(u_j\)は、
以下の式で表されていた。
$$u_j = \sum_{i = 1}^Nw_{ji}x_i$$
ここで、今\(x\)は\(x_i\)だけ1、
他は0なので以下のように変形できる。
$$
\begin{eqnarray}
u_j & = & \sum_{i = 1}^Nw_{ji}x_i \\
& = & w_{j0}x_0 + w_{j1}x1 + … + w_{ji}x_i + … + w_{jN}x_N \\
& = & w_{j0} \times 0 + w_{j1} \times 0 + … + w_{ji} \times 1 + … + w_{jN} \times 0 \\
& = & w_{ji}
\end{eqnarray}
$$
非常にシンプルになった。
要するに、中間層への入力\(u_j\)は、
単純に辺の重み\(w_{ji}\)で表されるのだ。
これを使って、
出力層の出力まで計算が行われる。
その結果は、
共起語だけ値が高くなるよう学習されるので、
誤差逆伝搬法によって
辺の重みが調整されていく。
そして、学習を終えた後、
辺の重み\(w_{1i}, w_{2i}, …, w_{Li}\)のベクトルが、
分散表現として得ることができる。
CBOW
CBOW(Continuous Bag Of Words)とは、
ある単語の前後に出現する複数の共起語を
同時に入力して、対象単語を出力する、
という考え方で
ニューラルネットワークを使う。
…本にはこれしか説明がなかった。
細かい部分が曖昧なので、
詳細な説明は避けるとしよう。
分散表現の使用例
上で、分散表現を求める方法を見てきた。
次は、求めた後どうするか
というお話をしていこう。
まず、これまでと同じく
類似度を求めることができる。
これには、これまた前々回出てきた
コサイン類似度が使える。
詳細はそちらを参照してもらおう。
自然言語処理勉強結果「単語の共起関係と意味」 | Shino’s Mind Archive
その他、類推というものができる。
これは、二種類の組について、
意味の関係を推測するもの。
例えば、「王」と「女王」、
「男性」と「女性」について。
これら二つの関係は、どちらも
性別の差があるので、
差が似ていると考えることができる。
分散表現はこのあたりを
うまく反映してくれており、
ベクトルの計算でも似た数値が得られるのだ。
$$word_{king} – word_{queen} \sim word_{man} – word_{woman}$$
こんなイメージ。
これを使って、新しい単語の
ベクトルを推測することができる。
上の式で、\(word_{king}\)を移項し、
両辺に-1を掛けると、
$$word_{king} – word_{man} + word_{woman} \sim word_{queen}$$
となり、「王」、「男性」、「女性」から
「女王」の分散表現が推測できる。
おわりに
今回は、分散表現というベクトルを
求めるための考え方をご紹介した。
ここまで、
単語の意味理解がかなり続いていた。
ようやく、次回から文の意味理解に
進んでいこう。
これまで解説した内容も出てくるようなので、
以前の内容も振り返りながら進めていこう。
コメント