自然言語処理勉強結果「単語の分散表現」

自然言語処理学習結果

前々回、単語の意味理解の一つとして、
コーパスを利用して共起語に着目する
手法を解説した。

これは、
次元が大きくなりすぎるという問題点があり、
それをなんとか削減したかった。

今回は、そんな問題点を回避するために、
前回解説したニューラルネットワーク
利用する方法を解説しよう。

これに、単語の分散表現と呼ばれる
ベクトルを使用する。

このニューラルネットワークのモデルとして、
二つを紹介していこう。

なお、本講座は以下の本を参考に進めている。

もしよかったら、中身を覗いてみて欲しい。

https://amzn.to/3gMSl4P
スポンサーリンク

単語の分散表現

単語の分散表現とは、
大規模なコーパスニューラルネットワーク
用いて得られる、
単語の意味を表すベクトルのことだ。

前々回の共起語ベクトルと似ているが、
ちょっと違うので注意しよう。

分散表現は通常は数百次元で、
共起語の数万ベクトルに比べれば相当少ない

また、共起語ベクトルでは
ほとんどがゼロとなっていたが、
分散表現各成分が0以外の実数値を取る。

イメージなのだが、
各単語をベクトル空間の中に埋め込む
ようなものだ。

このようなイメージから、
単語埋め込みと呼ばれることもある。

分散表現を求めるツール

先に、ツールを一つ紹介しよう。

分散表現のベクトルを計算してくれる
ツールとして、word2vecというものがある。

概要は…Wiki先生に頼ろう。

Word2vec - Wikipedia

これは、自分でコーパスを用意して、
学習用のハイパーパラメータを
指定する
ことにより、単語ごとに
分散表現を求めてくれるのだ。

このコーパスも、
すでに配布してくれるサイト様があるので、
よかったら調べてみよう。

分散表現を求めるモデル

ここからは、実際に分散表現
どのように求めているのか、
二つのモデルを紹介しよう。

以下の二つで、両方とも
ニューラルネットワークを用いた手法だ。

  • 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}$$

となり、「王」、「男性」、「女性」から
「女王」の分散表現が推測できる。

おわりに

今回は、分散表現というベクトルを
求めるための考え方をご紹介した。

ここまで、
単語の意味理解がかなり続いていた。

ようやく、次回から文の意味理解
進んでいこう。

これまで解説した内容も出てくるようなので、
以前の内容も振り返りながら進めていこう。

コメント

タイトルとURLをコピーしました