ブログではないです

ブログでなくはないです

T-CVAE: Transformer-Based Conditioned Variational Autoencoder for Story Completion (Wang+, IJCAI'19)

https://www.ijcai.org/Proceedings/2019/0727.pdf

Variational Transformers for Diverse Response Generation (Lin+, arXiv'20) を読んだ ので先行研究の方も読んでみる.こっちもコードが公開されている.概ね (Lin+, arXiv'20)のGVTと同じようなモデルで,Transformer-Encoderの各出力を適当なベクトルでattentionしてまとめたものから正規分布の平均・分散を計算し,そこからサンプルされる潜在変数zをdecodeに使うというもの.GVTではdecoderの初期入力ベクトルとして使っている一方で,T-CVAEの方ではdecoderの処理は一通り終えた後,出力層の直前でconcat + FNNで変換して使っていた.

また,翻訳のような入出力で言語が異なるタスクと違って,この研究ではStory Completionという文章の中から欠けた一部分を生成する単一言語内のテキスト生成タスクを対象としている.そのためちょっとした工夫としてEncoder/Decoderのパラメータを共有して,同一空間で物事を処理出来るようにしているとのこと.RNN-basedでやっていた時も同一言語ならEncoder/Decoderを共有して良いのか?埋め込みはどうなのか?みたいな話があり結局どうなのかなあ,多少冗長でもパラメタ増えてモデルの自由度を上げた方がいいのか,逆にあちこち共有してパラメタを少なくして,encoder/decoder両方の側からパラメタに対する制約を増やしてやったほうが良いのか,Transformerでdecoderの埋め込み・出力層を共有してるのがいい感じに働いてる事を考えると,パラメタ減らしたほうがスッキリしてて良さそうだけど結局どうなんだろうねという感想.少なくともこの研究の実験ではshareした方が良くなってる.

ちょっとよく分からなかった部分として,Variationalな手法である以上訓練時にposteriorの計算には完全な文章全体を,priorの計算には復元すべき部分を除いた文章をエンコードしたものを用いるはずだけど,一部が欠けた文章をどう入力しているんだろう,という所.例えばsent3が欠けている時に他の部分を単純に [sent1, sent2, sent4] みたいに繋げてしまうと何処の部分が欠けているのかがモデルには分からなくなってしまうし,[sent1, sent2, , sent4] みたいにプレースホルダを入力している感じでもなさそう.(出力として入力文章内の位置を出していないのでタスク設定としてそもそもどこの部分が欠けているかはgivenだと理解している) …と思って少し考えたが,入力の際に通常のTransformerにおけるposition embeddingだけではなく,segment embeddingというものもconcatしているため,先ほどの例で言うと入力文章の中でsent3に相当するsegment embeddingだけが無い,という事から何処が欠けているのかが伝わる,ということだろうか?

評価データセットはROCStory dataset,metricは対話でおなじみのBLEU-n, dist-nに加えてAdverSuc と Gram & Logicというものを使っていた.

f:id:jack_and_rozz:20200625160103p:plain:w400
f:id:jack_and_rozz:20200625160107p:plain:w300

上の表がメインの結果,下の結果がablation testで上から順に提案手法 (Shared T-CVAE),Shared Transformer, Unshared T-CVAE, Unshared Transformer. ShareするかしないかがVariationalなモデルかどうかよりも大きく影響を与えるのか…?

Variational Transformers for Diverse Response Generation (Lin+, arXiv'20)

https://arxiv.org/pdf/2003.12738.pdf

自分が対話モデルを訓練する時は主にメジャーなフレームワーク中で実装されていることが多いという理由で通常のTransformerを使うことが多く,CVAEなどVariationalな系統のモデルは触ってはみたもののあんまり深入りして来なかった.自分が以前その辺り調べていたときはKL-Vanishing problemとかが囁かれだして,まだ道具として使うには枯れていないのかなあという印象だったが,今どんなもんなのか,対話やるならとりあえず使っといて損はない感じなのか把握したいので新しめのを読んでみた.

名前の通り,TransformerにVariationalな要素を入れたよという研究.コードも公開されている. 提案モデルは2つあり,1つ目がGloval Variational Transformer (GVT) というモデル. 普通にやるとCVAEで分布のパラメータを計算する際にTransformer-Encoderのどの出力ベクトルを用いるかが問題となるわけだが,ここではエンコーダの先頭に特殊なトークン ("CLS") を追加して,その位置の出力ベクトル(≒ CLSを中心に入力全体に対してself-attentionしたもの)を用いている.RNN-Encoderで最後のトークンについての出力を使うとか,全出力の平均を取るとかに比べてself-attentionしてるからまあまだマシ?という印象.それ以外は基本的にCVAEと大きくは変わらず,分布からサンプルされた潜在変数をデコーダの初めの入力にして,Transformerと同じdecodingをする.

2つ目はSequential Variational Transformer (SVT) .GVTではCVAEと同様にUtterance, ResponseそれぞれのTransformer-Encoderを用意して,入力をエンコードしたベクトルからpriorを,入出力両方をエンコードしたベクトルからposteriorを一度だけ計算していた. 一方で,SVTではそれをdecodingの各ステップで行う(詳細はfigure 2).Priorを計算する際は応答のまだ出力していない部分についてはマスクして,入力+出力済みの応答からpriorを,入力 + 応答全体から posteriorを計算するような仕組みになっている.結構ごちゃごちゃしていて把握が大変.

また,どちらのモデルも訓練時に,後述するKL annealing (Bowman+, CoNLL'16) *1 とbag-of-words loss (Zhao+, ACL'17) を使って学習を安定させているらしい. *2

実験ではMojiTalk, PersonaChat, Empathetic-Dialoguesなどのデータセットで,perplexity, dist-N, 人手付与したCoference, Engagednessなどで評価.C-VAE, Transformerと比べても各指標はそこそこ良くなってはいるが・・・?対話の評価指標って複数サンプルをじっくり見たり自分でInteractiveに会話してみないとどこまで良くなってんのかなんとも(英語だから自分の言語感覚が乏しいというのもある).

同様の発想に基づくモデルとして T-CVAE: Transformer-Based Conditioned Variational Autoencoder for Story Completion (Wang+, IJCAI'19) というのがあるらしいので後で読む.

*1:cross entropy lossとKLの損失を足し合わせる際,KLの方の重みを0->1 で増加させる.おそらく学習後半でKLがほとんど無視されてしまうのを防ごうとしている?

*2: bag-of-words lossは正解応答内の単語を順序関係なしにpredict出来ているかを表す損失で, (Zhao+, ACL'17) eq. (5) によるとbag-of-words lossは { \displaystyle \log p(x_{bow}|z, c) = \log \Pi^{|x|}_{t=1}  \frac{e^{f_{x_t}}}{\sum_{j}^{V} e^{f_j} } } と表される. { \displaystyle x}は応答,{ \displaystyle x_{bow} } を応答に含まれる単語のBoW,{ \displaystyle V}はdecoderの語彙セット, { \displaystyle f = MLP_b(z, x) \in R^V} は潜在変数と入力発話だけから推定されるdecoder語彙内の各単語へのスコア.MLPは別途この損失のためのレイヤを追加している?おそらく意図としてはBoWの推定にdecoderの状態を関与させず,入力と潜在変数だけから出力すべき単語を推定させることで,decoderの言語モデルとしての能力に支配された汎用的な応答生成を防ぐ,ということだと思う.

Out-of-Domain Detection for Low-Resource Text Classification Tasks [Tan+, EMNLP' 19]

https://www.aclweb.org/anthology/D19-1364.pdf

概要

分類問題,例えば発話のintent classificationなどのモデルにおいて, 学習時に用いた出力ラベルセット中に含まれない Out-of-domain (OOD) example がテスト時には入力される事が考えられ,そうしたexampleの検出・拒否が必須になる (元論文table1) .しかし現実的に入手可能な正例(出力ラベルセットに含まれる例)の少なさと,負例が無限に存在しうることから,適当にOOD exampleを集めてきて in-/out-domainの二値分類機を訓練するのはうまく行かないのでどうにかしよう,という話.

提案手法

設定としては,in-domainの入力テキスト { \displaystyle x^{in} }, out-domainの入力テキスト { \displaystyle x^{out} }, そして { \displaystyle x^{in} } に対するラベル { \displaystyle S^{in}} が与えられた上で,入力テキストをエンコードしたベクトルと各ラベルを表すベクトルのコサイン類似度 { \displaystyle F (x, S)} を計算する.この類似度が適当に決めた閾値よりも大きければそのラベルへ割当て,どれとも近くなければOOD exampleであるとして検出を行う. この際,通常であれば出力層のようなstaticな行列(≒各ラベルの埋め込み列)を用意して分類モデルにするところだが,提案手法ではそのラベルに属する全入力テキストをエンコードして平均したものをそのラベルのベクトルとする(Prototypical Network というらしい).つまり,学習されるパラメータは入力テキストのエンコーダのみとなる.

その上で,以下の3種類の損失の重み付け和を最小化する(α,β,M1, M2はハイパーパラメータ).

f:id:jack_and_rozz:20200515162543p:plain:w230
f:id:jack_and_rozz:20200515162554p:plain:w260
f:id:jack_and_rozz:20200515162546p:plain:w230

(1) は正例を対応するラベルに近づける cross-entropy loss, (2) は負例 (OOD) をラベルから遠ざけるmargin loss. (3)は正例とラベルとの類似度のスケールが低くなりすぎないようにする margin loss.これが無いと(2)の学習の結果, 正例でも類似度が全体的に低くなって閾値以下になってしまうだろう…とのこと((2)と(3)だけでいいんじゃないか?という気もする).

雑感

取り組んでる問題は面白く感じるのだが,そのアプローチが効果的な対策になってるのか?という部分がまだピンと来ない.特にPrototypical Networkにinspireされたと筆者は述べているが,自分の感覚ではPrototypical Networkの利点は学習時に存在しないラベルでも後からテキストをエンコードするだけで擬似的なラベルの埋め込みを作れるという部分であって,今回のようにIn-domain exampleについては各ラベルごとに訓練データが存在するという状況では,普通にjointでラベル埋め込みを学習して,それとの距離が遠くなるように最適化しても変わらないのでは?と感じる.

また,実際 in-/out-domainの二値分類器を学習すると何が起こるかを想像するに,学習時に使われなかったタイプのOOD exampleが入力された時に判別が困難となると考えられるが,それをsoftmaxの最大値を使うのではなくベクトル同士のcos類似度を用いて閾値に掛けることで改善できる,という理由が理解しきれていない.人間がこのタスクを試みる場合,特定ラベルへの確信度が高くない場合OOD,というルールに暗黙のうちに従っていると考えられるわけで,重要なのは距離学習的なアプローチを取ることではなく閾値を使ってvalidateすることなのでは?

Generating More Interesting Responses in Neural Conversation Models with Distributional Constraints [Baheti+, EMNLP'18]

http://aclweb.org/anthology/D18-1431

ニューラル対話応答モデルにおいて起こりがちな、"I don't know." を連発するといったdull conversationを解決しようという話。 方針としてはベースラインとなるSeq2Seqでも用いている応答生成の確率分布 { \displaystyle P(Y|X)} に加えて 発話をX、応答をYとした時に
(1)トピックTの一貫性: { \displaystyle sim(P(T|X), P(T|Y))}
(2)発話・応答の類似度: { \displaystyle sim(P(X), P(Y))}
を重み付けして応答生成時のスコアリングに用いるというもの。

(1)のトピック類似度計算についてはHMM-LDAベースの手法を用いて単語単位でトピックに対する確率分布を推定した後、それを文全体に適用して文単位のトピックに対する確率分布を得て、発話応答間でのコサイン類似度で計算。(2)の意味的な類似度については文中の単語wについてのembeddingを { \displaystyle {a} \over {a + P(w)}}で重み付け(P(w)はunigram probability)して平均を取るという手法でかなり優秀な文ベクトルを作れるらしく、それを使って作った2つの文のコサイン類似度を用いている。 こうした割とシンプルな手法を取る理由としてはこの計算はdecodeの途中で1単語生成するごとに行うため、計算に時間が掛からずかつ生成途中の不完全な文に対しても適用できる手法が望ましいため。

実験では訓練にOpenSubtitles, テストにCornell Movie Dialogue Corpusを用いている。(OpenSubtitlesはノイジーなので評価に使いたくないとのこと) また、訓練に使うOpenSubtitlesについても Jiwei Liが NAACL'16で使っていた際の前処理を加えたいい感じのコーパスを使い、なんとそれを配布してくれている。正直自分で使っていてもこんなノイジーで大丈夫かよ感があったのでこれは試してみたい。

結果としては既存手法 (MMI, TA-Seq2Seq)と比較して、生成例 (右端) も大分diverseになっているように見えるし、定量的にもdistinct-1, 2 (生成された応答の単語のばらつき具合で測る応答の多様性) も大幅に上がっている。 f:id:jack_and_rozz:20181116112453p:plain:w400
f:id:jack_and_rozz:20181116112459p:plain:w400

An Overview of Multi-Task Learning in Deep Neural Networks [Ruder, arXiv'17]

https://arxiv.org/pdf/1706.05098.pdf

マルチタスク学習 (MTL) についてのサーベイ論文。マルチタスクの利点や考え方、これまでの手法などがニューラル・非ニューラル共に列挙されていて勉強になった。

自分がこれまで読んできたニューラルベースのMTL論文だとネットワーク間で陽にパラメータを共有するhard-sharingな手法が主で、パラメータは独立に持つけれども共有されていて欲しい2つのレイヤ間の類似度を損失として加えるなどするsoft-sharingな手法はあまり見てこなかったので新鮮。 その違いについて、MTLを行うタスクの性質次第では片方のタスクにしか役にたたないような特徴量がそれぞれあったりするような場合などの場合には, hard-sharingなモデルを用いてそれらを1つのベクトルに押し込めるとあるタスクにおいては使われない特徴量がノイズとして働くので、soft-sharingな形を取るほうが有望なのではないか、とのこと。

とは言っても [Liu+, ACL'17] のようにhard-sharingではあるがprivate/shared それぞれに空間を用意してやってそれらがきちんと分離されるような学習を行う形もあるわけで、結局どちらがいいのか?というところはやってみなきゃ分からないのかな。

NLPのNC2組のタスクについてM通りの設定でMTLしてみました、という論文あったりしないだろうか。結局どういう設定でどの手法がどれだけいいのか、そしてそれがタスクごとにどの程度異なるのか、というところを網羅的に知りたい。

他には private/sharedなレイヤを交互に配置する Cross-stitch Networkや、パラメタ行列をmatrix factorizationして private/sharedなものに分解するという手法 (どういう意味があるんだろう・・・?) あたりが見たこと無いタイプで面白かった。

Relation Extraction まとめ

関係抽出タスクについて読んだものをメモ。新しいの読むたび更新。


Global Relation Embedding for Relation Extraction[Su+, NAACL'18]

関係抽出タスクにおいては下図のような2つのエンティティ間のラベル付き係り受け関係(shortest dependency path)を主要な特徴量として分類を行う。 その際にある係り受け関係 (nsubjpass, born, mod:in) と、関係抽出タスクにおける出力である知識グラフ上に定義される関係ラベル (place_of_birth) とのコーパス全体における共起関係を再現するように係り受け関係の埋め込み (textual relation embedding) を学習した上で関係抽出モデルで活用するという話。

肝としてはtextual relation embeddingの学習の際にコーパス全体における統計量を用いていることから、distant supervisionに基づき構築されたデータセットにおけるノイズに対して頑健になるとのこと。

f:id:jack_and_rozz:20180902162632p:plain:w600

Riedel+, ECML-PKDD'10 によるNew York Times Corpus (NYT)からDistant supervisionで構築された関係抽出データセットを使用。

疑問点: fig3の係り受け関係から関係ラベルの確率分布への写像、なんでわざわざ系列長1の系列としてGRUでデコードしているんだろう?


Neural Relation Extraction with Selective Attention over Instances[Lin+, ACL'16]

Distant-supervisionで構築されたデータセットでは関係を持つエンティティの組が登場する文であっても、必ずしもその関係について言及しているとは限らないにも関わらずそれを無条件に正例とみなしているという問題がある。[Zeng+, EMNLP'15] ではあるエンティティの組を含む複数の文のうち少なくとも1つは推定対象の関係について言及しているとの仮定のもと、もっとも信用のおける文のみを使うことでそれを解決しようとしていた。それに対してこの論文ではそれぞれの文をCNNでエンコードしたベクトルに対するアテンションを張ることで動的な重み付けを可能にしている。データセットはNYT。


End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures [Miwa+, ACL'16]

上述した2つの研究をはじめとして、NYTなどのデータセットを用いた関係抽出タスクは登場するエンティティがgivenである設定のもと行われていた。 それに対してエンティティのスパン(とそのタイプ)の抽出をSequence labelingタスクとして解いた上で、特定したエンティティのそれぞれの組に対して関係分類を行うend-to-endな関係抽出モデルを提案。関係分類にあたっては係り受け関係をbidirectional tree LSTMでエンコードし、エンティティのスパン抽出に用いたエンコーダの出力(該当の2つのエンティティの箇所)と組み合わせて用いる。係り受け関係についてはエンティティ間の最短のものや文全体のものなどablation testで試していたが、少なくとも最短のものがないと駄目とのこと。 データセットは ACE2004, ACE2005。

f:id:jack_and_rozz:20180904155353p:plain:w400


Constructing Datasets for Multi-hop Reading Comprehension Across Documents [Welbl+, arXiv'17]

https://arxiv.org/pdf/1710.06481.pdf

概要

WIKIHOPというReading comprehensionのデータセットの作成・分析についての話。データセットの分析や関連研究との比較,RCデータセットの構築で起こりがちなバイアスについてなどしっかり気を使っていて勉強になった。

タスクとしてはWikipedia中の記事を読んで,Wikidata上に登録されている他エンティティの関係性を表すトリプル (subject, relation, object) のobjectを当てる。 *1 WikiReading に似ているが大きな違いはタイトルにもmulti-hopとあるように,subjectとなるエンティティの記事だけではなくそこに含まれるリンクを辿って,関係のある他の記事も用いた上でobjectを当てる形式にしていること。 またWikiReadingはobjectの名前を記事中からの抽出,あるいはモデル自身の語彙から生成する必要があるテキスト生成タスクであるのに対し,WIKIHOPは候補objectが与えられた上での選択タスクになっている.*2

どういうことかというと例えばfig.1 のような例では ("Hanging gardens of Munbai", "country", ?) というクエリの回答として "India" を推定する上で必要な情報は"Hanging gardens of Munbai"には書かれておらず,リンクを辿って "India"までの全ての記事を見てようやく推定が可能になる.このように推定のためには複数記事の情報を統合する必要があるような関係トリプルを集めたデータセットとなっている。

fig1  fig2

具体的にデータセットをどう作っているかというとfig.2のようにsubjectとなる記事からスタートして,記事中に登場した全ての他エンティティについての記事も辿る,というのをtype-consistent entityに当たるまで繰り返す。 type-consistent entityの定義はwikidata中に登録されている他の全トリプル中で,クエリのrelationを伴って登場したことのあるobject。今回の例だと (*, "country", object) というトリプルがwikidataに存在していれば object はtype-consistent entity であり,その記事にたどり着けばそれを回答候補に加え探索を打ち切る。*3

ここでは省略するが実験においては簡単なベースラインやneural-basedなモデルなどいろいろ試した上で,登場する回答候補エンティティを[Hermann+, NIPS'15]のようにマスクすることで表層を手がかりとして使わせない(=文脈をちゃんと理解するように強制させる)場合や関係のない記事を抜いた場合どう変わるのかなど,実験結果の分析についてもなかなか興味深い事が色々。

*1:ここでは省略するがWikipedia/Wikidata以外にも薬剤に特化した知識ベースを使ってMEDHOPというデータセットも作っている

*2:WikiReadingのような設定の場合,エンティティ名って結構低頻度語であることが多いと思うんだけどその結果必要以上に生成が難しくなっちゃったりしないんだろうか?

*3:この際タスクの趣旨のためにsubjectの記事にobjectが登場するようなものは除外している