seq2seqと強化学習で学習させたチャットボットです。
シーケンス2シーケンス
Seq2seq は構造化学習の古典的なモデルであり、その入力と出力は両方ともシーケンスです
バニラの seq2seq モデルは、NIPS '14 論文「ニューラル ネットワークによるシーケンス間学習」で説明されており、エンコーダーとデコーダーは分離されています。
このリポジトリの seq2seq モデルは、ICCV '15 の論文「Sequence to Sequence -- Video to Text」で説明されているものと同様の 2 つの LSTM で構築されており、エンコーダとデコーダは同じ重みを共有します。
RL
十分なエポックでチャットボットをトレーニングした後、ポリシー勾配と呼ばれる RL 手法を使用してチャットボットをさらに改善します
こうすることで、チャットボットは報酬関数に関してより興味深い応答を生成できます。
私の報酬関数は、EMNLP '16 の論文「対話生成のための深層強化学習」で説明されているものと似ています。
チャットボットの結果をいくつかお見せします。
結果 1 (A と B は両方ともトレーニング済みチャットボットです)
A: お願いをしてもらえますか?
B: 何でもいいよ。
A: お父さんを曲げてほしいんです。
B: もちろんです。
A: 大変申し訳ありませんが、失礼なつもりはなかったのですが。
B: 理解できないでください、少なくとも私ができる限りのことです。
結果 2 (A と B は両方とも訓練されたチャットボットです)
答え: やってないよ!銃を持っていない!
B: 嘘つきだね。あなたはまだお金を取り戻したいと思っています。
A: 真実とは何かが間違っています。
B: ちょっとだけでは取れないお金はいらないんです。
A: どうしたの。
B: 聞いてください。今は怖いです。
A: ああ、お金が全部必要になるので、助けてください。
結果 3 (A と B は両方とも訓練されたチャットボットです)
A: コカ・コーラを買うのを忘れました。
B: 頭に何か挟まったんです。
A: 大丈夫、それは多くのクソサイトではよくあることだと思うよ。
B: つまり、子供の頃からずっと一緒にいたのよ。
A: それはなおさらです。
B: それは彼のせいではなく、彼のせいで、彼が盲目なのは神のせいです。
A: それは奇妙な話です。
このディレクトリでチャットボットの結果をさらに見つけることができます
それらの結果のニューラル ネットワークの構成はファイル名に記述されます。
チャットボットの結果に驚きましたか? :D
この素晴らしいダイアログを自分で生成することもできます。
以下の指示に従ってください。
pip install -r 要件.txt
./script/download.sh
./script/simulate.sh <モデルへのパス> <シミュレートの種類> <入力ファイル> <出力ファイル>
<モデルへのパス>
seq2seq ダイアログを生成するには、「 model/Seq2Seq/model-77 」と入力します。
RL ダイアログを生成するには、「 model/RL/model-56-3000 」と入力します。
<シミュレートタイプ>
1 または 2 のいずれかになります
数字はチャットボットが考慮する前の文の数を表します
1 を選択すると、チャットボットは最後の文のみを考慮します
2 を選択すると、チャットボットは最後の 2 つの文 (ユーザーからの文とチャットボット自体からの文) を考慮します。
<入力ファイル>
result/sample_input_new.txt を見てください。
これはチャットボットの入力形式であり、各行がダイアログの開始文になります。
便宜上、サンプル ファイルを使用することもできます。
<出力ファイル>
出力ファイル、任意のファイル名を入力します
チャットボットに質問ごとに 1 つの応答のみを生成させたい場合
以下の指示に従ってください。
pip install -r 要件.txt
./script/download.sh
./script/run.sh <タイプ> <入力ファイル> <出力ファイル>
<タイプ>
seq2seq 応答を生成するには、「 S2S 」と入力します。
強化学習応答を生成するには、「 RL 」と入力します。
<入力ファイル>
result/sample_input_new.txt を見てください。
これはチャットボットの入力形式であり、各行がダイアログの開始文になります。
便宜上、サンプル ファイルを使用することもできます。
<出力ファイル>
出力ファイル、任意のファイル名を入力します
チャットボットをPython2.7でトレーニングしました。
チャットボットを一からトレーニングしたい場合
以下の手順に従ってください。
python/config.py を見てください。トレーニング用のすべての設定がここに説明されています。
一部のトレーニング ハイパー パラメータを変更することも、元のパラメータをそのまま保持することもできます。
Cornell Movie-Dialogs Corpus を使用しています
ダウンロードして解凍し、すべての *.txt ファイルを data/ ディレクトリに移動する必要があります。
次に、pip を使用していくつかのライブラリをダウンロードします。
pip install -r 要件.txt
./script/parse.sh
./script/train.sh
seq2seq モデルの結果をいくつか示してみましょう:)
./script/test.sh <モデルへのパス> <入力ファイル> <出力ファイル>
そして、seq2seq モデルからのダイアログの結果をいくつか示します。
./script/simulate.sh <モデルへのパス> <シミュレートの種類> <入力ファイル> <出力ファイル>
<シミュレートタイプ>
1 または 2 のいずれかになります
数字はチャットボットが考慮する前の文の数を表します
1 を選択すると、チャットボットはユーザーの発話のみを考慮します。
2 を選択すると、チャットボットはユーザーの発話とチャットボットの最後の発話を考慮します。
python/config.pyのtraining_typeパラメータを変更する必要があります
seq2seq トレーニングの場合は「normal」、ポリシー勾配の場合は「pg」
安定するまで、最初に「通常」でいくつかのエポックをトレーニングする必要があります (少なくとも 30 エポックを強くお勧めします)
次にメソッドを「pg」に変更して報酬関数を最適化します。
./script/train_RL.sh
ポリシー勾配 (pg) を使用してトレーニングする場合
逆モデルが必要になる場合があります
反転モデルも cornell movie-dialogs データセットによってトレーニングされますが、ソースとターゲットが逆になります。
事前にトレーニングされた反転モデルをダウンロードできます。
./script/download_reversed.sh
または自分でトレーニングすることもできます
事前にトレーニングされた反転モデルを使用する場合、反転モデルに関する設定を変更する必要はありません。
RL モデルの結果をいくつか生成して、seq2seq モデルとの違いを見つけてみましょう :)
./script/test_RL.sh <モデルへのパス> <入力ファイル> <出力ファイル>
そして、RL モデルからのダイアログの結果をいくつか示します。
./script/simulate.sh <モデルへのパス> <シミュレートの種類> <入力ファイル> <出力ファイル>
<シミュレートタイプ>
1 または 2 のいずれかになります
数字はチャットボットが考慮する前の文の数を表します
1 を選択すると、チャットボットは最後の文のみを考慮します
2 を選択すると、チャットボットは最後の 2 つの文 (ユーザーからの文とチャットボット自体からの文) を考慮します。
OS: CentOS Linux リリース 7.3.1611 (コア)
CPU: Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz
GPU: GeForce GTX 1070 8GB
メモリ: 16GB DDR3
Python3 (data_parser.py 用) & Python2.7 (その他)
黄ポーチー / @pochih