12本目!A Persona-Based Neural Conversation Model.

ではでは、今度はChatbotに詳細な人物像(ペルソナ)を組み込んだモデルについて、見ていきたいと思います!

重要なのは4からっ!

Personalized Response Generation

この研究では2つのpersona-basedモデルを導入している。Speaker ModelとSpeaker-Addressee Modelがある。Speakerモデルが自分自身についての文章を生成するモデルで、Speaker-Addressee Modelは対話でのペルソナに応じて応答を適応させるモデルなのかな?

Notation

M は inputの単語列として M = {m_1, m_2, ..., m_I}として表記して、R は responseの単語列として R = {r_1, r_2, ..., r_j, EOS}として、表記している。 んで、Kがword embeddingのサイズで、Vがvocabularyのサイズとして定義されている。

Speaker Model

では、Speaker Modelについて見ていきたいと思います。 Speaker ModelはChatbot自身のペルソナをembeddingとして、表現するモデル。 年齢、性別、方言などの個人情報(?)に基づいた内容とスタイルを応答に埋め込みたかったけど、データセットに反映するのが大変だから、年齢とか住んでいるところとかでクラスター化したみたい。

つまり、Twitter上の個人情報に合わせて、「20代,男,関東在住」みたいな感じ?

v_i について、プログラムで書くとこんな感じで、

v_i = tensorflow.keras.layers.Embedding(V, K)
v_i = torch.nn.Embedding(V, K) 

埋め込みと表現して、LSTMにぶち込むみたい。 でも、tensorflowの方では

The model will take as input an integer matrix of size (batch, input_length), and the largest integer (i.e. word index) in the input should be no larger than 999 (vocabulary size).

ってあるんだけど、Vが1000未満のモデルってBERTじゃありえんぞ。まあ、pytorch使うからええんかな? ってか、この論文だとvocabraryのサイズが50,000とかなので、tensorflowはまず使えないってことかな?

Speaker-Adrresse Model

ここでは、相手によって言葉の表現を変えるということを学習する。 例えば、ツンデレでは好きな相手には「別にあんたのためじゃないんだからね。」みたいなセリフとなるところを、女友達には「うんうん。気にしないで。」みたいなセリフにするということ。

ここでは speakerのi, jを用意して以下の式で  V _ {i, j}という、ユーザーiからユーザーjへの発言をcoding する。

 V _ {i, j} = tanh(W _ 1 \dot v _ i + W _ 2 \dot v _ j)

これをpytorchで表現すると以下のようになる。

v_i = torch.nn.Embedding(V, K) 
v_j = torch.nn.Embedding(V, K) 
W_1 = torch.nn.Linear(K, K)
W_2 = torch.nn.Linear(K, K)
V_ij = torch.tanh(W_1(v_i) + W_2(v_j))

あとはこのV_ijについて、Speaker-Model と同様にしてseq2seqにぶち込むだけである。

Decoding and Reranking

応答の出力では beam-searchによる N-best listの生成を行って、このN-best listから最も良い応答を選ぶ。 bearm-searchのサイズは200(やっぱでかい。)で長さは20tokensを限度としている。 tokenの出力にtokenが出てきたやつはすべてN-best listに追加している。

「なるほど」とか「それな」みたいな汎用性の高くて中身のない発言を取り除くために、N-best listから A diversity-promoting objective function for neural conversation models.による方法で以下の数式を用いて選ぶ。

f:id:kaya-takashiro:20210929170029j:plain
n_best

第一項は入力のメッセージMとspeakerのvectorから、応答Rが生成される確率で、speakerに特有の確率の計算。 第二項は応答RからメッセージMが生成される確率で、「いってらっしゃい」と「いってきます」みたいな定型的な掛け合いに対しての確率の計算。 第三項はただ単に応答Rが長ければいいっていう項。

んで、これらの最適化にλとγが使われているんだけど、どうやっているのかは不明。多分、前述の論文で詳しく書かれているのかもしれない。 調べたら、以下の論文で見てくださいってあったorz.

BLUEへの最適化にはMinimum Error Rate Training in Statistical Machine Translationという論文が使われている.

Datasets

さてさて、みんな大好きなデータセットについて最後に見ていきます。

Twiiter Persona Dataset

このデータはtwitterのFireHouseによって集められたデータです。んで、このFireHouseが何かというと、Streaming APIに用意されている、全公開ツイートをリアルタイムに取得可能な機能という、ただデータを集めるのに最適なAPIです。公式ページ。 ただ、Streaming APIはenterprise専用だから個人での利用は難しいと思われる。

3-turn以上の会話に6か月間で60回以上参加していた人から集めている。 スライドを含めて、24,725,711個もの3-turnの会話を集めている。でも、TwitterのIDしか集められていないから、Speaker-Modelにしか使われていないらしい。

Twitter Sordoni Dataset

Microsoftのサイトでダウンロードできるデータセット。base-lineとして使用した。

Televison Series Transcripts

FirendsとBig Ban Tehoryっていうドラマ(?)の字幕を使っている。 データを抜き出したサイトはIMSBbっていうところ。でも、調べたときFriends消えてたorz. 他にもOpenSubtitleっていうサイトとかSubsceneっていうサイトでデータを集められるらしい。でも、こいつらには誰がしゃべったかっていう情報が抜けている。そのため、1対1の対話と仮定して学習したらしい。

つまり、まず初めに字幕のCharacterなしのデータセットでOpen-domain Chatbotをつくる。この時の v_i, v_j はともに0とする。そのあとで、FirendsとBig Ban Tehoryを使って、Personaの学習をしている。

Results

Speaker-Model でも、Speaker-Addressee Modelでも結果はMutual Information Setting等の定量的には変わらない。 定性的にはSpeaker-Addressee Modelでは固有名詞とかに強いっぽい。