Github: https://github.com/Conchylicultor/DeepQA
深いQ&A
目次
プレゼンテーション
この作業では、 ニューラル会話モデル (別名Googleのチャットボット)の結果を再現しようとしています。 これは、文の予測にRNN(seq2seqモデル)を使用します。 これはpythonとTensorFlowを使って行われます。
プログラムのローディングコーパスの部分は、 マックノートのTorch neuralconvoからインスピレーションを受けています。
今のところ、DeepQAは次のダイアログコーパスをサポートしています:
- Cornell Movie Dialogsコーパス(デフォルト)。 リポジトリのクローン作成時にすでに含まれています。
- OpenSubtitles ( Eschnouのおかげで)。 はるかに大きなコーパス(しかしまた雑音)。 それを使用するには、 その指示に従い 、–
--corpus opensubs
フラグを使用します。 - 最高裁判所の会話データ( julien-cのおかげで)。
--corpus scotus
使用して使用--corpus scotus
。 インストール手順を参照してください 。 - Ubuntu Dialogue Corpus ( julien-cのおかげで)。
--corpus ubuntu
を使って利用--corpus ubuntu
ます。 インストール手順を参照してください 。 - シンプルなカスタム会話形式を使用して、あなた自身のデータ( julien-cのおかげです)です(詳細はこちら )。
トレーニングをスピードアップするために、事前に訓練された単語埋め込みを使用することもできます( Eschnouのおかげで)。 詳細はこちら 。
インストール
プログラムには次の依存関係が必要です(pip: pip3 install -r requirements.txt
を使用して簡単にインストールできpip3 install -r requirements.txt
)。
- Python 3.5
- テンソルフロー(v1.0で試験)
- 貧弱
- CUDA(GPUを使用する場合)
- nltk(文をトークン化するための自然言語ツールキット)
- tqdm(良いプログレスバー)
nltkを動作させるには、追加データをダウンロードする必要があります。
python3 -m nltk.downloader punkt
コーネルのデータセットは既に含まれています。 他のデータセットについては、readmeファイルをそれぞれのフォルダ( data/
内)に見てください。
Webインターフェイスにはいくつかの追加パッケージが必要です:
- django(1.10でテスト済み)
- チャンネル
- レディス( ここを参照)
- asgi_redis(少なくとも1.0)
ドッカーのインストールも可能です。 より詳しい説明はこちら 。
ランニング
チャットボット
モデルをトレーニングするには、単にmain.py
実行しmain.py
。 訓練をmain.py --test
、 main.py --test
( ‘save / model / samples_predictions.txt’で生成された結果)やmain.py --test interactive
(もっと楽しい)をmain.py --test
て結果をテストできます。
ここには役に立つフラグがいくつかあります。 その他のヘルプとオプションについては、 python main.py -h
:
-
--modelTag <name>
:テスト/トレーニング時に、現在のモデルに名前を付けて区別することを許可します。 -
--keepAll
:テスト時に、異なるステップで予測を表示したい場合は、このフラグを使用します(トレーニングの進行状況として名前と年齢が変わるのが面白いかもしれません)。 警告:–--saveEvery
オプションを増やさないと、すばやくたくさんのストレージスペースを取ることができます。 -
--filterVocab 20
または--vocabularySize 30000
:ボキャブラリのサイズを制限して、パフォーマンスとメモリ使用量を最適化します。<unknown>
トークンで20回未満の単語を置換し、最大ボキャブラリサイズを設定します。 -
--verbose
:テスト時に、計算された文を出力します。 -
--playDataset
:データセットのいくつかのダイアログサンプルを表示します(実行する唯一のアクションであれば--createDataset
と--createDataset
使用できます)。
TensorBoardで計算グラフとコストを視覚化するには、 tensorboard --logdir save/
実行します。
デフォルトでは、ネットワークアーキテクチャは、2つのLSTMレイヤ(隠しサイズ256)と語彙32の埋め込みサイズを持つ標準エンコーダ/デコーダです。ネットワークはADAMを使用して訓練されています。 最大の文章の長さは10語に設定されていますが、増加させることができます。
ウェブインターフェース
訓練を受けたら、より使いやすいインターフェースを使ってチャットすることができます。 サーバーはsave/model-server/model.ckpt
をsave/model-server/model.ckpt
するsave/model-server/model.ckpt
コピーされたモデルを調べ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
使用してください。 詳細はこちら 。
結果
驚くべきことに、わずか1〜2時間のトレーニング(GeForce GT 740M)、入力シーケンスを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の250000回の反復の後、ネットワークは依然として(主に「わからない」というオープンエンドの質問のほとんどに答えることによって)回避的な回答を与えますが、基本的な意味を統合しているようです。
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ファイルをDeepQA/save/
-
save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
からpreprocessedデータセットをdata/samples/
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をお持ちの場合は、ハイパーパラメータ/コーパスを使用してより良いモデルを練習してください。 私の実験からは、学習率と脱落率が結果に最も影響しているようです。 あなたのモデルを共有したい場合は、私に連絡することをためらってください。私はここにそれを追加します。
改善
より大きい/より深いモデルを試すことに加えて、テストすることができる小さな改良がたくさんあります。 あなたがそれらのいずれかを実装するならば、躊躇しないでプルリクエストを送信してください。 ここにいくつかのアイデアがあります:
- 今のところ、予測は決定論的です(ネットワークが最も可能性の高い出力を取る)ので、質問に答えるとき、ネットワークは常に同じ答えを与えます。 サンプリングメカニズムを追加することで、ネットワークはより多様な(そしてもっと興味深い)回答を与えることができます。 これを行う最も簡単な方法は、SoftMax確率分布から次の予測単語をサンプリングすることです。 これを
loop_function
引数と組み合わせることで、追加するのが難しくありません。 その後、より保守的な、またはエキゾチックな予測を得るためにSoftMax温度で遊ぶことが可能でなければなりません。 - 注意を追加すると、特に長い文章の場合、予測を改善する可能性があります。 これは、
embedding_attention_seq2seq
をmodel.py
embedding_attention_seq2seq
に置き換えることで簡単に行うことができます。 - より多くのデータを持つことは通常傷つけません。 より大きなコーパスを訓練することは有益であるはずです。 Redditのコメントデータセットは今のところ最大のようです(このプログラムがサポートするには大きすぎます)。 コーパスを作成するときに人為的にデータセットのサイズを増やす別のトリックは、各トレーニングサンプルのセンテンスを分割することができます(例:サンプル
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.
ような他の組み合わせQ:Sentence 1. => A:Sentence X.
は、質問を回答にリンクする遷移2 => X
を壊すので機能しません) - 私の他の音楽制作プロジェクトのように、テストカーブを実際に監視する必要があります。 これは、オーバーフィットに対するドロップアウトの影響を見るのに大いに役立ちます。 今のところ、テストの予測をさまざまなトレーニングステップで手動でチェックするだけで、経験的に行われます。
- 今のところ、質問は互いに独立しています。 質問をまとめてリンクするには、答えを出す前にすべての以前の質問をフィードし、エンコーダーに答えるのが簡単な方法です。 毎回それを再計算するのを避けるために、最終的なエンコーダでキャッシングを行うことができます。 精度を向上させるためには、個々のQAだけではなく、ネットワーク全体を再調整する必要があります。 また、以前の対話をエンコーダに送るとき、対話者がいつ変化しているかをエンコーダが知るように、新しいトークン
<Q>
と<A>
を追加することができます。 シンプルなseq2seqモデルは、文章間の長期依存関係を捕捉するのに十分なはずですが、わかりません。 同様の入力長をグループ化するバケットシステムを追加すると、トレーニングの速度が大幅に向上します。