ブログではないです

ブログでなくはないです

Gradual Fine-Tuning for Low-Resource Domain Adaptation (Xu+, Adapt-NLP'21)

https://aclanthology.org/2021.adaptnlp-1.22.pdf

ドメイン適応についてのワークショップ論文.自分が将来引用することになった時向けのこういうのがあった,という簡単なメモ.
主な内容としてはfine-tuning時にout-domainのデータを混ぜて学習するマルチドメイン学習とfine-tuningを組み合わせたもので, 徐々に使うout-domainデータの比率を減らして最終的にin-domainのデータだけ使うように段階的に訓練していくような手法.

実験はMultiWOZを使ったDialog state tracking. 比較しているモデルはドメイン適応しないものと,通常のfine-tuningが主な所で,こういうout-domain, in-domainの比率や順番について論ずるならmixed fine-tuningとかドメインタグを使ったmulti-domain learningとかとも比較すべきなのでは?out-domainデータの割合がハイパラな割に,そこを明確に決めるのは難しくないか?その影響は?という辺りが感想.

THE CURIOUS CASE OF NEURAL TEXT DeGENERATION (Ari+, ICLR'20)

https://arxiv.org/pdf/1904.09751.pdf

概要

ニューラルテキスト生成モデルのdecodingに関する論文.
ニューラルテキスト生成では単語ごとに生成確率を推定して,そのargmaxを取っていく形 (いわゆるgreedy decoding) や beam searchによる生成が一般的なアプローチである.ただ,そうしたやり方では対話応答生成やstory generationなど,出力の高い多様性が期待されるタスクにおいて情報量の少ない似たような出力,あるいは同じフレーズを延々とリピートするような生成が行われてしまう事が問題で,それをどうにかしたいという話.

手法

論文中ではNucleus samplingという手法を提案している.かなりシンプルで,確率分布の単語について上位からの累積確率を計算し,それがハイパーパラメータp (論文中ではp=0.95) に達するまで単語を候補に追加し,その中から確率に従って選択するというもの (例えば [0.5, 0.3, 0.15, ...] という分布なら累積確率 [0.5, 0.7, 0.95, ...] なので3単語目までが対象) . 既存手法にはtop-k samplingなどと呼ばれる,decode時に確率分布内の上位k単語だけを候補とし(論文中の実験ではk=40 or 640を試している),truncateした分布からランダムに選択する手法があるが,それとかなり似ている.
意図としては,確率分布がpeakyでまず間違いなく次はこの単語が来る,といった状況で,kを大きく取った時に超低確率な単語がたまたまサンプルされてしまって変な文になったり,逆にflatな確率分布に対してkが小さいと生成の幅が狭くなってしまうので,分布に応じてコントロールしたいということのようだ.

実験

f:id:jack_and_rozz:20210312191424p:plain:w400

GPT-2を用いてシードとなるパラグラフの続きを生成するタスクで,いくつかのdecoding手法を提案手法と比較. いくつかの評価尺度 (中身は論文参照) について,人間の書いたテキストとの近さを比較していた.結果としては,greedyやbeam searchと比べてsampling-basedな手法ではrepetitionがかなり抑えられているし,self-BLEUも低く(≒互いに異なる生成文に)なっている.ただ,top-k samplingと比べて提案手法に大きく優位性があるかと言うと怪しい? *1

雑感

sampling-basedなやり方で多様性が上がりそうなのも,argmaxを取るアプローチで問題が起きてしまうのも分かるが,主にrepetition周りなど,根本的になんでこんなことになるのか,という部分で納得しきれなかった感じがある(ちゃんと読み込めていないだけかもしれない)
下図は論文中のちょっと面白かった分析で,"I don't know. " というフレーズをひたすら生成し続けて,その生成確率を眺めてみると,生成すればするほど同じフレーズの生成確率が高くなる正のフィードバックループになっていたそうな.こういう同じものをひたすら繰り返す例は訓練例に無いはずなのに,結果的にこうなってしまうのはdecodingだけの問題なのか?argmaxを取ることそのものじゃなく,repetitionを避けるような分布が計算できていない事が問題,あるいは今のアーキテクチャの計算の何かが原因となって,正のフィードバックループが自然と出来るようになってしまっているのではないか?という感覚も個人的にはある.

f:id:jack_and_rozz:20210312195058p:plain:w400

*1:自分でも試してみたが,正直top-kもNucleus samplingもハイパーパラメータ次第で傾向が大きく変わってしまうのでなんとも言えない感じがあった

In Neural Machine Translation, What Does Transfer Learning Transfer? (Aji+, ACL'20)

https://www.aclweb.org/anthology/2020.acl-main.688.pdf

タイトルの通り,機械翻訳における言語対間転移学習についての分析論文.想定している設定としては大規模データが存在する言語対 (e.g., En-> De) で訓練したモデル(parent) を小規模なデータしか無い言語対 (e.g., Id -> En) で再訓練する (child),という言語対間の転移学習.

主な実験内容としては
1. parentモデルとして有効な言語対はあるか?向きは関係あるか?
2. embeddingsとinner layers, どちらの転移が有効に働いているのか?
3. parentとchildで言語が異なる時,embeddingsはどう初期化するのが良いのか?
など.

結果としては

  1. 特にparentによる大きな差は確認できず.なんと向きもそんなに関係なく,(自分の理解では)Id->Enのparentとして De->Enを用いてもEn->Deを用いても変わらない,とのこと.直感的には前者のほうがtarget側の言語が一致している分,parentの時点でdecoderが英語の言語モデルとして訓練されているので有利な気がするのだが… 向きはともかくどの言語を選ぶかについては,言語そのものよりもどういうデータセットがparent側で用意出来るかに大きく左右されるので結論が出にくい話だろうとも思う.

  2. それぞれの転移をablation testして検証していた (転移しない場合ランダム初期化の後再学習).両方効いているが,inner layersの寄与が大きく,埋め込みだけ転移してもあまり効果が無いとのこと.

  3. parentとchildのモデルで初めから共通の語彙集合を作る joint vocabularyが一番良く,次点で表層が完全一致するsubwordだけ埋め込みを転移するtoken matchingが良いとの結果.そもそも言語対の異なる翻訳モデルをparentとして転移学習する感覚が自分としてはあまりなく,別の言語のembeddingsを(単語間で意味の一対一対応が辞書的に取れるような場合でも無い時に)他の言語の初期値として使ってそんなに嬉しいことあるのか?という感想だったが,色々初期化の方法が提案されていることからそういう設定もそれなりにメジャーなんだろうか. ただ,本文中でも触れられていたがjoint vocabularyはchildを先に決めた状態でparentを訓練しなければいけないので,childごとにparentの再訓練が必要というのがやはりあまり好みではない.

この研究では比較されていなかったが,自分なら大規模対訳コーパスが無い言語対で翻訳モデルを訓練するならまず教師なしNMT + 小規模対訳コーパスでfine-tuningを考えるのだけど,それと比べてどうなんだろう.大規模な単言語コーパスを前提としてるのかどうかでまた話が違うだろうけど.

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