Memory Networks
Jason Weston, Sumit Chopra, Antoine Bordes, 2015, ICLR
Facebook - The bAbI project
記憶装置を持ったようなQA向けのフレームワーク。
名前から誤解しがちだが、Neural NetworkはあくまでMemory Network内の1つのモジュールであるだけで、話の焦点自体はNNではない。また、NNを使わずともMemory Networksは実現できる(たぶん精度負けるからやられないだろうけど)。
本論文ではNNを利用したモデルを例に説明。
追記(15/6/1): Stanfordの講義スライド -Memory Networks編-。
追記(16/6/1): Stanfordの講義スライド更新。shibataさんコメントありがとうございます。
Memory Networksの要素は5つ。
- m: memory。記憶部。各オブジェクトにmjの配列。
- I: input feature map。入力変換部。外部からの入力を内部用の素性表現に変換する。
- G: generalization。記憶更新部。新たな入力で記憶を更新する。記憶を圧縮したり一般化したりできる。
- O: output feature map。内部出力部。新たな入力と今の記憶状態からある値(素性表現等)を出力(取得)する。名前はoutputとなっているが、「どの記憶を使うかを決める」という役割っぽい。
- R: responce。応答部。内部出力を実際に求められている形式に変換して出力する(e.g., テキスト、行動)。本論文では、選別された記憶と入力から出力を決定する役割。
そして実際に動かしたモデルの説明。今回は、テキスト処理によるQAモデル。複数の説明文を受け取った後に、1つの質問文を受け取り、それに対して1単語で解答する。以下にまとめる(リスト番号は上と対応していない)。
- I。文を順番に入力する。(パーズとか素性表現化とかするタイミングはIかG)
- G。それらは記憶部に順に文単位で記録する。(素の文を記録してもいいし、この時点で素性表現を記録してもよい)
- I。質問文xを入力する。
- O。質問文xに対する関連文をmemoryからk個探索する。
- 質問文xを素性化し、それに対する関連スコアs(x,mi)が最大となる文miを決定する。
- もし複数(k>1)の関連文を取得する場合は、s'(x,mi,mj)が最大となる文mjを決定する。本稿では最大のk=2。以下繰り返し。
- R。文x, mi, mj (, ...)から質問文xに対する答え(e.g., 1単語、生成した文)としての適切度スコアso(x,mi,mj)が最大となる単語wを出力する。
これで訓練データに対して上手くいくように(設定した目的関数を最大化するように)、素性表現化、関連スコア算出、解答適切度スコア算出のためのパラメータ(行列)を学習する。ただし今回の実験では素性表現は単なるBag-of-wordsで固定。
実験は主に2つ。(最後におまけ実験で未知語対応能力を調べている)
1つはFaderら(2013)のQAデータセットでの実験。14Mのstatements(subject, relation, tripletの組)をmemoryに記録してからquestionに解答。Q&Aは35Mペア(WikiAnswerから作成)あるらしい。train-testの分割とかは書かれていないので、たぶんfollow先であるFaderらとかBordesら(2014b)に書かれている。結果は、Faderらに大差で勝ってBordesらにもフルモデルでは勝った(O部の処理で文字列マッチも行うようにしないと僅差敗北)。
2つめはBordesら(2010)考案のsimulated world QAというもの。4人と3物体と5つの部屋でそれぞれが物を持ったり落としたりしながら移動しするような世界に関してQA。行動の文起こしは自動的に単純な文法規則で変換生成。7k statements(文数かシナリオ数かは(本論文では)不明)と3kのquestions。こちらの結果も優秀。問いの難易度(言及先がactor/actor+object、手がかり文までの距離が1/5)も変えると、RNNやLSTMと大きな差がつく(MemNNは変わらずほぼ100%で他は17〜50等)。LSTMとかとの記憶性質の違いが分かる実験。
その他。
- ヒント記憶の探索をハッシュで効率的にする方法。これがおそらく実用上かなり重要かつ工夫のしがいがあるポイント。今回試されているのは、単語クラスタごとにバケットを用意しておき、文に含む単語のクラスタを求めて該当するバケット全てに文を入れ、関連文探索時にはgiven文の各単語のクラスタのバケットの記憶のみ探索する、という方法。これはかなり効果的で、14Mの文を記憶した上でのQAタスクにおいて精度がほぼ落とさずに速度は80倍になったとのこと。
- 記憶部への書き込み時刻(入力の時刻)を考慮に入れる方法。素性表現上に時刻を表すような素性(素朴にはmiのインデックスi)を追加して利用するためのあれこれ。
- 文でなく各単語を順に受け取って(受け取れないような状況で?)適当なsegmentを行って記憶していくモデルもある。複文等に強いのかな。
未知語への対応について。隣接単語も合わせたBOWのベクトルとして各単語を表現する方法。探索では素性類似度スコアだけでなく単純に単語一致も確認できるようにする方法。
どのmemoryを使うかの探索で着目する粒度と、実際の詳細な処理に用いる粒度の差がとてもいい塩梅に感じる。膨大な記憶から関連記憶のみを取り出してくるステップは(必要だと思うし)無論軽量に行わなければならないだろう。これができるとなったとしても無尽蔵に記憶するわけにはいけないので、このアプローチで行くとすればその選別もかなり重要だ。言い換え認識とかの(新たな?)フィールドだ。
モデルとしては整然としていて拡張性も高い。なかなか精度もいいし期待がかかる。
記憶するものを文そのものではなく知識とかに拡張することも可能なはず。