studylog/北の雲

chainer/python/nlp

シンプルなRNN/LSTMだけでまともな文章はできない

「プログラムが自動で文章を生成する」

昔からこれにロマンを感じてる。
やってて面白い。

暇つぶしになるし、副次的に色んなことの勉強になるし、もしかしたらいつかいいプログラムが作れてお金になるかもしれない、なんてぼーっと考えてる。

今年に入ってからNN/深層学習を少しかじり出したのでRNN/LSTMで挑戦中。楽しい。

でも実際はなかなかまともな文なんて出来やしない。

前の文字列or単語のみを素性としてRNN/LSTMに与えて学習させるだけのモデルでは、まずまともな文が出てこないという結論に至った。どんだけテキストを増やしても、どんだけ学習回数を増やしても無駄っぽい。

この場合の「まともな文」の定義だけど、
1.文法が正しい (○明日はとても暑い ×明日にが暑い)
2.意味が通る (○今日はトマトを食べた ×今日はトマトが走る)

1と2をどちらも同時に満たすのが「まともな文」だと定義づければ、シンプルなRNN/LSMTでは1すらも怪しいし2はさらに厳しい。

さらに「まともな文章」となるとさらにハードルが高い。
ちゃんと脈絡のある整合性のとれた文章を生成するのは遥か彼方。

繰り返しになるけれど、シンプルなRNN/LSTMを使っていくら学習させても、ちゃんとした文はできない。たまーに、それっぽい意味のある文ができることがあるけど、そこだけ見て「おお!知性が芽生えた!」みたいなのは危険だと思う。

LSTMを二次元、三次元に繋げることでもう少し複雑なタスクもこなせるようになるらしい。でもこういうのを取り入れても厳しいだろうなあと思う。焼け石に水的な。

Grid Long Short-Term Memory
http://arxiv.org/pdf/1507.01526v1.pdf
f:id:kitanokumo:20150831221720p:plain

今考えてること

  • 1.前の文字列のみを素性とするのではなく文法素性や言語資源をふんだんにぶち込む
  • 2.大量に生成した文をからまともなものだけをピックアップする
  • 3.生成した文を人手でチェックして修正する
  • 4.出力に人手で作った厳しい制約を課す
  • 5.学習させる文の種類を極端に狭める

星新一っぽい文章を人工知能で作ろうという野心的なプロジェクト、「きまぐれ人工知能プロジェクト作家ですのよ」は当初2のアプローチでやってたけれど断念したらしい。

研究当初、主語や動詞を変えたり、会話を入れ替えたりした文章を自動で大量に作り、意味が通る文章だけを抜き出す方法を検討したが、単文はできるものの、長文ができる確率があまりに低いため断念。
人工知能は小説家になれるか 長文意味不明、まだ人頼み:朝日新聞デジタル

今は4に近いアプローチだそう。

今は人間が文章構成を考え、狙った文章が出力されるようにプログラムを細かく作り込んでいる。人との「共作」を、9月に理系的な発想力を問う文学賞星新一賞」に応募する予定だ。「プログラム作成者も予期できないくらい、たくさんの種類の文章が生み出せれば、AIが書いたと認めてもらえるのでは」

自分が最近やってるのは3のアプローチで、人が打ち込んだ文字列をリアルタイムにモデルに読ませるとその先の文字列候補を何パターンか提示してくる。そこから自分で選択してもいいし、無視して自分で書き続けることもできるテキストエディタのようなもの。文章のジャンルを極端に絞ったモデルだとわりと実用的になる。例えば野球の試合結果の文章とか。文のパターンが限られてるし、登場する名詞も選手名など限られてるのでやりやすい。

5は例えばクックパッドのレシピだけ読ませるとかね。それなりなレシピの体裁を出力してくれると思う。

名前をつけたい

「プログラムが自動で文章を生成する」
面白いです。面白いけど、まともなものが出来るようになる日は遠そう。

ちなみにこういうのって名前はついてないんですかね?
text_generatorじゃつまんないし。
いい名前を付けたい。