対話のデータセットと評価指標
以前教えて貰ったサーベイ記事。忘れないようにメモ。
対話のデータセットいろいろ https://breakend.github.io/DialogDatasets/
対話の評価指標について https://github.com/pmineiro/ldlmd2016/blob/master/NIPSDec2016H.Hastie.pdf
The Ubuntu Dialogue Corpus: A Large Dataset for Research in Unstructure Multi-Turn Dialogue Systems [Lowe+, SIGDIAL'15]
http://www.sigdial.org/workshops/conference16/proceedings/pdf/SIGDIAL40.pdf
概要
Ubuntu forumのチャットルームの会話を使ってデータセットを作った&それを用いて応答選択タスクをやってみたという論文。 データセットは長めのターン数(平均7.7ターン)のデータセットであんまり無いタイプ。似たようなものに The Ubuntu Chat Corpus for Multiparticipant Chat Analysis [Uthus+, AAAI'13] があるがこっちは多人数間の会話そのままのコーパス、こっちは1対1の会話になっている部分を抜き出している。
データセットを作るにあたってinitial question/message (ある会話の始まりとなる発話)とmessage(それへの返信)を特定してそれが1対1になっている部分を切り出す必要がある。 手順としてはチャットルームの発言の後ろからmessageを探し,そこからそのmessageの3分以内の発話についてbackwardに辿っていく形を取るが,その際元々のデータは誰に向けて話しているのかが明示されていない事が問題になる。しかし慣例的に多くの場合文の冒頭にユーザ名を書いてメッセージを送る( user_name : message )ため、文の冒頭の単語を見てそれが一般的な単語 (GNU Aspell spell checking dictionary に登録されていない) であった場合にユーザ名と判断している。また,
また,
<RC> “dell: you can’t move the drives”
<RC> “this is the problem with RAID”
のように後で発話を付け加える場合など,message形式になっていないものにも文脈を保つ上で重要なものが存在している一方、複数人で会話している場合は並行して違うユーザに向けた発話がmessage形式を取らずに行われる場合があるため取扱いが難しい。 そのためあるユーザが複数人に対してmessageを送っているかをチェックして、送っていない場合は途中の発話も繋げ,そうでない場合は弾いている。
応答選択モデルはコンテクスト(複数の発話を __EOU__ などの区切りトークンで繋げたもの。最長160単語まで)と応答をそれぞれ(TF-IDF, RNN, LSTM)でエンコードしたベクトルc, rを用いて として応答の適切さを推定。[Wu+, Coling'16]のように発話1つをエンコードするネットワークとその系列をエンコードするネットワークのように分けることはしていない。まあLSTMが一番良い。
Modeling Relational Data with Graph Convolutional Networks [Schlichtkrull+, arXiv'17]
https://arxiv.org/pdf/1703.06103.pdf
概要
Graph Convolutional Network(GCN) を関係ラベル付き有向グラフも扱えるように拡張して、ノードのタイプの推定や欠けたエッジの補完を行う話。 Quitaの解説記事 がとてもわかりやすいのであまり自分で書くことがない・・・。
思ったこと
R-GCNの式(1)での重みについて,
のように基底変換を重み付け和するやり方と
のように小さな基底変換のdirect sumを取る、つまりをブロック対角行列の形で表す方法の二種類を取っている。これはrelationが多くて全部について行列を学習するのが大変だからということだと思うんだけど一方でLink Predictionの方では として別個に学習してるように見えるがそこは良いのか??
DistMult単体で用いた場合との違いはentityのベクトルをR-GCNを使って作るか,それともembeddingとして同時最適化しているかの違い? グラフ系のNN,もしくはそれ以外の既存手法あまり知らないので関連研究辿る。
テストでは同様にtriple (subject, relation, object) が与えられ、 subject/object のどちらかを抜いた状態(両方やる)で全entityについてそのtripleに入るかどうかのスコアを算出する。正解のentityのMRR (平均逆順位)と Hit@k (上位k位に正解がいる割合) で評価。
メモ
ここ にDistmult含め既存研究のグラフKBに関する研究をまとめたスライドがあった。
Unsupervised Domain Adaptation by Backpropagation [Ganin+, ICML'15]
概要
Adversarial Multi-task Learning for Text Classification [Liu+, arXiv'17] の中で使われていたgradient reversal layerとは何だ?という事で読んだ.手法の部分しか読んでないので細かい実験結果などは省略.
文脈としてはMulti-task learningというよりDomain adaptationで,大まかなやりたいことは↑の論文と同じ.
入力から抽出した特徴量がf, fを入力として推定するソースドメインにおけるラベルをy, 同じくfを入力として推定する現在のドメインをdとして,y,d に関する損失を とする.
y, d についてのパラメータはそれぞれの損失 を最小化するように,fについてのパラメータはを最小化し,かつ欲しいのはドメイン不変な特徴量であるためを最大化するように学習したい.つまり,以下が更新式になる.
この の第二項目にあたる符合の逆転を誤差逆伝搬時に上手いことやっているのがgradient reversal layer.
となる関数がf -> d の間にあると考えれば良いとのこと。
DL系のフレームワークの内部で自動微分をどうやっているか詳しくないので何とも言えないが、関数を定義する時に順方向・逆方向の処理をそれぞれ持っておくような形になっているんだろうか?
ここにCaffe実装のコードと補足資料があったのでどうやってるか今度確認・・・.
しかしこういうのがあるならなんでGANとかではDiscriminatorとGeneratorを交互に訓練するようなことをやっているんだろう?同じ理屈で一括で出来そうな気もする・・・。 (話は少し変わるが,過去に読んだGANのコードではGeneratorの訓練時にDiscriminatorのパラメータを固定していなかったのだが、これは一般的な実装?Discriminatorの方のパラメータをわざわざ悪い方向に動かす理由がないと思うのだが・・・。)
Adversarial Multi-task Learning for Text Classification [Liu+, ACL'17]
概要
ACL'17採録予定の論文。Multi-task learningのText classificationタスクへの応用。よくあるMulti-taskもののモデルではhidden layerやembedding layer全体をタスク間で共有する事が多く、そうした際に上手くタスク共有(shared)のパラメータとタスク依存(private)のパラメータを分離して学習できないかという話。
モデル
single-taskでのベースモデルはLSTMを用いた単純な分類モデル。筆者の言う従来のmulti-taskモデル(FS-MTL)が上図 (a), 提案モデルその1 (SP-MTL)が (b).これだけだと最近domain adapationの文脈なんかでもちょくちょく出てきているタスク(ドメイン)非依存の層をMLPなりRNNなりで独立に作ってタスク依存の出力とconcatという単純なモデルだけど,この論文では共有部分にタスク非依存の情報が現れやすくなるように最近流行りのAdversarial Trainingを応用している。最終的な提案モデル(ASP-MTL)は下図。
具体的には、このモデルでは目的関数に (eq.13)と (eq.14)が加わっている。
は「shared-LSTMの出力を使って今どのタスクを解いているのかを識別する」 タスクの損失。しかし、shared-LSTMの出力には当然タスクを識別出来るような情報は含まれて欲しくないので,shared-LSTMは損失を最大化するように,Discriminatorは最小化するようにmin-maxな学習を行う。
良く分からなかった部分としてはGANのようなモデルの場合は実データの分布(画像とか)が存在するためDiscriminatorとGeneratorのそれぞれの訓練時に最適化は非対称になる。しかし,今回はいわばGeneratorの出力だけを用いて訓練を行なうようなケースであるため普通に交互に学習すると同じ形をした目的関数をそれぞれ逆側に引っ張り合うような状況になってしまうのではないか?と思ったがgradient reversal layer [Ganin+, '15] とかいうのを使うらしい。後で読む。
また、 はOrthogonality Constraintsと呼ばれており,S, Hはそれぞれshared, private-LSTMからの出力を1列として横に並べたもの。つまり同じ入力に対するshared, privateの出力がどれだけ近くなってるかを損失としている? フロベニウスノルムを使っているのは最適化が楽だから? その辺は[Bousmalis+, '16]にあるらしい。。
評価実験
データセットとしてアマゾンの商品に関するレビューのAmazon product review dataset, 映画のレビューに関するIMDB dataset, MR dataset. を用いたポジネガ判定。
比較モデルは MT-CNN [Collobert and Weston, '08], MT-DNN [Liu+, '15]. 前者は入力として単語IDを変換する部分だけembedding layerを共有したmulti-taskモデル, 後者は読んだこと無いので詳しくは分からないが入力はBOW, 隠れ層を共有した普通のMLPらしい。
結果(tbl.2)としてはやはりsingle-task <= 比較手法 <= FS-MTL <= SP-MTL < ASP-MTL で、特にadversarialな学習とOrthogonality Constraintsの効果が大きい。 各単語ステップごとのポジネガの分析では、例えば 赤ちゃんがよく眠れる〜という文脈で'sleepy' が出てきた時、映画の文脈ではこれはネガティブな単語なのでSP-MTLでは他タスクでの学習結果を引きずってネガティブ寄りに動いてしまうが、ASP-MTLではそれが解決されている (fig.5)。 また、あるタスクのshared-LSTMをn-1個のタスクでpre-trainingして固定した状態で学習させた所、多少劣るものの十分な精度が出ている(tbl.3) ことから十分タスク非依存で汎用的な情報が捉えられていそう。
Overcoming catastrophic forgetting in neural networks [Kirkpatrick+, arXiv'17]
解説スライドを見つけたのでメモ。
以前読んだ論文でもそうだったが、Multi-task Learningにおいて普通にそれぞれのタスクの最適化をしてしまうと前のタスクの情報を忘れてしまう、そのためにどうにかして前のタスクの重みを覚えておこうという話。
全タスクを含むデータの分布Dとパラメータに対して最適化対象となる
はタスク別にデータを考えた時ベイズの定理から
となる。第三項はconstとして無視,問題は第二項をどうするかだが[MacKay+, '92] によるとそれぞれのタスクAを訓練した後のパラメータ を平均としたガウス分布を仮定し,フィッシャー情報行列Fでこの項を近似する。最終的な目的関数は以下のようになるらしい。
実験ではMNISTの手書き数字認識タスクで評価。ピクセルをそれぞれのタスクごとに共通のランダムな置換パターンを用いてシャッフルして,擬似的に複数のタスクを作っている。結果は以下の通り。図Aでは普通にSGDした場合とL2正規化をかけた場合と提案手法(EWC)を比較。L2正規化の場合は逆に制限が強すぎて新しいタスクについて学習されない。図BではEWC, single taskの場合, [Goodfellow+, '14] の手法の比較.
また,この手法で結果的に得られたネットワークはそれぞれのパラメータがどちらにも使えるような形で学習されているのか,それともタスク間で使うパラメータを上手いこと分けているのかを確認するためにタスク間でのoverlapを図Cで確認している。(Fisher overlap についてはAppendix参照) 置換したピクセル数が多い(=それぞれのタスクが異なる)ほど低レイヤでのoverlapは低くなるが,出力ラベルが各タスクで共通のため高レイヤではoverlapが大きくなるのではないかとのこと。
また、MNISTだけではなく最近盛んなDRLでAtariを解くタスクでも手法の評価を行っている。この辺りあまり詳しくないので採用している既存研究の手法との絡みが分からなかったが、グラフを見る限り明らかに上手くいっているっぽい。 フィッシャー情報行列で近似できる云々の根拠がよくわからなかったので要確認。
MULTI-TASK SEQUENCE TO SEQUENCE LEARNING [Luong+, ICLR'16]
概要
前回に引き続きニューラルネットによるmulti-task learningもの。 橋本さんの論文中のモデルでは各タスクを1つずつ解き状態ベクトルを後段のタスクへと渡していく構造であったが、 それに対してこのモデルではEncoder-Decoderモデルで解けるそれぞれのタスク間でEncoderやDecoderを共有することでmulti-task learningを行っている。
実験では
1. Encoderを共有してtranslation, parsing, unsupervised taskを解く(one-to-many)
2. Decoderを共有してtranslation ,image captioning, unsupervised taskを解く(many-to-one)
3. タスクによってどちらかを共有してtranslation, unsupervised taskを解く(many-to-many)
の3種を試している。論文中の図が分かりやすい。
Unsupervised taskとしてはauto-encoderやskip-thoughtを試している。skip-thoughtって何?と思って調べると Skip-thought Vectorsに関する解説記事 があった. 複数文からなる文章を入力として取り、Encoder-Decoderモデルである文をEncoderで読み込んだ後Decoder側でその前後の文を生成するモデルを学習することで文ベクトルを構築するとか。
学習の際はハイパーパラメータとして各タスクがどれだけ学習されるかの比率を設定した上で、それぞれのタスクを切り替えながら行う。(大きい方に対して1x, 0.1x, 0.01xで比較)
結果としては、多くの場合multi-taskで解くことによって結果は改善されている。ただし比率によってはデータがそこまでないタスクが頻繁に学習されて過学習っぽくなってしまったいる場合も。 また、one-to-manyモデルにおけるautoencoderタスクによるtranslation, parsingの改善は特に無かったらしい。autoencoderの導入によってEncoderが出力する意味表現が頑健なものになるんじゃないか、との考えは前からあったのでこれは意外な結果。
一方、many-to-manyモデルではunsupervised taskの導入によって改善している場合も。ただしautoencoderとskip-thoughtでその様相は異なり、 autoencoderではtranslationに対して小さめの方が精度が上がるのに対してskip-thoughtではtest pplは近いほど良くなるが,BLUEはむしろ下がってしまう。 筆者の考えとしてはskip-thoughtsはある文の前後の文を予想するタスクであるため、Encoder-Decoder間で同じ意味の文を扱うtranslationとタスクが異なってしまっている事が原因だろう、と述べている。
データ量に差があるタスクならともかく、unsupervised taskのデータ量はかなり大きめで、タスク間でDecoderを共有していないにも関わらず比率をメインのタスクよりもかなり小さくしたほうが良い、というのもうーん?この辺の比率をパラメータサーチしたくないよなあ・・・
雑感
Decoderを共有する(Many-to-one, Many-to-many)モデルではEncoderから異なるタスクの似たような文が与えられた際、文自体にはどのタスクの入力かの情報がないのでどのタスクのDecodeをすればいいのか混乱するんじゃないか?という気もする。Google’s Multilingual Neural Machine Translation System: Enabling Zero-Shot TranslationのようにタスクのシンボルをEncoderに加えるとかすれば結果が良くなったりしないだろうか。