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を用意して以下の式で という、ユーザーiからユーザーjへの発言をcoding する。
これを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の出力に
「なるほど」とか「それな」みたいな汎用性の高くて中身のない発言を取り除くために、N-best listから A diversity-promoting objective function for neural conversation models.による方法で以下の数式を用いて選ぶ。
第一項は入力のメッセージ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では固有名詞とかに強いっぽい。