にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

チャットボットをディープラーニングで作成

チャットボットをディープラーニングで作成

  • アマゾンプライムビデオを見ていたら、涼宮ハルヒの憂鬱が公開されており、懐かしい気持ちで見ていました。私がアニメとSFにハマるきっかけとなった思い出の作品です。
  • この作品をみてSFを調べだし、汎用AIに興味を持つに至りました。そして、高校生の身分でチャットボットを作ろうとしたのですが、当時はプログラミングスキルも、確率場に関する知識もはなかったので、あきらめていたのでした。
  • 今なら簡単なチャットボットなら組むことができるので組んでみて無念を晴らそうと思います。f:id:catindog:20161211205017p:plain

背景

  • 高校生の時の夢を叶えるべく、DeepLearningによるチャットボットを作る
  • GoogleのSeq2Seqではヘルプデスクの文章を学習させることによって、「人間らしい」チャットボットの作成に成功した
  • 人間らしいチャットボットとは、問題解決のタスクではなく、自然な応答を返してくれるようになること

f:id:catindog:20161211205103p:plain

環境

  • 764unitを3層重ねたLSTM, RNN, DeepLarning
  • Windows 10 x64
  • GTX 1050
  • Anaconda(Python 3.5)
  • Chainer latest
  • 学習時間は2時間弱でした
  • Memory 24GByte
  • CPU Corei7

データ・セット

  • 本当は女の子と話すシチュを想像していたのですが、男の子と女の子の会話のペアが取れそうになかったので、アニメのシナリオを利用することにしました
  • アニメや映画のシナリオではキャラAとキャラBが交互に話すスタイルを取っています。そのため、キャラAとキャラBの対話を一つのデータとして学習させることで、チャットボットを作成します

f:id:catindog:20161211205123p:plain

  • このサイトを参考にしたのですが、データ量が少なすぎで、一般的な応答の特徴の獲得までに至っていないようです。膨大なアニメのシナリオレポジトリ、ないでしょうかね。[1]
  • テキスト情報に換算して1.4MByte程度しかなかったです。
使用したアニメのタイトル一覧
 コードギアス 反逆のルルーシュ
デュラララ!!
東のエデン
エルフェンリート
涼宮ハルヒちゃんの憂鬱 & にょろーん☆ちゅるやさん
けいおん!
らき☆すた
涼宮ハルヒの憂鬱
日常
誰も知らない
まどか☆マギカ
狼と香辛料
侵略!イカ娘
天体戦士サンレッド
東方夢想夏郷
...and more

動作確認

λ python chatbot.py --model cv\latest_anime_640.chainermodel --vocabulary data\anime\vocab .bin
INTPUT なんか違わなイカ!?
OUTPUT あんたはかもでゲソ

ちゃんとイカ娘の文脈になる

λ python chatbot.py --model cv\latest_anime_640.chainermodel --vocabulary data\anime\vocab .bin
INTPUT やあ、長門っち、長門っち!
OUTPUT え? ま、ちょっとな、何考えなの何だよ。まだイカ娘のほうがまだ出るのかもしれない

ハルヒの文脈にならない、データが足らないか

λ python chatbot.py --model cv\latest_anime_640.chainermodel --vocabulary data\anime\vocab .bin
INTPUT 死にます
OUTPUT イカ姉ちゃん、がんばってください

がんばる。

λ python chatbot.py --model cv\latest_anime_640.chainermodel --vocabulary data\anime\vocab .bin
INTPUT 雨降るって言ってました?
OUTPUT ねー! なんてやって……

雨の話題にならないですね。収束率は悪くなかったので、データ量とデータ・セットの特性によるかもしれない。

感想

  • 数ギガに及ぶ対話文があれば、一般的な会話の応答が学習できるのではと思いました。実際は1.4Mしかないです。
  • WindowsでのPythonC++などのプログラミング、めっちゃ消耗しませんか。大変でした...
  • エンドレスエイトの戦犯、未だに許せません...