studylog/北の雲

chainer/python/nlp

LSTM+トピック

全国的にはそろそろ春なんでしょうか。札幌は段々と暖かくなってきましたが今日の夜は氷点下6度だそうです。北海道の冬は長い。早く自転車に乗りたいです。

LSTMでの文生成の限界

狭い分野に限られたコーパスだとそれなりの文を生成できますが、ニュースやwikipediaなど幅広い分野の単語が登場するコーパスだとほとんど文になりません。wikipediaコーパスだとこういうやつを平気で出力してきやがります。

情報化社会における織田信長コンスタンティノープルの陥落については諸説ある。

文法は正しいけど意味がめちゃくちゃ。

ようするに名詞が駄目。accが0.35ぐらいの言語モデルを品詞ごとに調べてみると助動詞は0.5、助詞0.4、動詞0.35に対して名詞は0.05でした。登場頻度は名詞が最も高いのにaccが低すぎるために意味が通らない文になってしまう。

トピックを入れる

そこで、文生成時に今生成しようとしている文の「トピック」を入れてやれば名詞の精度が高まるんじゃないかと以前から考えていました。上のめちゃくちゃな例文の「情報化社会」「織田信長」「コンスタンティノープル」は意味的に非常に遠い単語なので一緒の文に出てくる可能性は低いはずなのに、シンプルなLSTMだとあまりその辺りを消化してくれていない。なのでトピックを入れてやれば「織田信長」についての文ならそれに関連する名詞を優先的に使ってくれるのではないか、という感じです。

[1602.06291] Contextual LSTM (CLSTM) models for Large scale NLP tasks

この論文は次の文字予測(LM)、次の文を選択などのタスクでContextual/Topicという概念を付与することで性能が上がった、ということみたいです。f:id:kitanokumo:20160309155723p:plain
(上記論文PDFより引用)
前の単語だけではなく前の文やパラグラフのトピックを入れることで性能が2~3%上がっています(perplexityは低い方が性能が上)。次の文の選択タスクでは20%程度の性能向上らしいです。

LMについては期待したほどperplexityが下がっていないようですが、名詞出力専用のネットワークを別に作って組み合わせるとか、あるいは無理してニューラルネットワークで全部やらないなど工夫次第でもう少し性能は高められそうな気がします。