ブログではないです

ブログでなくはないです

A Diversity-Promoting Objective Function for Neural Conversation Models [Li+, NAACL'15]

概要

A Persona-Based Neural Conversation Model [Li+, ACL'16] の一つ前の論文。
実験していてもそうだったが、seq2seqベースの対話はやはり典型的な応答 (e,g, I don't know. )が頻出する事が問題になるらしく、 それをどうにかしようという話。

手法

基本的な考え方としては  {\displaystyle
\hat{T} = argmax_T \{ \log{(T | S)} - \log{p(T}) \}
} を最大化することで生成される文がいわゆる典型的な表現であった場合にペナルティを加える、というもの。 簡単な式変形から明らかだが、結局  \log{p(S,T) \over {p(S)p(T)}} 、発話と応答の相互情報量を最大化していることに等しい。

これに加えて典型的な表現をペナライズする程度の調整が効くように 
\hat{T} = argmax_T \{ \log{(T | S)} - \lambda\log{p(T}) \}
(1)
としたものと、ベイズの定理から式変形して  \hat{T} = argmax_T \{ (1-\lambda)\log{(T | S)} - \lambda\log{p(S | T}) \} (2)
としたものの2種類を検討している.前者をMMI-antiLM, 後者を MMI-bidi と呼んでいる。 また、訓練時にλを最適化するのが現実的に難しいため、この手法はdecode時にだけ用いているらしい。decode時には改めて各種係数を最適化している。

(1) MMI-antiLM
ここで問題にしているのは、 p(T) をペナルティとすることは単純な言語モデルとしての性能を下げる事につながっているため,文法的におかしい文が出力されやすくなってしまうこと。 この際、入力をエンコードした情報は出力文の初めの方に強く影響しがちで、出力の後半になるほど出力部のみでの言語モデル(decoderの途中の出力)の影響が支配的になる。事実、普通にやると出力文の後半の方が文法がおかしくなるとのこと。そのため、適当に閾値  \gamma を決めた上で

 {\displaystyle U(T) = \prod^{L_t}_{i=1} p(t_i \ | \ t_1, t_2 , ... , t_I) \cdot g(i)
}

 {\displaystyle g(i) = \begin{cases}
1 \  \ (i \leq \gamma) \\
0 \  \ (i > \gamma)
\end{cases}
}

として、  p(T) U(T) に置き換えて最適化をしている。一種のattentionモデル。 こうすると、文全体の出力確率をペナライズするのではなく文の前半部分の出力確率をペナライズする事になるため、出力文の前半部に典型的なパターンが来ることを避けた上で、性能の劣化を避けている。ちょっとアドホックな気もするが、  g(i) を連続的に変化させるやりかたでは駄目だったとのこと。

 p(T)の部分、実装的にはどうしてるんだろう? decoder単体で別に訓練している?

(2) MMI-bidi
こっちでは、入力・出力を逆にしたseq2seqを学習して直接 { \log{(S \ | \ T)} }を求めている。 そこで問題になるのは、出力文の探索空間が広すぎるためありえる全ての出力文に対する  { \log{(S \ | \ T)} } の計算が現実的には不可能であること。 そのため、第一項だけを使ってbeam-searchからN-bestな応答を生成した上で、第二項を使って選択するというやり方にしている。

実験

データセット

  1. Twitter Conversation Triple Dataset
    [Sordoni, '15]のデータセットの拡張。

  2. OpenSubtitles dataset
    [Tiedemann, '09] による60M~70Mほどの映画での会話集。ただ、あるセリフを誰が喋っているのかが明記されていないため、話者が同一なのか異なるのかがわからない事が問題になる。そのため、 [Vinyal, '15]と同じやり方をする、

    OpenSubtitles datasetの中身を知らないためここの対処法の意味がよく分からない

もしくはInternet Movie Script Database と呼ばれるものを用いて、誰が喋っているのかを特定する、というやり方を取っている。

設定

4layer, hidden:1000, learning rate:0.1, batch:256
だいたい Vinyalとかがやる設定と同じ。

評価

BLEUと、生成の多様性を見るためにdistinct-1, distinct-2と呼ばれる、応答全体に含まれる1-gram, 2-gramの種類数を同じく1-gram,2-gramの総数で割ったものでも評価している。

結果

数値的には軒並み上昇。生成された応答も面白くなっている。しかし最適化してるものは同じなのにMMI-antiLMとMMI-bidiでそこまで差が出るものか。 (1) 出力文後半についてはペナライズしない、attention的なやり方を加える のと、(2) 第一項で生成したあと第二項で選択する、というようにフェーズを分ける というのが違いであるように読めたけど・・・。