ブログではないです

ブログでなくはないです

Gated Self-Matching Networks for Reading Comprehension and Question Answering [Wang+, ACL'17]

https://www.aclweb.org/anthology/P/P17/P17-1018.pdf

概要

SQuAD QAでSOTAを出しましたという論文。会場で発表を聞いていたけどネットワークが複雑で一回だと良く分からなかった。 改めてもう一度読んでも良く分からなかった。一応読んだのでメモ。

SQuADは文書と複数の質問が与えられ,回答となるそれぞれのスパンを文書から見つけるタスク(のデータセット)。train, devデータのみ配布されて、 testデータについては事前に配られず、公式サイト からテストを受けて結果だけを受け取る形式を取るそうな(どうやってるんだろう?) 公式サイトのトップにランキング形式で結果が乗るのがゲームっぽくて人気が出てるのも頷ける。

このタスクを解く際に元文書からどうやってスパンを取っているのかが分からなかった(SQuAD系列をちゃんと読んだことが無かった)ため試しに読んでみた。

モデル

f:id:jack_and_rozz:20170906233826p:plain:w400

モデルは上図。既存研究の積み重ねをフルに使っており,見ての通りとても複雑。図の下から順に,

  • (1. Question and Passage GRU Layer) Bi-RNNで質問文・元文書をwordとcharacter両方使ってエンコードしてベクトル列 { \displaystyle u_{t}^{Q} }, { \displaystyle u_{t}^{P} } を獲得

  • (2. Question and Passage Matching Layer) { \displaystyle u^{Q} } (質問文をエンコードしたベクトル列全体) をattention-poolingして { \displaystyle c_{t} }を獲得し,文書側のt番目のベクトル{ \displaystyle u_{t}^{P} }とconcatしてRNNに入力。それを文書の単語数と同じ回数だけ繰り返すことで{ \displaystyle v_{t}^{P} }を獲得。{ \displaystyle v_{t}^{P} }は文書のt番目の単語が質問文のどの単語とマッチしているかの情報を持ったベクトル。{ \displaystyle c_{t} }獲得の際のattentionには{ \displaystyle u_{t}^{P} }, { \displaystyle v_{t-1}^{P} } が使われる。(対象となる単語と前のマッチ結果を参考にしている)

この際に,RNNの更新時{ \displaystyle  [u_{t}^{P}, c_{t}]  } ではなく下式で表される { \displaystyle  [u_{t}^{P}, c_{t}]^{*} } を使うというのが提案手法その1。 意図としては文書中のある単語と質問文とのマッチ結果のうち、重要じゃないマッチについてはgateで弱めて入力している感じだろうか。

{ \displaystyle  [u_{t}^{P}, c_{t}]^{*} =   g_{t} \odot [u_{t}^{P}, c_{t}]}
{ \displaystyle g_{t} = sigmoid(W_{g} ) [u_{t}^{P}, c_{t}] }

  • (3. Passage Self-Matching Layer) 提案手法その2。 2. で得たマッチングのベクトルに対してもう一度attention-poolingしてBi-RNNに入力。やっている操作は 2. と同じで、アテンション先・アテンション元のベクトルが変わっているだけ。 正直この操作はよく意図が分からなかった。説明では2. でマッチ結果をgateすることによって重要な部分の情報しか残らなくなってしまうから,文書全体の文脈をもう一度獲得するためにself-matchingするんだ・・・と述べていたが、この操作で本当にそれをしたことになるのか?(そもそもattention-poolingする対象が2.のマッチング結果のベクトルなのだから、その時点で文書の細かい情報なんて無くなってしまっているんじゃないのか?)

  • (4. Output Layer) 回答スパンの初めと終わりを推定するレイヤ。気になっていた部分だが、 Pointer Networks [Vinyal+, NIPS'15] (attentionする時に隠れ層のweighted averageをとるのではなく推定した重みのargmaxを取るだけ。どこに強い重みがあるかのインデックスだけを得る) を使うのがトレンドらしい。 その際に使うのが3.でself-matchingを行って獲得したベクトル。

実験結果

f:id:jack_and_rozz:20170907001437p:plain:w350f:id:jack_and_rozz:20170907001441p:plain:w200

既存研究との比較とablation testの結果が上図。ablation testの結果を見るに提案手法(gating, self-matching)はそれなりの効果がありそう。 ただぶっちゃけこれNNにありがちな手当たり次第あちこち繋げてモデルの複雑度を上げたことで良くなっただけなんじゃないの感がある(失礼)

感想

精度競争が激しいタスクにはありがちだけどいまいち研究の大目標が掴めない感じの論文だった。モデルとかなんでこんなことになってしまったんだ・・・

また、重要なマッチングもそうじゃないマッチングも平等に残るのが嫌でゲート構造を導入したとのことだが、それは結局attentionの際に重みの総和を1にしていることに起因するわけで、Dynamic Entity Representation with Max-pooling Improves Machine Reading[Kobayashi+, NAACL'16]のbyway attention(attentionの際に"どれにもアテンションしない"に相当するベクトルを1つ用意する)とかを使えばいいんじゃないか、とも思った。 特に2つのテキストの単語に対応関係のあることが概ね保証されている翻訳と違って、QAなどのタスクではそもそもattentionする必要のない単語がしょっちゅう出てくるんだから。

Learning to Compute Word Embeddings on the Fly [Bahdanau+, arXiv'17]

https://arxiv.org/abs/1706.00286

概要

Bahdanauの新作。従来の統計的テキスト処理では未知語はUNKトークンに変換された上で共通のものとして扱われるが、そこをWordNetの単語の定義文をエンコード(各単語ベクトルの平均 or LSTMの最終ステート)した補助ベクトルを加えて補うことで未知語についても意味が獲得できるよね、という話。QA (SQuAD), Entailment (SNLI), 言語モデルの3タスクで評価。

基本的な未知語処理のモデルは下図の通りで、それぞれのタスクのベースラインとなるモデルにおいて文をエンコードする際通常のLSTMなどの代わりにこのエンコーダを使うだけ。 また、本研究ではmulti-word expressionについては取り扱っていない。

補助ベクトルとして(1)定義文からなるベクトル表現を用いた場合 (2)定義文の代わりに単語の文字列情報を入れる (“word” という単語に “w o r d” という定義文を与える) 場合 (3)大規模な外部データで事前訓練したGLoVeを用いた場合 の3種類で比較。

f:id:jack_and_rozz:20170905164942p:plain:w400

QAについては[Xiong+ ICLR'17] のモデルがベース。コンテキスト文と質問文をそれぞれエンコードした後それらのベクトル表現をこねこねしてquestion-document representationと呼ばれるものを作り,そこから2つの出力層を使って回答スパンの開始と終了位置を求めるのだとか。 こねこねする部分が微妙に複雑でなんでこんな計算にしてるのか元論文読まないといまいち意図が把握できない。最近のQAこんなんばっかりだ。

f:id:jack_and_rozz:20170905201445p:plain:w300

結果は上の表の通り。devセットの評価では未知語について文字ベースでスペル情報を入れると大きく改善、肝心の辞書情報の方の寄与はやや低め。(ただtestセットでは逆転しているので1~3%程度ならこの精度帯だと誤差?) また、結局一番良いのはGLoVeを用いたときで、それすらも現時点でのSQuADの公式サイトのランキングを見るとまだまだ上位陣 (EM: ~78%)には及ばない。そもそもベースラインがしょぼい。QAでSOTAを取ることが目標というわけではないのだろうけど。
これらを全部同時にやった時の場合は実験しなかったのだろうか?まあまだarXiv版だからこれから色々追加実験するのかもしれない。 他のタスクについても性能向上への寄与は同じような感じ。

また、Future workとして (1) 定義文中の未知語はどうするのか? (2) cyclicな定義はどうするのか(右の反対が左、左の反対が右とか) を上げている。 前者については同様の処理を繰り返す(つまり定義文中の未知語についてもその定義文を用いる)ことが自然だと考えられるが、計算量やメモリの観点からそれを素直にやるのは辛そうだとのこと。この2つは上手いこと解決できたら面白いと思う。

感想

GLoVeによる初期化を"data-rich scenerios" と言っているが、低頻度語・未知語について定義文を得るのと大量のunlabeled dataを得るの、どちらが簡単かなあ? wordnetに定義として登録されてるレベルのちゃんとした表現はむしろ問題になる低頻度語・未知語ほど手に入りにくくなるんじゃないかとも思うので、新しめのエンティティについても 定義文らしいものが早期に記述されるであろうWikipediaのデータを用いた疑似定義文でも有効だよ、ということを実験したほうが良かったのでは。 *1

また、単語の定義文を使うといってもある単語に紐づく lexicon / synsetは複数あるためそこのWSDが必須になると思うのだがそこの処理についての詳しい記述が見当たらなかった気がする・・・?どうしているんだろう。

*1:と思ったらそれもfuture workにあった。データの作成が面倒だったとかそういう・・・?

cloze-style QA まとめ

cloze-style QAタスクについて読んだやつまとめ。(ある程度読んだら追加) 使うデータセットはTeaching Machines to Read and Comprehend [NIPS'15] で公開されたDeepMind QAデータセットが多い。*1 タスクとしてはcontext(ニュース記事など)を読み、その上でquery(ニュース記事に関する1文)中の@placeholderに当てはまるエンティティを選択するというもの。 データはCNNとDaily Mailの2種類存在し、データサイズとしてはCNNが380K記事、Daily Mailが879K記事前後。

cloze-style QAはセンター試験のような穴が空いたテキストに正解の単語を埋める形式のQA。 特にこのDeepMind QAデータセットの面白いところは構築時点でcontext, query共にそれぞれのエンティティが@entity0, @entity1, … といった形で置換されており、 この処理によってエンティティに関する事前知識を持っていた場合に記事を読まずに質問に答えることを不可能にしている。*2

Teaching Machines to Read and Comprehend [Hermann+, NIPS'15]

タスク・データセットの提案に加えて簡単な頻度ベースの選択モデルやFrame-semantic model, Word distance modelといったベースラインとNNベースのモデルを比較。

NNベースでやる場合は回答候補単語 (@entity0 とかのトークン) a, 文書d, クエリqに対して { \displaystyle p(a | d,q) \propto exp(W(a) g(d, q)) } の形で確率を計算。 文書とクエリから構築したベクトルと回答候補aのベクトルの内積になっている。

{ \displaystyle g(d, q)) } の作り方については
(Deep LSTM Reader) : 文書とクエリを区切り文字を使ってくっつけて一気に読む
(Attentive Reader) : クエリベクトルuと,uを用いて文書の各単語にアテンションを掛けたベクトルrの重み付け和を取る
(Impatient Reader) : クエリが1単語読まれる度にその時点でのクエリベクトル{ \displaystyle y_q (i)} と前回の文書ベクトルr(i-1),文書の各単語を用いてアテンションを掛けてr(t) を計算し直す
などをやっている。AttentiveとImpatientには結果(Accuracy) の差はあまりなくニューラルにして5%, アテンションを掛けてもう5%向上といった感じ。

Dynamic Entity Representation with Max-pooling Improves Machine Reading [Kobayashi+, NAACL'16]

以前言語処理学会で見て面白いなあと思っていた研究。[Hermann+, NIPS'15] では文書・クエリのベクトル表現の話が中心で回答候補のベクトルについては特に何もしていなかったが(というよりそれがこのタスクの重要なところじゃないの?という気がするけど)、それに対して文書から動的に対象となるエンティティのベクトル表現を構築することがメインテーマ。

提案手法の工夫は大きく分けて3つ。 

  1. (dynamic entity representation) まずあるエンティティeについて、eが{ \displaystyle \tau}番目の単語として登場するコンテクスト文cをbidirectional LSTMによって読んだときのベクトル表現を { \displaystyle {\textbf d}_{e,c} = tanh(W_{hd} [  {\textbf  h}_{c,T}^{\rightarrow}, {\textbf  h}_{c,1}^{\leftarrow}, {\textbf  h}_{c,\tau}^{\rightarrow}, {\textbf  h}_{c,\tau}^{\leftarrow} ] + {\textbf b}_d) } と表現する事で文脈を伴うエンティティの表現ができる。

  2. (max-pooling) 次に、複数回登場するエンティティについては以前の文脈を踏まえて理解したいため2回目以降に再登場するエンティティについてはこれまでの文脈c'におけるベクトル表現を集めてmax-poolingを取ったもの { \displaystyle {\textbf x}_{c, \tau} = W_{dx} {max-pooling}_{c' \in c} ({\textbf d}_{e, c'}) + {\textbf b}_x } を入力する。

  3. (byway) そのようにしてそれぞれの文脈におけるエンティティのベクトル表現を構築した後、同じくbidirectional LSTMによってエンコードした質問文によってアテンションを掛けることで最終的な文書全体でのエンティティのベクトル表現 { \displaystyle {\textbf v}(e; D,q) } を構築する。またその際に、出力文と入力文のそれぞれの単語(列)が概ね対応している翻訳と違って質問応答では候補エンティティがそもそも正解でない場合、アテンションの重みの総和は1になるようになっているけどどこに注目すれば良いのさ?という問題が起きる。そのため候補エンティティ1単語だけの文を擬似的に追加して、「どれにも注目したくない場合」 のアテンション候補を作っている。(理解が合っているかちょっと自信ない。)*3

結果としては dybanuc entity representation だけだと [Hermann+‘15] とほぼ変わらず(62.3%)、 max-pooling と bywayどちらかだけ入れると 8% (!) 上昇、両方入れると 10%ほど上昇(72.0%)。w2vによる初期化もすると 72.9%で、 [Hill+, ICLR'16]のsingle-modelによる結果(68.4%) を超えてNAACL'16 の時点でSOTA。

The Goldilocks Principle: Reading Children’s Books with Explicit Memoy Representations [Hill+, ICLR'16]

Memory Networkを用いた手法の提案と、Children’s book test (CBT)というDeepQAと似たデータセットの作成についての話が中心。
DeepQAとの違いは回答候補の表層がマスクされていない(言語についての事前知識を使うことを許している)点と、データセット作成時にCoreNLPによる品詞解析やNERなどを行って回答候補を数種類(Named Entity, Noun, Verb, Preposition) に分けて、回答候補のタイプを揃えていること。

Memory Networkによるモデルではいくつかのウィンドウパターンを使ったメモリのとり方や,メモリへのアテンションの仕方などを数種類試行。訓練時にハードアテンションを用いるのが効くとか。 Memory NetworkとHierarchical RNN + attentionを比べた時,文についての状態ベクトルを作るにあたって,窓幅を取って単語embeddingの重み付け和を取る(Memory Network)より RNNなりでエンコードするようが自然に思えることから正直個人的には後者のほうが好きなのだけれどどうして前者が比較的持て囃されているのだろう。 今回のタスクで1文中に回答候補が複数出現した時のように,1文中の別々の事柄について別なメモリとして持てる事が嬉しい場合が多い、ということなのだろうか。

Text Understanding with the Attention Sum Reader Network [Kadlec+, ACL'16]

A Thorough Examination of the CNN/Daily Mail Reading Comprehension Task [Chen+, ACL'16]

*1:最近知ったが [Hill+, ICLR'16] のChildren’s Book test がclozed-style QAの評価に使われているケースも

*2:しかしデータを眺めた所各文書間である単語に対するエンティティのIDは共通だったので、厳密にはある一つの文書だけを読んでエンティティを理解しているわけではない(訓練データの他の文書も参考にしている)気がするがそれは良いんだろうか?

*3:“we make an artificial occurrence for each entity with no contexts, which serves as a byway to attend when no other occurrences can be reasonably related to the query.” と書いてあったのでそういうことだと思うんだけど・・・

Towards an Automatic Turing Test: Learning to Evaluate Dialogue Responses [Lowe+, ACL'17]

http://aclanthology.coli.uni-saarland.de/pdf/P/P17/P17-1103.pdf

概要

学会中に発表聞きながら書いていたので短め。追記するかも。
How NOT to evaluate your dialogue system[Liu+, EMNLP'16] の著者の一人。 上記の論文中でBLEUなどの翻訳用のmetricやどちらの応答が良いか選ぶなどといった、現在の対話の自動評価手法が人間の人手評価との相関が無いことを検証していた。 結論としては人手評価のデータ (応答への1-5のスコアなど) を集め、それを用いて評価用のモデルを学習することが信頼性を担保しつつ、対話モデルの評価を低コストに行う手法であるとの事。そして今回は汎用ドメインTwitter)のデータを用いて実際にそれをやってみたよ、という話。面白かった。

f:id:jack_and_rozz:20170805074228p:plain:w400

Learning to generate one-sentence biographies from Wikidata [Chisholm+, EACL'17]

https://aclweb.org/anthology/E17-1060

概要

Wikipediaは多くの場合その記事に対応するWikidata item (他エンティティとの関係ラベルやある属性の値などの知識グラフ) を持つことを利用して、 ある人物についてWikidataから値を抽出したテンプレート (“TITLE mathias tuomi SEX OR GENDER male DATE OF BIRTH 1985-09-03 …”) からWikipediaの該当記事の第一文目を生成するタスク(Biography generation)。自分の研究でWikipedia/Wikidataを使ってみようかと思っているので参考に。

提案手法はアテンションを用いたseq2seqに,出力文を用いてもう一度入力文を復元するループ構造を加える事で入力文を復元できるだけの情報を出力文が持つように制約をかけたautoencoder的なseq2seq。 どこかで見たことあるような・・・。ちゃんと読んでないけどNIPSのdual learningとかもこんなのじゃなかったっけ。

学習の際decodeした時点で誤差の伝播が途切れるので同時に繋げて学習はしていないそうだけど、最終的な損失はどうなっているんだろう?入力→出力と出力→入力のを単に足しているだけ?その辺ちゃんと書いてなかった気がする。 

しかし結果としてはプレーンなattention seq2seqと比べてBLEUが8近く上昇。 翻訳ならとんでもない改善だけどBLEUがどの程度上がるとどうなのかということがタスクによって違うからなんとも。

感想

Wikipediaの各エンティティについて、Wikidataと組み合わせることで扱いやすい属性値と関連するテキストが同時に手に入るというのはなるほどと思った。 恐らくこの研究の新規性というのはWikipediaとWikidataのデータの性質を上手く使って構造化されたデータとテキストデータのマップを行った所にあると思うのだけど、 そのような性質を持つデータはWikipedia以外にあまりイメージできないのでどういう状況でこの研究の、というよりこのタスクについての知見は意味を持つんだろうという気もする。(エンティティの属性値だけあってそれについてのテキストを生成したい状況って何?)

こういうループバック的なモデルはこのタスクや翻訳のように入出力間の1対1対応が比較的強いような場合については良い制約として働くだろうけど、 例えば対話応答のように入出力間の1対1対応が全然取れないような場合ではむしろどうなんだろう、という気もする。

この研究とは関係ない話になってしまうがそもそも対話のように一対多関係にある入出力であっても無理やり一対一写像として学習しようとしているのが今のNNモデルだ、という意見は以前からあってその辺りのどの程度データそのものの入出力関係が多様なのかという定量的な評価指標って無いのだろうか。

ACL'17 まとめ

聴講&ポスターを見ていて気になった論文をセッションごとに。読んで記事書いたら随時リンクを更新。 全体感想なんかもあとで。

Quastion Answering

Dialogue

Information Extraction

Semantics

  • Skip-Gram - Zipf + Uniform = Vector Additivity (Gittens+)

Outstanding Papers

Poster, Workshop, etc.

  • Building a Non-Trivial Paraphrase Corpus using Multiple Machine Translation Systems (Suzuki+)
  • [NMT1st] Stronger Baselines for Trustable Results in Neural Machine Translation
  • [CoNLL'17] Named Entity Disambiguation for Noisy Text (Eshel+)

An End-to-End Model for Question Answering over Knowledge Base with Cross-Attention Combining Global Knowledge [Hao+, ACL'17]

Question answering over knowledge base (KB-QA) に関する研究。タスクとしては [Unger+, ‘14] が先駆け?タスクの定義の細かい所が分かっていないのだが単なるQAタスクでも手がかりとしてKBを使っていたらKB-QA? 他タスクの手がかりとしてKBを使う、という発想自体がこの研究の新規性というわけではないが実際にNNベースでそれをやっている研究を読んだのは初なので読んでみた。

ここではQAのデータセットとして WikiQuestion , KBとしてFreeBaseを使ってKBのエンティティから解答候補を選ぶモデルになっているが、そもそも解答がKBに無いような場合はどうするんだろう。どのKBを使うかも含めての無差別級的な評価が普通なんだろうか?

提案モデルの概要図は以下。 前提として、KBはFreebaseを使っているため (subject, relation, object) のtripleの集合の形で与えられる。 計算時間を削減するために質問文中の topic entityを見つけて(それもFreebase APIから出来るらしい)、そこから2-hop以内で辿れるentityのみを解答候補とする。 そうして絞り込んだそれぞれの回答候補について、answer entity, answer relation, answer type, answer context*1 の4つのaspect (図のFrance-Parisの例が分かりやすい) それぞれについてembedding ({ \displaystyle { e_e, e_r, e_t, e_c } })を用意しており、concatするわけではなくattentionもそれぞれのaspectについて計算したものを最後に足す方式。

f:id:jack_and_rozz:20170803015433p:plain:w400

論文としてのメインは下図のCross-Attention。 名前の通り (1) A-Q attention と (2) Q-A attention の2段階からなる。 [Hermann+ ‘15] のre-reading mechanismを参考にしたとか。

f:id:jack_and_rozz:20170803015859p:plain:w400

(1) A-Q attention: 通常NNベースのQAタスクだと質問文ベクタは一度RNNなりでエンコードしたもので固定するのに対して、解答候補 { \displaystyle e_i} ごとに質問文ベクタ{ \displaystyle q_i} を構築するのが A-Q attention. そうして計算した質問文ベクタ { \displaystyle q_i} と entityのあるaspectのembedding { \displaystyle e_i \in { e_e, e_r, e_t, e_c } } について内積を取って和を取ったそれぞれのスコア { \displaystyle S (q, e_i) } を計算する。

(2) Q-A attention: (1)で計算した各aspectごとのスコアをattentionによって重み付けしたもの { \displaystyle S (q, a) = \sum_{e_i \in {e_e,e_r,e_t,e_c}} \beta_{e_i} S (q, e_i) } が最終的な質問文{ \displaystyle q}と解答候補{ \displaystyle a}のペアに対するスコアとなる。 今度は質問文を固定して解答候補のそれぞれのaspectに重み付けすることで{ \displaystyle \beta_{e_i}}を得るわけだが、その際の質問文を表すベクトルは単純に各タイムステップの隠れ層の平均を取る。

A-Q attentionは解答候補の性質によって質問文のどこを見るかを変える、Q-Aは逆に質問文の性質によって解答候補のどこを見るかを変えるモデルなわけだけど、両方やる必要ある?(本質的には時系列データの畳み込みが難しいところにattentionの採用理由があるわけなんだからA-Q attentionだけで良くない?)という気もする。

訓練時は正例1つと、解答候補中からk個負例を選んでヒンジロスを取る。質問文のトピックによってはそもそも解答候補がk個もない場合もあるので、その場合はランダムに他のトピックまで解答候補を拡張。テストの際、解答が1つとは限らないのでスコアがマージンを超えたentityのセットを解答とする。

また、グラフ構造を利用するためにKBについてTransEをKB-QAと交互にマルチタスク形式で学習 (Global)。TransEについても同様にヒンジロスを目的関数とする。

結果は以下の通り。[Bordes+, ‘15] からちょっとだけ改善。 cross-attentionの寄与は微妙な所・・・。 むしろKBの構築をマルチタスクでやることの方が筋も良さそうだし効果も出ているからそっちを推せばいいのに、という気もする。

f:id:jack_and_rozz:20170805012728p:plain:w200 f:id:jack_and_rozz:20170805012732p:plain:w210

紹介しておいてなんだがこういうattentionの範囲をどんどん広げていくタイプのモデルは計算量が増える上に、系列データの単一ベクトルへの圧縮を諦めているようであまり好みではない。あちこちのタスクでattentionによって大きく改善が得られているというのはその通りなので現実的に即効性のある考えではあるのだけど・・・。

*1:注釈に “Answer context is the 1-hop entities and predicates which connect to the answer entity along the answer path"と書いていたのだがイマイチ分からなかった。英語得意な人おしえて・・・