Google翻訳における多言語間翻訳の仕組みを転用して、応答時のテンションが変わるチャットボットを作ってみた

# はじめに
はじめまして。[NTTデータ数理システム][NTTデータ数理システム]でリサーチャーをしている大槻 (Ken) です。
人間と雑談を行うチャットボットを作ることに関心を抱いています。

最近あちこちでチャットボットを耳にするようになりましたね。
Microsoft の[女子高生AIりんな][りんな]や、LOHACO の[マナミさん][マナミさん]、リクルートテクノロジーズの [A3RT Talk API][A3RT] など、様々なチャットボットが盛んに開発されています。その勢いから [2016年はチャットボット元年だった][チャットボット元年]とも言われているほどです。ディープラーニング業界でも自然言語処理系の研究が急速に増えており、今後ますますチャットボットが熱くなりそうです！

私自身も人間と雑談を行うチャットボットを作ってみました。そのとき、よくある話ですが、「似たような質問に対しては、バリエーションに乏しい応答しかしてくれなくて機械っぽい」という悩みを抱きました。なんとかして、その時ごとに応答時のテンションが変わるチャットボットを作れたら面白い。そう思っていたときに [Google 翻訳の多言語翻訳に関する論文][Google翻訳論文1] [2] を読んで目から鱗だったので、その仕組みを転用して、応答時のテンションが変わるチャットボットを作ってみました。




[**注意**]

+ チャットボット制作において実際に用いたモデルとデータは諸事情あって公開できず申し訳ないです。
+ 実際に用いた学習データは、通常の (入力文, 回答文) の組ではなく、(入力文, 回答文, 感情ラベル) の組になっています。この記事で紹介するモデルで学習する際には、感情ラベルが必要になります。


# チャットボットの動向
一口にチャットボットと言っても色んなタイプがありますが、現在以下の2つが主流となっているように思います。

+ 「ユーザの入力文に応じて、予め用意してある幾つかの回答文の中から適切なものを選んで回答する」ようなタイプ
+ 一から回答文を生成していくタイプ

現在のところは前者のタイプのチャットボットが多く、主にお客様からの問い合わせに自動で対応することで人件費を削減する用途で用いられていますが、今後は後者のタイプが増えて来るものと思います。後者のタイプは、[sequence to sequence モデルを用いたもの][NCM] [1][3] が2015年に提案されて以降、盛んに研究・開発されるようになりました。それに関する記事や資料も多数公開されています:

* [PFI 2015年度夏季インターンシップ最終発表会](http://www.ustream.tv/recorded/74391829) (2人目の発表)
* [今更ながらchainerでSeq2Seq（2）〜Attention Model編〜](http://qiita.com/kenchin110100/items/eb70d69d1d65fb451b67)
* [Deep Learning for Chatbots, Part 1 – Introduction](http://www.wildml.com/2016/04/deep-learning-for-chatbots-part-1-introduction/)

ここで三番目の記事には、現状のチャットボットにおいて広く認識されている課題として、以下の項目が挙げられています:

* Incorporating Context  : 文脈を捉えられるようにしたい
* Coherent Personality   : 話者のパーソナリティに一貫性をもたせたい
* Evaluation of Models   : 対話システムの「良さ」をどう評価すべきか
* Intention and Diversity: 発話に意図や多様性をもたせたい

一番目の "Incorporating Context" については、「機械にいかに文章を理解させるか」という問題意識とも捉えられて、対話の枠組みを超えて広く研究されています。特に、QA や文書要約の分野は、ここ最近で急速にベンチマークが整備されたこともあり、現在非常に活発に研究されています。

今回はまさに四番目の "Intention and Diversity" について問題意識を抱き、Google翻訳で用いられたアイディアが使えそうだと思って実際に実験してみました。




# Google 翻訳について
昨年秋に Google が Google Neural Machine Translation (GNMT) と呼ばれる、[ディープラーニング手法に基づく新しい機械翻訳システムを導入した][Google翻訳ニュース]ことで大変話題になりました。そこで用いられているニューラルネットワークモデルは下の図 ([2]より) のように複雑な構成となっていますが、ベースとなっているモデルは、先程登場した [sequence to sequence モデル][seq2seq] [3] に [attention の仕組み][attention] [4] を加えたもので、機械翻訳のみでなく対話や文書要約など自然言語処理分野で広く用いられています。[GNMTの技術的詳細][Google翻訳論文2]については [5] に記載されています。

![Google翻訳モデル.jpg](https://qiita-image-store.s3.amazonaws.com/0/182963/4156fc92-07af-8f32-978a-b9f9002c701d.jpeg "Google翻訳モデル [2]")





# Google 翻訳の多言語間翻訳の仕組み
[Google 翻訳][Google翻訳]は103種類もの言語をサポートしているので、非常に多くの言語間の翻訳を行うことになります。それをどのようなニューラルネットワークモデルで実現するのがよいか、というのはとても気になる問題です。例えば「私は20歳です」といった日本語の文章が与えられたときに、それを英語に翻訳するときと韓国語に翻訳するときとでは、どのように処理を分けたらいいでしょうか。

Google の採った戦略 [2] は、ただ1つのニューラルネットワークを用いて多言語間の翻訳をまとめて学習してしまうことでした。英語に翻訳するときも韓国語に翻訳するときも、基本的には共通のネットワークを使えばよいのです！その代わり入力文に <2en>(英語に翻訳せよ) や <2ko>(韓国語に翻訳せよ) といったラベルを付け加えています。図1で言えば、入力文中の <2es> というラベルが、スペイン語への翻訳を指示しています。

![Google翻訳zero-shot.jpg](https://qiita-image-store.s3.amazonaws.com/0/182963/06256319-1d95-78eb-d381-d774e0f75867.jpeg "Google翻訳の多言語翻訳の様子 [2]")


とてもシンプルに核心を突いた方法で目から鱗が落ちる思いでした。このように「潜在的には似た構造をもつと思われる異なるドメインのデータ」に対して共通のパラメータで学習するのは有効です。日本語 ⇄ 英語の学習に対してもイタリア語 ⇄ フランス語の翻訳データも活用されるような転移学習の効果が発生して、学習の精度が向上します。実際上の図 ([2]より) のように、「成層圏は高度10kmから50kmの範囲にある」という共通の意味をもった各言語間の翻訳過程がクラスタを形成するように埋め込まれ、異なる意味をもった翻訳過程は離れた場所に埋め込まれているのが見てとれます。

それどころか、[Google Research Blog ][zero-shotブログ]で示されているように、「日本語 ⇄ 英語を学習し、韓国語 ⇄ 英語を学習すれば、日本語 ⇄ 韓国語を学習しなくても悪くない精度で実現できた！」といういわゆる Zero-Shot 翻訳が話題になりました。








# チャットボットに感情ラベルをつける
Google翻訳は「スペイン語に翻訳せよ」といった指令を翻訳前の文にラベル付けして、多言語への翻訳を行っていました。この仕組みを転用して、下図のようにチャットボットのユーザの入力文に対して「～な感情で応答せよ」という指令をラベルを付けすることで、所望の感情で回答を行うようにしてみました。実際に実装したモデルは Attention や種々の工夫を用いています (_いずれ記事にする予定_) が、図では最もシンプルな seq2seq モデルの場合を示しています。

![ラベルつきseq2seq.jpg](https://qiita-image-store.s3.amazonaws.com/0/182963/1c7d6225-bda0-56c5-bce5-b487128d797c.jpeg "感情ラベルつき対話モデル")

実際の実験で用いたデータセットは入力文の個数が 50,000 件程度 ((入力文, 回答文, 感情ラベル) の組の個数が 250,000件程度)、学習 Epoch 数は 50 です。 実験で明らかにしたかった部分は、感情ラベルを導入する前には噛み合った応答ができた入力文たち (200 件用意していました) に対して、感情ラベルを導入しても噛み合った応答ができるかどうかでした。その結果は、感情ラベルを導入してもきちんと噛み合い、さらに感情に応じた応答ができるようになりました。会話の一例を示します。

```
(入力文) 好きです<ニュートラル>
(回答文) 私も好きです

(入力文) 好きです<弱気>
(回答文) 本当ですか？

(入力文) 好きです<強気>
(回答文) 知っていますけど

(入力文) 好きです<親しみ>
(回答文) 私も好きですよ

(入力文) 好きです<曖昧>
(回答文) えっと
```
```
(入力文) 可愛いね<ニュートラル>
(回答文) 可愛いです

(入力文) 可愛いね<弱気>
(回答文) そんなことないです

(入力文) 可愛いね<強気>
(回答文) よく言われます

(入力文) 可愛いね<親しみ>
(回答文) ありがとうございます！

(入力文) 可愛いね<曖昧>
(回答文) 可愛いでしょうか
```


# モデルとデータ
諸事情あって実際に作成したモデルとデータは公開できず申し訳ないです。デモ用の簡易的なモデルとデータを準備中です。





[NTTデータ数理システム]:http://www.msi.co.jp
[チャットボット元年]:https://hitobo.io/blog/overview-of-the-chatbot/
[Google翻訳]:https://translate.google.com/?hl=ja
[りんな]:http://rinna.jp/
[マナミさん]:https://lohaco.jp/support/index.html?sc_e=zm_palj_aas_blh_cleg_dps_del
[A3RT]:https://a3rt.recruit-tech.co.jp/product/talkAPI/
[Google翻訳ニュース]:https://research.googleblog.com/2016/09/a-neural-network-for-machine.html
[Google翻訳論文1]:https://arxiv.org/abs/1611.04558
[Google翻訳論文2]:https://arxiv.org/abs/1609.08144
[NCM]:https://arxiv.org/abs/1506.05869
[seq2seq]:https://arxiv.org/abs/1409.3215
[attention]:https://arxiv.org/abs/1409.0473
[zero-shotブログ]:https://research.googleblog.com/2016/11/zero-shot-translation-with-googles.html



# 参考文献
[1] Oriol Vinyals, Quoc Le, A Neural Conversational Model, arXiv preprint arXiv:1506.05869, 2015.
[2] Melvin Johnson, Mike Schuster, Quoc V. Le, Maxim Krikun, Yonghui Wu, Zhifeng Chen, Nikhil Thorat, Fernanda Viégas, Martin Wattenberg, Greg Corrado, Macduff Hughes, Jeffrey Dean, Google's Multilingual Neural Machine Translation System: Enabling Zero-Shot Translation, arXiv preprint arXiv:1611.04558, 2016.
[3] Ilya Sutskever, Oriol Vinyals, Quoc V. Le, Sequence to Sequence Learning with Neural Networks, NIPS, 2014.
[4] Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio, Neural Machine Translation by Jointly Learning to Align and Translate, ICML, 2015.
[5] Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V. Le, Mohammad Norouzi, Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey, Jeff Klingner, Apurva Shah, Melvin Johnson, Xiaobing Liu, Łukasz Kaiser, Stephan Gouws, Yoshikiyo Kato, Taku Kudo, Hideto Kazawa, Keith Stevens, George Kurian, Nishant Patil, Wei Wang, Cliff Young, Jason Smith, Jason Riesa, Alex Rudnick, Oriol Vinyals, Greg Corrado, Macduff Hughes, Jeffrey Dean, Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation, arXiv preprint arXiv:1609.08144, 2016.