ブログではないです

ブログでなくはないです

UNSUPERVISED NEURAL MACHINE TRANSLATION [Artetxe+, ICLR'18]

URL: https://arxiv.org/pdf/1710.11041.pdf

概要

各言語の単言語コーパス+ cross-lingual embeddingsを使うことでパラレルコーパス無しで機械翻訳をしよう、という論文。 具体的にどうやるかというと下図のように言語共通のencoderと言語独立のattention付きdecoderを用意して, 訓練時はそれぞれの単言語コーパスを使ってautoencoder (入力文をそのまま復元するモデル)を学習することでencoderが言語非依存の中間表現を出力してくれることを期待する。そしてテスト時に入力の言語と異なるdecoderを用いると復元された入力文は目的言語のものになり、結果的に翻訳が行われているという仕組み。(例えば訓練を仏→仏、独→独で行ってテストは仏→独みたいな)

f:id:jack_and_rozz:20180422082536p:plain:w400

しかし問題となるのが普通にやると中間表現に入力文の言語非依存な情報が上手いこと圧縮されてそれを元に復元・・・という風にはならず、 (自分の理解ではattentionに頼りすぎて、という事だと思う)入力文の単語を盲目的に一つずつコピーしていくようなモデルになってしまい、結果的に違う言語では上手くいかなくなってしまう事らしい。

それを解決するために著者らが提案しているのが(1) denoising (2) On-the-fly backtranslation と呼ばれる2つの工夫で、前者は入力文がN単語なら N/2回隣り合う単語をランダムに入れ替えて順番をめちゃくちゃにして、単純に左からコピーしていっても復元できないようにしてやる、という方法。 また後者の具体的な内容としては、まず訓練の各ステップで現在のモデルを使って翻訳を行う。そうして得られた (言語Aの入力文, 言語Bの出力文) のペアをひっくり返してそのステップの訓練データに加えてやることで,モデルが出力したちょっと変な言語Bの文から言語Aの文を復元できるようにする、という方法。
どちらの方法もautoencoder関連で過去に提案された、入力をわざと崩してやることでencoderが出力する中間表現をロバストにしてやろうという発想に近いものだと思うけど、 On-the-fly backtranslationについてはモデルが途中のステップで出力する文って恐らくかなりおかしい感じになっている訳で、そんなの訓練中に突っ込んで学習がぶっ壊れないのかよ、という感想。元ネタらしい (Sennrich+, '16) をちゃんと読んだほうがいいのかな。

実験と結果

いくつかの言語対に対して unsupervised, semi-supervised (訓練にパラレルコーパスをちょっとだけ使う), supervised (普通のニューラル翻訳) を条件を変えて比較。denoising, on-the-fly backtranslation単体だと微妙だが、両方合わせると (semi-)supervised に勝てないまでもそこそこいい線行くらしい。*1

また、semi-supervisedの結果が示すように単体ではモデルの学習が困難な小さいデータでもunsupervisedにちょっと加えてやると大分性能が良くなるというのはかなり面白い。自分の感覚では他のタスクでもよくある整ったデータセットのサイズって 10k~100kくらいで、この量だと何かモデル学習するには(特にニューラルだと)タスクによっては微妙に心もとないしどうも使いにくいよなーと思っていたのでこういう大規模な単言語コーパス + 小規模の高品質 (task-orientedな) コーパスを組み合わせるみたいな話は有望だと思う。

f:id:jack_and_rozz:20180422084540p:plain

雑感

面白かったけどメインの提案である中間表現の質を上げる話、入力を盲目的にコピーする問題はattention使ってるせいじゃねえのという感が否めない。そもそもattentionという手法が入力文全体の情報を一つの中間表現に全部負担させるのではなく、各ステップのencoderの出力に分散させてやろうという発想なわけで、autoencoderのようなuniversalな中間表現を作りたいという話と相反しているように感じる。attention無しバージョンは試さなかったんだろうか? (上記の問題を差し置いても自分で文のautoencoder作ってみた時、attentionを入れないほうが普通に性能良かった気がするんだけど・・・)

*1:byte pair encodering (BPE) はslightly beneficialだとか言っていたけど2. ->4. の変化は十分大きくない?それとも4. って proposed + BPE じゃなくて proposed + backtranslation + BPE ってこと?

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なモデルと違って最終的なクラスタ同士を比較するだけでは最適化が難しく、ここについてはDaumeのlearning-to-searchというアルゴリズムを使って解決している。

具体的にはまずモデルの現在のパラメータによって定まる方策 { \displaystyle \pi}を用いて最終状態までの状態の軌跡 {{ \displaystyle x_1, x_2, ... , x_N}} を得る。その上で、ある状態{ \displaystyle x_i}において取れる行動全て({ \displaystyle u \in \mathrm U(x_i) })に対して、その行動をした後最適(に近い)な行動をし続けた時の最終状態{ \displaystyle e}とその時の損失{ \displaystyle l(u) = L(e, y)}を損失関数{ \displaystyle L}と, reference policyと呼ばれる{ \displaystyle \pi_{ref}} を用いて獲得する。このreference policyについては,訓練時は当然正解とスコアの計算式を知っているのでそれが最も増えるような行動を選ぶようにする、と言ったように人工的に作る。その上で全ての{ \displaystyle \pi(u| x) l(u) } *1 の和を取って最適化を行うという流れ。

f:id:jack_and_rozz:20180329122223p:plain:w400

自分の理解をまとめると,まずある状態{ \displaystyle s}において次の行動{ \displaystyle u}がどれだけ有望かを計算する関数{ \displaystyle \pi (u, s)}を最適化するのが目的。ただ学習データとして存在するのは最終状態だけで行動の軌跡は無いため、状態{ \displaystyle s}で行動{ \displaystyle u}を取りその後ベストに近い行動を取り続けたら最終的なスコアがどうなるか、ということをreference policyを元に計算して,それを用いて各状態における行動選択のための方策を最適化しているのだと思う。*2 ゲームAIを学習する時にある一手分だけモデルの方策に従ってそこからモンテカルロ木探索をして最終スコアを元に最適化するのに近いような気がした。

*1:ここxじゃなくて{ \displaystyle x_i} では?

*2:とはいえreference policyに従って選ばれるある状態からの擬似的な最適行動の軌跡を使うのと、最終状態から遡って作られる擬似的な初期状態までの軌跡を使ってteacher-forcingするのってそこまで差があるだろうか?例えば共参照解析だったら同クラスタに所属するものの内、文書内で距離が近いものから順にやるとかでそう悪くない軌跡が作れると思うんだけど・・・。

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:以前読んだコードではsklearn.utils.linear_assignmentを使ってスコアが最大になるように割り当てていた

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) の項にあたる部分の意義がいまいち理解できていない。関連研究追う必要あり?