この研究では、神経会話モデル (別名 Google チャットボット) の結果を再現しようとしています。文の予測には RNN (seq2seq モデル) を使用します。これは Python と TensorFlow を使用して行われます。
プログラムのコーパスの読み込み部分は、macournoyer の Torch neuralconvo からインスピレーションを得ています。
現時点では、DeepQA は次のダイアログ コーパスをサポートしています。
--corpus opensubs
フラグを使用します。--corpus scotus
使用して利用できます。インストール手順を参照してください。--corpus ubuntu
を使用して利用できます。インストール手順を参照してください。トレーニングを高速化するために、事前トレーニング済みの単語埋め込みを使用することもできます (Eschnou のおかげで)。詳細については、こちらをご覧ください。
このプログラムには次の依存関係が必要です (pip: pip3 install -r requirements.txt
を使用して簡単にインストールできます)。
nltk を機能させるには、追加データのダウンロードが必要になる場合もあります。
python3 -m nltk.downloader punkt
Cornell データセットはすでに含まれています。他のデータセットについては、それぞれのフォルダー ( data/
内) にある Readme ファイルを参照してください。
Web インターフェースにはいくつかの追加パッケージが必要です。
Docker のインストールも可能です。詳しい手順はこちら。
モデルをトレーニングするには、 main.py
実行するだけです。トレーニングが完了したら、 main.py --test
(結果は「save/model/samples_predictions.txt」で生成) またはmain.py --test interactive
(もっと楽しい) を使用して結果をテストできます。
ここでは便利なフラグをいくつか紹介します。さらにヘルプとオプションが必要な場合は、 python main.py -h
使用してください。
--modelTag
: テスト/トレーニング時に現在のモデルを区別するために、現在のモデルに名前を付けることができます。--keepAll
: テスト時にさまざまなステップでの予測を確認したい場合は、トレーニング時にこのフラグを使用します (トレーニングの進行につれてプログラムの名前と経過時間が変化するのを見ると興味深い場合があります)。警告: --saveEvery
オプションを増やさないと、すぐに大量のストレージ スペースが消費される可能性があります。--filterVocab 20
または--vocabularySize 30000
: 語彙サイズを制限し、パフォーマンスとメモリ使用量を最適化します。 20 回未満使用された単語を
トークンに置き換え、最大語彙サイズを設定します。--verbose
: テスト時に、計算された文を出力します。--playDataset
: データセットからいくつかのダイアログ サンプルを表示します (これが実行したい唯一のアクションである場合は、 --createDataset
と組み合わせて使用できます)。 TensorBoard を使用して計算グラフとコストを視覚化するには、 tensorboard --logdir save/
実行するだけです。
デフォルトでは、ネットワーク アーキテクチャは、2 つの LSTM 層 (隠れサイズ 256) とボキャブラリの埋め込みサイズ 32 を備えた標準エンコーダ/デコーダです。ネットワークは ADAM を使用してトレーニングされます。文の最大長は 10 単語に設定されていますが、増やすことができます。
トレーニングが完了すると、よりユーザーフレンドリーなインターフェイスを使用してチャットできるようになります。サーバーは、 save/model-server/model.ckpt
にコピーされたモデルを確認します。初めて使用するときは、次のように構成する必要があります。
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
次に、サーバーをローカルで起動するには、次のコマンドを使用します。
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
起動後、インターフェイスは http://localhost:8000/ で利用できるようになります。プログラムをサーバーにデプロイする場合は、代わりにpython manage.py runserver 0.0.0.0
を使用してください。詳細については、こちらをご覧ください。
驚くべきことに、入力シーケンスを 5 ワード、出力を 3 ワード (さらにgo
トークンとeos
トークン) に大幅に削減し、小規模な埋め込みサイズ (25 程度)。それ以来、コードを修正し、出力の長さは入力の長さと一致する必要がありますが、このバージョンを使用すると元の結果を再現できます。もちろん、ネットワークは実際にはあまり活発ではありません。
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
失敗するケースをいくつか示します。
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
文が長いと、ネットワークのトレーニングが大幅に遅くなります。 maxLength=10 で 250,000 回反復した後でも、ネットワークは主に (自由形式の質問のほとんどに「わかりません」で答えることによって) 回避的な回答を返しますが、いくつかの基本的なセマンティクスが統合されているようです。
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
最後の質問で示されたように、ネットワークでは依然として性別と現在/将来の間で混乱が生じています。また、より深い哲学的な質問も試してみましたが、多かれ少なかれ成功しました。
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
私がトレーニングしたモデルは、私が設定した埋め込みサイズとそのサイズ、およびトレーニング コーパスのサイズによってかなり制限されます。その「思考ベクトル」もおそらく小さすぎて、次のような質問に答えることができません。
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
また、場合によっては、質問に関係のないトレーニング セットから文が飛び出すだけなので、過剰適合しているようにも見えます。ドロップアウトを追加すると、問題が軽減されるはずです。
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
注: リンクはもう機能しません。
事前トレーニングされたモデルはここで見つけることができます、デフォルトのコーパスのトレーニング済み。使用するには:
DeepQA/save/
内の zip ファイルを解凍します。save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
からdata/samples/
にコピーします。./main.py --modelTag pretrainedv2 --test interactive
を実行します。 Nicholas C. のおかげで、ここ (オリジナル) には、さまざまなデータセット用の追加の事前トレーニング済みモデル (TF 1.2 と互換性のある) がいくつかあります。このフォルダーには、Cornell、OpenSubtitles、Ubuntu、および Scotus 用の前処理済みデータセットも含まれています ( data/samples/
内に移動するため)。これらは、データセットを自分で処理したくない場合に必要です。
ハイエンドの GPU をお持ちの場合は、ためらわずにハイパー パラメーター/コーパスを試して、より良いモデルをトレーニングしてください。私の実験によると、学習率と中退率が結果に最も影響を与えるようです。また、モデルを共有したい場合は、遠慮なく私に連絡してください。ここに追加します。
より大きくてより深いモデルを試すことに加えて、テストできる小さな改善がたくさんあります。これらのいずれかを実装する場合は、遠慮なくプル リクエストを送信してください。以下にいくつかのアイデアを示します。
tf.nn.seq2seq.rnn_decoder
のloop_function
引数と組み合わせることで、追加はそれほど難しくないはずです。その後、SoftMax 温度を操作して、より保守的または珍しい予測を取得できるようになります。model.py
のembedding_rnn_seq2seq
をembedding_attention_seq2seq
に置き換えることで簡単になります。Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
生成できます)新しいサンプル: Q:Sentence 1. Sentence 2. => A:Sentence X.
、 Q:Sentence 2. => A:Sentence X. Sentence Y.
およびQ:Sentence 2. => A:Sentence X.
警告: Q:Sentence 1. => A:Sentence X.
のような他の組み合わせは、質問と質問をリンクするトランジション2 => X
が壊れてしまうため機能しません。答え)
と
を追加して、対話者がいつ変化したかをエンコーダが認識できるようにすることもできます。ただし、単純な seq2seq モデルが文間の長期的な依存関係を捉えるのに十分であるかどうかはわかりません。バケット システムを追加して同様の入力長をグループ化すると、トレーニング速度が大幅に向上する可能性があります。