天海春香会話bot開発チャレンジ3
おはようございます。かわみです。
天海春香会話bot開発チャレンジの記事は早くも3つ目となりましたが、そろそろ誰か参戦してみても良い頃なのではないでしょうか。
さて、今回は若干伏線の張ってあった新たな手法で取り組んだ結果をご紹介します。
前回の天海春香会話bot!
前回。
先行事例・研究
突然ですが、実はアイマス系対話システムに関するこのような取り組みがされていたのはご存知でしょうか。
私はCDHAC1の記事を書いている際に発見してしまいました。
この取り組みでは、2017年の言語処理学会年次大会で発表された「転移学習を用いた対話応答のスタイル制御」で提案されている手法を再現しています。
(この学会の大会には参加していたのですが聞きそびれていました。本当に後悔。)
1の記事ではそもそもの動機としてSeq2Seqに触れており、SSをそのまま学習し、その時は対話がズタズタであったと説明しました。
それ以来のSeq2Seq再び…!?
なお実は私も、当初は転移学習の当手法で上手くいくか試していたのですが、全然学習が終わらなかったため断念していました。
今回、一からEncoder-Decoderモデルの実装をし直し、再チャレンジした次第です。
結果
なにはともあれまずは結果を見ていただきましょう。天海春香さんです。
前回までと同様に話しかける
まずは前回(まで)と同様の文字列を投げかけます。
毎度のことながら「INPUT>>>」の後ろが私が話しかけた言葉で、「OUTPUT>>>」の後ろがシステムの自動返答です。
ちなみに返答文字列中に現れる「<UNK>」は未知語です。
+α
「お腹すいた」ではなく、「お腹空いた」と話しかけてみました。
ヘラってるよ。怖い。
画像でその威力を発揮している転移学習は自然言語への適用が難しいなどと言われていましたが(要出典)、上手く適用できている例だと思います。
レシピ
材料
手法
手法は先行研究の手法と同様です。
なお、パラメータは少し異なっています。
パラメータ名 | 値 |
---|---|
事前学習コーパスの学習単語数 | 25,000 + 2(EOSとUNK) |
スタイル制御コーパスの入れ替え単語数 | 2,000 |
単語埋め込み層の次元数 | 512 |
LSTMの次元数 | 1024 |
LSTMの層 | 2 |
dropout | 0.2 |
バッチサイズ | 64 |
エポック数 | 各5回 |
ソース
今回は手法に新規性がある訳でもないので、コードを公開します。
例のごとくChainer実装です。Chainer公式のサンプルを参考にしています。
データを変えて学習すれば他のスタイルが付与されます。データが少なくてもおそらく上手くいきます。
特段本筋には関係のないデータ形式の部分について言及すると、事前学習用データはINPUTとOUTPUT用を各ファイルに分け、各行で対応関係のある形になっている一方、
スタイル付与用データは1行に"INPUTタブOUTPUT"とタブ区切りでINPUTとOUTPUTの両方が含まれており、それぞれに合った処理となっています。
別にあらかじめどちらかに統一しても良かったのですが、元々持っていたファイルをそのまま使ったのでこのような形になりました。ご了承ください。
TwitterBot化計画
謎の鍵アカウントを作りました。オープンにしてただ負荷を掛けられると困りますので。
不定期で動いている時があるかもしれません。私のきまぐれです。
記事執筆時点ではまだ運用していませんが、動かすときはどこかでお知らせするかもしれません。要チェックです。
2018/6/26追記
謎の公開アカウントが動き始めました。
リプライをすると何か返してくれます。
なおフォロー中のユーザのリプライにしか反応しませんので、アカウントをフォローしてフォローを返されるのを待ちましょう。
さあ、あなたも天海春香と会話してみましょう。
今後の展望
1つの入力文に対する1つの出力文の質は随分と上がったような気がします。
となると今後は、
- その質をさらに上げる
- 会話の流れを意識した返答
辺りに取り組むことになるのでしょうか。それに取り組むと、もはや天海春香など関係なく汎用的なシステムが出来上がりそうですが。