病みつきエンジニアブログ

機械学習、iPhoneアプリ、Javascript,Ruby on Railsなどなど。

ニューラル言語モデルは何を目的としているのか? 〜 「A Neural Probabilistic Language Model」を途中まで読んだ

word2vecでさんざん遊んだ皆さん、こんにちは。

今日は、word2vecの元になった論文の元になった論文の先行研究になっている論文「A Neural Probabilistic Language Model(Yoshua Bengio)」の紹介です。

word2vecは、単語の素性で足し算・引き算ができたり、単語の類推(アナロジー)ができたり、単語の素性の面白さが注目されています。とは言え、ニューラルネットによる言語モデルは、別に単語の素性で遊ぶために作られたわけではありません

ということで、ニューラルネットによる言語モデルの本家(?)である「確率的ニューラル言語モデル(Bengio先生)」の論文から、「そもそも何を目的にモデリングしているのか」「なぜニューラル言語モデルが必要なのか」というあたりを、紹介したいと思います(主にIntroductionの部分、ということになります。)。

誤訳はないように心がけているつもりですが、何かありましたらご指摘ください。また、「元論文-数式+例え」な感じで書いているので、元論文と合わせて読むと良いと思います。

何を目的にモデリングしているのか

ざっくり言うと「次に来る単語を予測すること」です。これはニューラルネットによる言語モデルに限った話ではありません。統計的言語モデル一般について言っていると思います。

もう少し厳密に言うと、「ある単語列が与えられたとき、次にどんな単語が来るか、の条件付き確率を学習すること」です。論文中でも「統計的言語モデルは、言語における単語の連なりの条件付き確率関数を学習することが目的だ」と書かれています。

数式で書くと、 p( word _ { t } | word _ { t-1 }, word _ { t-2 }, word _ { t-3 }, ..., word _ {t-n + 1})ということです(n:直前の単語何個を扱うか)。

これは、語順をBag-of-Wordsのようには捨てていないことも意味します。例えば「私、は、今日、料理、を、」という単語列の次に続く単語は、「した」とか「する」とか、「したい」とか、多分そういう単語です。間違っても「にんじん」とかじゃないですね。このような「単語列に対して、どういう単語が来そうか」という確率を求めるようなモデルを学習します*1

余談ですが、一方で、LDAとかは異なります。こちらは文書(≠文章)が持つトピック(話題など)の分布を推定したり、トピックごとの単語の出現確率を推定していますが、「Bag-of-Words」という形で文書を扱うので、語順を捨てています。ニューラルネットによる言語モデルとLDAは、「単語の素性を獲得できる」という一面は少しだけ似ていますが、それ以外は大きく異なります。

なぜニューラルネット言語モデルが必要なのか

先ほど述べた統計的言語モデルの文脈の中で、なぜニューラルネットによる言語モデルが必要とされたのか、という話です。

理由としては、ニューラル言語モデルよりも前の統計的言語モデルだと「次元の呪い」が起こり、学習困難だから、と書かれています。

まず、既存(当時)手法の問題点を説明します。例えば、「私、は、今日、料理、を、」の次に来る単語を予測したいとすると、「私、は、今日、料理、を、(何かの単語)」という連なりをたくさん収集して、(「私、は、今日、料理、を、(ある単語)」の発生数÷「私、は、今日、料理、を」の発生数)を計算しなければなりません。この例では5単語の連なりパターンが考えられます。語彙の数が仮に10万あったとすると、単語列のパターンは 100,000^{5} - 1 = 10^{25} - 1ぐらいあります。このような膨大なパターンの中から「私、は、今日、料理、を、(何かの単語)」という奇跡的な連なりを観測して、(何かの単語)がどれくらいの確率でやってくるのか、というのをカウントしなければなりません(もちろん、DBに保存するのもしんどいですね)。

しかしパターン数が膨大すぎると「ほとんどのパターンは発生しない」という問題が起こります。とはいえ、ただ観測されないだけであって、本当に0とは言えません。そこで「ほぼ0」の代わりに「0.1%」みたいな値でスムージングしたり、次元を削減したりします。

次元削減の考えとしては、例えば単純には、「を、」の次に来る単語を予測してあげるようなものにするとよいです。もう少し正確に言えば、n-gramモデルにおけるnを、1とか2とか、より低次なものにして、組み合わせパターンを減らします。ただし、「を、」の次に来る単語を予測できるよりも「私、は、今日、料理、を、」の次に来る単語を予測できる方が嬉しいのは明らかですし、そちらの方がより文脈を汲み取れるはずです。そういったトレードオフの元で、n-gramのnを減らすことになります。

また、スムージングについては言語モデル入門 - Topics Related to Computers and NLPに紹介されています。スムージングによる手法が意外とperplexityが低くてびっくりしました。Kneser-Ney スムージングによる文書生成 - Mi manca qualche giovedi`?も面白い結果がわかると思います。

さて、ニューラル言語モデル(そしてニューラルネットを使った言語モデル)は上の問題をどう解消しているのか、という説明に入ります。

単純な説明としては、「単語列」を「(単語の特徴を十分によく表すような)ベクトル列」として扱います。

これを例示的な説明に変えてみます。「私、は、今日、料理、を、」という列と全く同じ列は発生しにくいけど、似ている列なら発生しやすい、ということを利用します。具体的には「俺、は、明日、料理、を、」とか「彼、は、昨日、料理、を、」とか。そして「俺」「私」「彼」が似たような語順や文脈で使われることが期待されるので、獲得されたこれらの単語の特徴量は似てきます。他の単語も同様です。各単語をただの文字列として扱ったとき、コンピューターには各文字列の関係性はわかりませんが、特徴量ベクトルは類似します*2。結果として、「ある特徴量ベクトル列と似たような特徴量ベクトル列」というふうに一般化されれば、「ある単語列と全く同じ単語列」よりも確率が"スムージング"されます。

また、パラメータの増加の仕方も抑えられます。下の図は、論文に載っていたニューラルネットの構造に、注釈を付け加えたものです。

f:id:yamitzky:20140426101955p:plain

ニューラル言語モデルの中間層の出力はtanh(bias+Hx)で表わせるのですが、xは特徴量ベクトルの列 x = \left  [ C(w _ {t-1}), C(w _ {t-2}), ..., C(w _ {t-n+1}) \right ] という、(特徴量次元)がn個ならんだ行列です。特徴量次元は自分で設定できます(word2vecのときはたかだか100次元ぐらいとかで設定しました)。結果として、Cのパラメータ数(この場合、行列の大きさ)は語彙数に線形に増加し、Hのパラメータ数は予測に使用する単語列の数(n)に線形に増加します。一方で、先ほどの既存手法ではパラメータは vocab^{n} に指数的に増加してしまっていました。結果として、ニューラルネットを使ったモデルの方が次元の呪いを回避できる、という算段です。

なぜ単語の素性が獲得できるのか

ここでいう単語の素性とは「単語ごとを表すベクトル」です。word2vecでは、これを足し引きして、アナロジーとか類似度計算をしていたわけですね。

すごーくざっくり言うと、モデル(ニューラルネット)が特徴量(素性)抽出をするから、と言うといい気がします。

このモデルは、最終的に精度よく「次の単語」を予測できるように、単語の特徴を十分によく表すように圧縮した特徴量ベクトルを獲得します。「エントロピーを下げてくれるような特徴量」と言うといいような気もします。

先ほどの「私、は、今日、料理、を、」の列のたとえに戻ります。例えば、「(無意味な特徴量)、(無意味な特徴量)、(無意味な特徴量)、(無意味な特徴量)、(無意味な特徴量)、」という列の次の単語は、全く予測できるような気がしません。その逆に各単語を十分に表すような良い特徴量が獲得できれば、次に来る単語を予測できるようになります。

ニューラル言語モデルの学習時には、正しく予測できるように、Back propagationによって特徴量が学習され、最終的に良い特徴量(素性)が完成します。

なぜ単語の素性で足し算/引き算ができるのか

ニューラルネットによる単語のベクトル表現の学習 〜 Twitterのデータでword2vecしてみた - 病みつきエンジニアブログについてです。

答えについては、知らないので、誰か教えてください。。。(というのを聞きたくてこのブログを書いたに等しいかも)

ちなみにこのニューラル言語モデルでもそれができるのかも知りません。このモデルができた当時にはそのような話はないような気がしますが、僕は当時小学生だったので知りません。でも多分、Tomas MikolovによるRecurrent Neural Network Language Modelが初出な気がしますが、歴史的経緯はあまり知らないのでご指摘いただけると。。。

終わりに

ニューラルネットは研究で使ったことがないので、誤りを含むかもしれません。何か間違いや不正確な表現、またはわかりにくい表現がありましたら指摘していただけると幸いです。

参考文献

*1:一応、学習結果として、重みの出方で語順が葬り去られることもなくはないと思いますが

*2:明確に文法的特徴がここに置かれるわけではありませんが、特徴量ベクトルの類似度の結果を見ると、同じ品詞のものが似ているとされたりします。例えば「北海道」と「名古屋」など。その反例もありますが、学習データ量が足りないと顕著になります