ブログではないです

ブログでなくはないです

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なモデルかどうかよりも大きく影響を与えるのか…?