読者です 読者をやめる 読者になる 読者になる

超言理論

特に益もない日記である

PyBrainでNNLMのようなものを作ってみる

PyBrainの取り扱いもだいたいわかってきたのでNNLM(Neural Network Language Model;ニューラルネット言語モデル)を作ってみる。
(この記事は書きかけです。内容は後日訂正される可能性があります。ご注意ください。)


NNでは直接「語」を取り扱えないので、単語リストを作って、リストのどの位置に該当するかを入出力とする。(コンビニでたばこを買うときに、銘柄の分からない店員に「16番のたばこです」と指示するのとちょっと似てる。似てない?)
ということで、まず学習に使うコーパスのすべての単語をリスト化する。
f:id:ma-aqua:20130816031052p:plain
この単語リストは一覧表なので、被ったものは載せないこと。

次に、ニューラルネットワークを構築する。
作りたいNNLMが3-gramなら、入力は(2 * 単語リスト長)になり、5-gramなら入力は(4 * 単語リスト長)になる。つまりN-gramのとき((N-1) * 単語リスト長)の入力を持つ。
そして出力は入力に関わらず(単語リスト長)になる。
f:id:ma-aqua:20130816031100p:plain
で、入力はそれぞれ単語をさかのぼっていったとき、その単語が単語リストに一致する場所を1に変えたリストになります。
f:id:ma-aqua:20130816031657p:plain
そして、出力はそれぞれの単語がその次に続く確率(相対)になっています。特に、出力層にシグモイド関数なんかを使っていると、それぞれの単語に割り当てられる値は0~1の間になりますが、全単語に充てられている数値を足してもちょうど1になったりはしません。
なので、これを確率に直すときは、出力から事後確率を計算します。
f:id:ma-aqua:20130816032429p:plain
全体の総和で割って正規化するだけ、簡単ですね。最尤の語を探すだけとかなら、正規化しなくても、最大の出力に対応する単語リストの語を引っ張ってくるだけでなんとかなります。

ちなみに、この例では入力が「... 天気 今日」のとき、出力が「」でその確率は33%となります。

ニューラルネットワークは基本的に小さい要素の組み合わせによる表現(例えば、棒や点などの小さい要素の集まりから、その組み合わせとして文字を判別するとか)が得意といわれていますが、多分言語もそれに漏れず、きちんと学習すれば品詞とか活用とかから次に出てくる単語とその確率を予測できるのでしょう。


で、そこそこ書いたところでサンプルコードと実行結果をと思ったのですが…

$ python nnlm.random.gen.py nnlm.trained nnlm.wordlist 3
おまえ 自分 導か 範囲 な 許せる が が 高い も 『 名 うける 神 問題 ど に れる ? くらい それ わたし でしょ 範囲 「 と 『 として は に けど よう 的 行く し それから を かるい 納得 お答え ところ みる それ “ 思う 範囲 飽き飽きし 死ぬ 考える それから 。 お答え 好き 。 かも と ひ に 数値 、 『 な 「 に 。 ナン ください ね 詳しい もの に その 見 それから ある の ほど られ 。 。 つ のこる かしら が それから に で が ある 自分 の 帰結 、 意識 もの が と ください けど 。 ある は 許せる 」 高い ナン ひ する けど “ そのもの それから 連盟 一生 それ は わ もう くらい 納得 は 、 そのもの おまえ ある 方 範囲 ほど 「 する ほど きつき ください 信じ の 目 ' 目 と す 一致 働きかける 「 あり 。 『 欠員 で 。 という 。 『 。 」 「 陸 は 。 高い 高い て そのもの 。 は けど なる ない 思いやり ある はね 連中 満足 も 満潮 だ 百 ある 「 信じ けど 「 高い みる に の 信じ に と それから きつき と が 行く 近く 満足 きつき な 思う 、 きつき くらい ぞっと で だ 問題

「やべえ、学習失敗してるってレベルじゃねーぞ」って感じの結果になってしまったので、もうちょっと改良してから出すことにします。
多分原因はニューラルネットワークの隠れ層のニューロン数と層数を小さくし過ぎたせいで、うまいこと学習がいかなかったからですね。(何をトチ狂ったのか単語数が数万くらいあるのにニューロン数30とかにしてましたので…)



ということで、とりあえず再学習して更新する予定です。予定は未定ですが。


Copyright © 2012-2016 Masahiro MIZUKAMI All Rights Reserved.