ブログではないです

ブログでなくはないです

Learning with Noise: Enhance Distantly Supervised Relation Extraction with Dynamic Transition Matrix [Luo+, ACL'17]

https://arxiv.org/pdf/1705.03995.pdf

概要

Relation Extractionと呼ばれる2つのエンティティ間の関係抽出タスクの論文。 具体的には(subj, rel, obj) の形式で表される知識ベースを仮定して,(subj, obj) を含む文(文の集合)からrelを当てるといった形式。 彼らのモデルではニューラルネットを用いてエンコードしたベクトルをsoftmaxに掛けて,R (= relの種類) 択の分類問題を解いている.

一方で,訓練データ中のどの文が (subj, obj)に対する関係relの根拠となっているかということをアノテーションすることは現実的に困難なため, この学習の際には(subj, obj)が出てきた文は全部relに関係しているとみなして学習する,いわゆるdistant supervisionによる学習が基本的なやり方となるため, あるサンプルが実際には全然relと関係ない文であった場合それは学習におけるノイズとなってしまうことが問題となる。

彼らの貢献は主に以下の3つ。
1. Curriculum Learning(訓練データのそれぞれに信頼度あるいは難しさを計算できる時に,信頼できる/簡単なものから学習していく)の導入
2. Sentence-level Modeling / Bag-level Modeling (文の集合) の比較に加えて,Bag-level Modelingにおけるaggregation (それぞれの文ベクトルからどう全体のベクトルを作るか)についてaverageとattentionの2種類の比較
3. Transition Matrixによるノイズモデリングの提案

以下の図がモデルの概要図。 入力をエンコードした後,関係ラベルの確率分布{ \displaystyle \bf p}を計算する部分と,タイトルにもあるDynamic translation matrix { \displaystyle \bf T} を計算する部分に分けられる.この{ \displaystyle \bf T}{ \displaystyle R * R}の正方行列の形を持ったある種の混同行列になっていて,各要素{ \displaystyle t_{ij}}は関係{ \displaystyle r_i}{ \displaystyle r_j} と間違える確率になっている。

f:id:jack_and_rozz:20180223164156p:plain:w400

この行列{ \displaystyle \bf T}と推定した確率分布{ \displaystyle \bf p}から新たな確率分布{ \displaystyle \bf o = T^{\mathrm T} \cdot p}を計算して,訓練時は{ \displaystyle \bf o }{ \displaystyle \bf p}を重み付けしたものを使い,テスト時の推定には{ \displaystyle \bf p}を用いる. これがどういうことかというと自分の理解では,{ \displaystyle \bf p}は真の確率分布をモデリングしているのに対し,それをノイズが含まれうる訓練データで直接最適化すると訓練データのノイズもそのまま学習されてしまう。それに対して,真の確率分布+ノイズである{ \displaystyle \bf o}をノイズ入りの訓練データで学習すると,結果的に真の確率分布{ \displaystyle \bf p}とノイズをモデリングした部分{ \displaystyle \bf T}に分かれて,結果的にモデルの推定の質が良くなる,ということをやりたいんだと思う.
ただ,実際の学習データは「必ずしも正しいとは限らないデータ(=~o)」だけで,「確実に正しいデータ (=~p)」も「何をどう間違えたかのデータ (=~T)」も無いので真の確率分布とノイズの部分の分離を促す力は単にネットワークを分けただけでは得られないんじゃないか?という気がするがそこはどう考えてるんだろう。自分が読み込めていないだけの可能性もあるかも・・・。*1

結果としては1. のCurriculum Learningによる寄与が大きく,2. はそこまで変わんないかなあ・・・?という印象。また3.はbag-levelではそこまで大きな効果がある感じではなかったが,sent-levelでは結構差があるように見える.sent-levelでは一度に1つしか見ない分,あるサンプルがノイズかどうかの分散が大きいから効果が大きいということなんだろうか?

*1:Culicullum Learningにおけるスコアが高いものだけをpの学習に使い,全部混ぜたやつをoに使うとかはどうなんだろう?

Improving Coreference Resolution by Learning Entity-Level Distributed Representations [Clark and Manning, ACL'16]

https://nlp.stanford.edu/pubs/clark2016improving.pdf

概要

C.Manningの研究室から出た共参照解析の論文で、[Lee+, EMNLP'17] に抜かれるまでCoNLL 2012 shared taskのSOTAモデル。概要としては従来のメンション間のスコアを算出して同一クラスタに属するかどうかを判断し、最後にリンクを辿ってクラスタを構築するモデルだと既に同一クラスタであると判断した他のメンションの情報が使えないことが問題となる。例えばテキスト中にClintonさんが2人居た時に "Bill Clinton" と "Clinton"が同一エンティティを指すかどうかは判断が難しいが、{Bill Clinton} と {Clinton, she} が同一であるかどうかの判断はすでに"Clinton" と "she" が同一であるという情報を使えば比較的容易である、という話。 そのためにタイトルにもEntity-Levelとあるように,個々のメンションを要素が1つのクラスタとみなしてスタートして,モデルが推定した結果をインクリメンタルに取り込んだ上で、entity-levelの(言い換えるとcluster-levelの)representationを計算しつつクラスタ同士をマージするような形で共参照解析を行えるモデルにしようと言う話。

モデル

f:id:jack_and_rozz:20171228142917p:plain:w200
まず前提として、個々のメンションの抽出は別モジュールで既に行われているとする。その上で、モデルのコンポーネントは大きく分けて (1) Mention-Pair Encoder (2) Mention-Ranking Model (3) Cluster-Pair Encoder (4) Cluster-Ranking Model の4つ。 (1)のエンコーダは特筆することもなく2つのメンションのembeddingと周囲の単語、メンション間の距離などの特徴量を使ってFFNNに通して新たなrepresetantionを計算する。(2)でそれを使って、あるメンションmとある先行詞aの間のスコアを算出する。 (3)はクラスタのペアについてのエンコーダなので2つのクラスタに属するメンションの全通りの組み合わせに対してあれこれしてrepresentationを計算。詳しくは論文の図参照。

冒頭でメンションではなくクラスタとの比較をしよう、という趣旨を述べていたにも関わらずどうして(1), (2)が必要になるかというと、具体的には(4)での枝刈り&実行順序決め(簡単なものから実行するため)に用いる。モデルの実際の訓練・推定の流れはまず(1), (2)を事前訓練して従来のモデルと同じようにメンション単位でのスコアを算出できるようにした上で、(3), (4)の訓練時にMention-Ranking Modelでのスコアが高いメンションが属するそれぞれのクラスタどうしに対してCluster-Ranking Modelを適用して実際の共参照解析を行っている。

また学習時にも探索が入る関係上、通常のneural-basedなモデルと違ってend-to-endの最適化が難しい。 ここについてはDaumeのlearning-to-searchというアルゴリズムを使って、次にどのクラスタとどのクラスタをマージするかを上手いこと学習しているがここについては説明が長くなりそうなので省略・・・。

Learning Distributed Representations of Texts and Entities from Knowledge Base [Yamada+, TACL'17]

https://transacl.org/ojs/index.php/tacl/article/view/1065/257

概要

ざっくり言うとword embeddingと同時にentity embeddingを学習するモデル (NTEE) を提案して、実際に学習したembeddingを色々なタスクで用いて評価したよ、という論文。

どう学習するかというとWikipediaのテキスト中のリンクをエンティティとみなして、あるテキストtにエンティティeが登場するか否かのモデルを最適化することによって モデルは具体的には以下の式の{ \displaystyle P(e|t)}を最適化する。{ \displaystyle v_e}がエンティティemb, { \displaystyle v_s}が文のベクトルで,文のベクトルをどう作るかというと文中の単語ベクトルの平均を取って変換を掛けるだけ。*1


実験

(1) Semantic Textual Similarity Semantic(2つの文の意味的な類似度のスコア計算), (2) Entity Linking, (3) Question Answering の3つのタスクによって提案モデルによって学習されたWord/Entity embeddingの評価を行う。具体的にはそれぞれのタスクのモデルにおけるembeddingの初期化をする際に、提案手法で学習したものを用いる場合と通常のskip-gramなどによるものを比較。 *2

(1) のタスクについては2つの文のベクトルさえ得られれば良いのでembeddingの学習の際のモデルと同様の構造でOK。
(2), (3)のタスクについてはどちらもテキストに対して回答となるエンティティを指定するタスクであり、 下図のような事前にテキストの表層などの手がかりから絞り込んだ回答候補(今回は100候補)のentity embeddingと、前述した方法で計算する文のベクトルからスコア付けをするモデルで解いている。 よくある分類問題のように全エンティティ数次元の確率分布を出力するようなモデルにしていないのはエンティティ数が膨大なのでソフトマックス計算のコストが大きいからということだろうか?

結果は以下の表の通り。どのタスクについても提案手法(NTEE)による改善が見られる。EL,QAタスクでは回答候補は文中に出現する単語とは違いエンティティなので別個にベクトルを用意すると改善するよ、というのは分かり易いが、一方で驚きなのがSTSタスクでは使うのは2つの文のベクトルだけ、つまりEL, QAタスクのようにentity embeddingは使うことはなく,entityを推定するタスクの中で学習したword embeddingを使うだけでこれだけの改善が得られているという事になる。 他タスクで学習したword embeddingを初期化に使うというのはある種のシーケンシャルに行うマルチタスクであるような気もするので、その際のサブタスクとしてエンティティ推定タスクは良さそうという話なのだろうか。


*1:2番めの式, 文のベクトルの計算について、活性化関数を挟む記述が無かったがこれだと無駄に線形変換してるだけにならないだろうか・・・?省略しただけ?

*2:learned representationを使う、ともNTEEを使う、とも記述があり、単語ベクトルの平均取った後の変換部分も共有しているかどうかは不明。

共参照解析の評価指標

以前読んだ共参照解析の話をはじめ最近の話で評価に用いられるconll 2012 shared taskの評価指標であるMUC,{ \displaystyle B^3}, { \displaystyle CEAF_e}辺りが馴染みがなかったので 自然言語処理シリーズの文脈解析を片手に調べた3.3節のメモ。この辺全く詳しくないのでなんか間違いがあるかも。

まず,多くの場合評価は同一エンティティを指す言及の集合に対して行われる。 個々の先行詞-言及のペアについてPrecision/Recallを出す方法も出来なくはないが,それだと例えば正解が { \displaystyle \{A_1 \leftarrow A_2,  B_1 \leftarrow B_2 \}} であった時,システムが { \displaystyle \{A_1 \leftarrow B_1,  B_1 \leftarrow B_2 \}} というリンクを推定した場合と{ \displaystyle \{B_1 \leftarrow A_1, A_1 \leftarrow B_2\}} というリンクを推定した場合で、どちらも{ \displaystyle A_1, B_1, B_2}の3つを同じエンティティに対する言及の集合だと考えているにも関わらず結果が異なってしまう。

MUC (Message Understanding Conference)

上記の問題を解決するために,MUCでは「正解データのそれぞれの集合を生成するのに必要となるリンクのうちいくつをシステムが生成したか」でRecallを,逆に「システムが生成したそれぞれの集合を生成するのに必要となるリンクのうちいくつが正解データに含まれていたか」でPrecisionを評価する。 p97の図が分かりやすい。

具体的にどう計算するかというと

{ \displaystyle Recall = { {\sum_{i=1}^{N_k} (K_i - p(K_{i}))} \over {\sum_{i=1}^{N_k} (K_i - 1)} }  }

{ \displaystyle Precision = { {\sum_{i=1}^{N_r} (R_i - p'(R_{i}))} \over {\sum_{i=1}^{N_r} (R_i - 1)} }  }

{ \displaystyle K_i , R_i}は正解データ / システム出力のi番目のエンティティに関する集合の要素(言及)数,{ \displaystyle p(K_i)}{ \displaystyle K_i}の要素をシステム出力における集合ごとにまとめたもの,{ \displaystyle p'(R_i)}{ \displaystyle R_i}の要素を正解データにおける集合ごとにまとめたもの(別々のクラスタだとみなした数),{ \displaystyle N_k , N_r}は正解データ / システム出力におけるエンティティの数。

Recallを例に式の意味を説明すると,{ \displaystyle K_i}個の要素があった時にそれら全てを繋いだグラフ(正解データ)を作るのに必要なエッジの数が { \displaystyle K_i - 1}本 (分母)で,そこからエッジが1本減るごとに細かいグラフに分かれる(分子)ので,逆に言うとグラフがどれだけ細かく分かれてしまっているかで足りないエッジの数が計算出来るということ。

しかしMUCはなるべく多くのリンクを出力したほうが良いスコアになりがちであったり,例えば正解データが{ \displaystyle K = \{\{a,b,c\} \{d,e,f,g\}\} }であったとして,システムの出力{ \displaystyle R_1 = \{\{a,b,c, d,e,f,g\}\} }{ \displaystyle R_2 = \{\{a,b,c\}, \{d,e,f,g,h\}\} }を比べた時に本来異なる2つのエンティティを同一の集合で考えてしまっている前者と,関係ないリンク({ \displaystyle h})が1つ紛れ込んでいるだけでそれ以外はほぼ完璧な後者が同じスコアになるなど問題点もあるため,{ \displaystyle B^3}やCEATが提案されたらしい。

{ \displaystyle B^3} (B-CUBED)

{ \displaystyle B^3}での計算式は以下の通り。

{ \displaystyle Recall = {\sum_{i=1}^{N_k}\sum_{j=1}^{N_r} {{|K_i \cap R_j|^2 } \over {K_i}}  \over {\sum_{i=1}^{N_k} K_i}}   }

{ \displaystyle Precision = {\sum_{i=1}^{N_k}\sum_{j=1}^{N_r} {{|K_i \cap R_j|^2 } \over {R_j}}  \over {\sum_{j=1}^{N_r} R_j}}   }

Recallを例にとると,正解データの各要素についてシステムの出力でも同一の集合に含まれるものの割合を計算({ \displaystyle \sum_{j=1}^{N_r} {{|K_i \cap R_j|} \over {\cdot}}  } まで)して各要素ごとのRecallを出し,その平均を取って全体のRecallとしている。*1

CEAF

MUCやB-CUBEDは正解データとシステム出力それぞれの集合だけが与えられればそれぞれの集合間の対応を気にせず*2に計算できるタイプの評価指標だったが、 CEAFはスコア計算時にスコアがよくなるように対応付けを取った上で計算をするタイプ。*3 { \displaystyle CEAF_e}{ \displaystyle CEAF_m}などいくつかバリエーションがある。

{ \displaystyle CEAF_m}はそれぞれのペアのRecall / Precisionの重み付き平均を取るだけ。 { \displaystyle CEAF_e}

類似度関数 { \displaystyle \phi_4 (K_i, R_j) = {{2 \times |K_i \cap R_j|} \over {K_i + R_j}} } を用いて, 全ペアの総和を { \displaystyle N_k}で割ったものがRecall, { \displaystyle N_r}で割ったものがPrecision となる。

*1:2乗しているように見えるのはRecallが{ \displaystyle \sum_{j=1}^{N_r} {{|K_i \cap R_j|} \over {R_j}}  }となる要素の数が{ \displaystyle |K_i \cap R_j|} 個あるからある種の重み付き平均を取っている。ここ理解するの苦戦した

*2:{entity0: {a,b}, entity1:{c}} と{entity0:{c}, entity1:{a, b}}を区別しない

*3:ここの対応付けをどう取っているのか分からなかった。まさか全通り試すの?

Evaluation Metrics for Machine Reading Comprehension: Prerequisite Skills and Readability [Sugawara+, ACL'17]

http://www.aclweb.org/anthology/P/P17/P17-1075.pdf

概要

Reading Comprehension(RC) タスクの目的の1つはモデルがどの程度文章を理解できるのかを測ることであり,コンテキストとなる文章を読んで関連する質問に答えられるかを問うことでそれを行う。
しかしあるデータセットに設定された問題が解けるということが本当にその文章を理解していることになるのか?(十分条件なのか?)と言われると実はそれはそうでもなく,例えば質問文とほとんど同じ文がコンテキストの中に表れる場合など,コンテキストを理解していなくても質問文とのマッチングを取るだけで解けるような問題が作れてしまう。逆に,文章が幼児向けのものであっても質問への回答には多くの推論や常識の把握が必要となるようなものも存在する。

そうした理由から,RCタスクにおいて必要となる能力を Prerequisite skills(共参照や常識、因果関係の把握など,質問に答えるために必要とされる能力)と Readability(文章の長さや単語の種類の多さなど,文章を読むために必要とされる能力)の2つに分けて考え,最近の主なデータセットについてアノテーションを行いその難しさと,またその2つの能力がどの程度相関するのかを分析している。基本的にRCタスクをやる人のモチベーションとしてはどちらかと言うとPrerequisite skillsの方を問いたいはずなので、Prerequisite skillsが高くReadabilityが低いデータセットほど使い勝手が良いということになるのかな。

対象のデータセットはQA4MRE, MCTest, SQuAD, Who-did-What (WDW), MS MARCO, NewsQAの6つ。 以前いろいろ読んだ CNN/DailyMail DatasetやCBTestについては,前者は回答の曖昧性が高い問題や共参照解析のミスが多いという理由,後者はRCタスクというより言語モデルタスクであるとの理由から*1 対象データセットに入っていない。

結果

個々のデータセットについての分析結果としてはQA4MRE, WDWあたりがPrerequisite skills, Readability共に高くかなり難しめのデータセット、 それ以外の4つについてはPrerequisite skillsは低め。ただその中でもMC Testは元が子供向けの文章であることからReadabilityがかなり低い。QA4MRE,WDW, MARCOについてはデータの作り方が原因となってか回答不能な問題が多い (10~27%) のが気になる所・・・。また目的の一つであったPrerequisite skills, Readabilityの相関関係については正直あんまり無さそう。まあ直感的にはReadabilityが高かろうが低かろうがPrerequisite skillsは質問文をどう作るかで大半が決まるわけでそりゃそうだよねという感じ。 また,質問に応えるために読む必要のある文の数も似たり寄ったり (1.04 ~ 1.18 sentence) で,今のRCタスクは大体必要な箇所の1文を読むだけで解けてしまうような問題ばかりだということらしい。(ただしコンテキスト文全体から必要箇所を探すための労力については別問題)

感想

面白かった。とりあえず新し目のデータセットで精度競争を繰り返すだけになりがちなRCタスクで、そのタスクが解けると何の能力があると言えるのか?をちゃんと分析しているあまりないタイプの研究。最近流行りのSQuAD, MS MARCOなんかはやはりAverage prerequisite skillsが低く,そうなると多分単純にコンテキストの狭い範囲と質問文とのマッチを適切に取れるかがかなり重要になるのだろう。ニューラルモデルでどうアテンションを取るかみたいな研究が大量発生するわけだ・・・ 逆にモデルに◯◯を理解させたいと思って新しい提案手法を考えても,使うデータセットによってはその能力を必要としない場合があるわけでちゃんとモデルの提案or評価時に実際のデータを意識しなきゃいけないなあという感想。

参考リンク

筆者のRC task overview のスライド
最近の主なQAのデータセット一覧

*1:ここの理由が良く分からなかった。関連研究で議論されているんだろうか

Dynamic Entity Representations in Neural Language Models [Ji+, EMNLP'17]

https://aclanthology.coli.uni-saarland.de/papers/D17-1195/d17-1195

概要

言語モデルとjointlyに共参照解析をして文章中のエンティティへの言及を元にその分散表現の更新を動的に行い,現在の隠れ状態に加えて最近登場したエンティティの分散表現を考慮することで性能を良くしましたという話。 slideshare解説スライド があった。

提案手法

ベースラインは普通のRNN言語モデル。提案手法ではこれに加えて,下図の

{ \displaystyle r_{t}} (エンティティであるかの 0/1)
{ \displaystyle e_{t}} (文章中に出てきたどのエンティティであるかのインデックス。{ \displaystyle r_{t}} = 0 なら{ \displaystyle \phi}が入る)
{ \displaystyle l_{t}} (複数語から構成されるエンティティについて、その単語を含めて残り何単語か)

を各タイムステップの隠れ状態から推定しながら単語を読み進めていく。

f:id:jack_and_rozz:20170929005541p:plain:w400

具体的なアルゴリズムとしては各時刻以下の処理を繰り返している。

  1.  { \displaystyle l_{t-1}} == 1 なら(次に読む所が複単語表現の途中でなければ) 前時刻の隠れ状態とrのembedddingを元に{ \displaystyle r_{t}}を推定 (eq. 3)

    1.1.  { \displaystyle r_{t}} == 0 なら(今読んでいる単語がエンティティの一部ではないなら) { \displaystyle L_{t}} = 0, { \displaystyle e_{t}} = { \displaystyle \phi} として3. へ

    1.2. { \displaystyle r_{t}} == 1 なら (eq.4) によってどのエンティティであるかを推定、新しく登場するエンティティならembeddingを追加 (eq.7) して現在注目しているエンティティを表す{ \displaystyle e_{current}} を選択。 *1

    1.3. (eq.5) によって{ \displaystyle l_{t}} (このエンティティを示す単語が後いくつ続くか) を推定。

2. { \displaystyle l_{t-1}} > 1 なら{ \displaystyle l_{t} = l_{t-1} - 1,    r_{t} = r_{t-1},   e_{t} = e_{t-1} } (残り単語数を減らすだけ)
3. 隠れ状態と{ \displaystyle e_{current}}を元に次時刻の単語を予測。 CFSMという段階的な推定を行うことで計算量を削減するソフトマックスを使用している。 (eq.6)
4. 次時刻の単語をRNNにフィード
5. { \displaystyle e_{current}}の分散表現を更新 (eq.8),1.2で使う全エンティティの分散表現リストにも更新を適用。

f:id:jack_and_rozz:20170929010556p:plain:w250
f:id:jack_and_rozz:20170929010558p:plain:w250
f:id:jack_and_rozz:20170929010601p:plain:w250
f:id:jack_and_rozz:20170929010603p:plain:w250
f:id:jack_and_rozz:20170929010606p:plain:w250
f:id:jack_and_rozz:20170929014740p:plain:w250

また,学習では各推定結果についての同時確率を最大化している。 (eq.9)
f:id:jack_and_rozz:20170929015525p:plain:w250

実験

実験では言語モデルのperplexity, 共参照解析に加えて Entity Prediction (下図におけるXXXXが何かを推定。XXXXの右側についての手がかりは使えない)で評価。

f:id:jack_and_rozz:20170929021330p:plain:w300

データセットは共参照解析にCoNLL 2012 shared task on coreference resolution(訓練データサイズは2802 documents, 1M tokens程度)を使用、
また Entity Predictionには InScript corpus(訓練データサイズは619 texts, 12.4 sentences / 24.9 entities / 217.2 tokens per a text on average)を使用。

結果、どのタスクについても改善。ただ言語モデルについてはベースラインが弱すぎる&あまり差分がない感。 Entity Predictionのaccuracyについてはhuman resultが77%強に対してタスク提案者の[Modi+, '17]の結果が63%弱,提案手法が74%強とかなり強そう。 ただHuman resultが77%ってちょっとタスクとしてアレなのでは?プレースホルダの右側が見えてないためそもそも曖昧性が高いような問題(XXXXが主語になっているような場合とか)があるんじゃないか?という気も。

感想

話としては結構好み。モデルも比較的意図がわかりやすい。実装が見たい(公開するといっていたがgithubに何もなかった)

{ \displaystyle l_{t}}の推定は左から順に読んでいく形式では難しいんじゃないか(ここからここまでがあるエンティティを表すフレーズだというのは文全体を見て初めて判断できることなんじゃないか) という気もすると思った。どちらかというと今読んでいる単語が前の単語と複合語をなしているかどうかの 0/1 判定の方が良かったんじゃないだろうか?

結局良くわからなかった点として、提案手法ではエンティティの数は動的に変化するので実際のエンティティのリストとの間でインデックスによる対応が取れないが、 訓練・テスト時にモデルが推定したエンティティと実際のエンティティとの対応をどう取っているのだろう?

*1:eq.4 の f(e) の項にあたる部分の意義がいまいち理解できていない。関連研究追う必要あり?

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する必要のない単語がしょっちゅう出てくるんだから。