#### [更新2017-03-14]
- Tensorflow v1.0.0にアップグレードします。Tensorflowが大きく変化したため、後方互換はありません。
- Twitter Corpusを使用した事前
./go_example訓練されたモデルが追加されます。 (または私のチャットの例をプレビュー)- この
go_exampleスクリプトをトレースして、物事がどのように機能するかを知ることから始めることができます!
これは、Tensorflowの例から変更されたSEQ2SEQモデルです。
app.pyが含まれています。 ここでは、機能といくつかの実装のトリックに関するいくつかの詳細について説明しました。
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Twitterチャット、Open Movie Subtitle、PTTフォーラムなどのChat Corpusリポジトリからのコーパスを見つけることができます。次のようにパスの下に置く必要があります。
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
そして、いくつかのテスト文(行ごとの文)を作成します。
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
50程度で困惑するまでモデルを訓練した後、できることができます。
python3 main.py --mode test --model_name <MODEL_NAME>
[注!! !!!]このmain.py commmandにパラメーターを上書きする場合は、訓練とテストの両方に適用するか、lib/config.pyでfailsafeの場合に変更してください。
python3 app.py --model_name <MODEL_NAME>
既知のバグのSSL、Webhook、およびワークアラウンドなどの詳細については、この最小FB_Messengerの例を見ることができます。
興味深い比較は次のとおりです。左の会話により、Beam = 10でビーム検索が有効になりました。応答は、常に「わからない」よりもかろうじて優れています。適切な会話では、ビーム検索も使用され、さらにランゲージモデルを有効にしました。これは一般的な応答を抑制することになっており、応答はより良いようです。
[更新2017-03-09]補強学習は今機能していません。修正を待ちます。
モデルをさらに改善する機会が必要な場合は、Li et al。、2016に触発された強化学習アーキテクチャを実装しましたconfig.pyでentforce_learnオプションを有効にするだけで、 lib/seq2seq_mode.pyのstep_rf()関数に独自のルールを追加することをお勧めします。
まともなモデルを最初に取得するには、通常モードでトレーニングする必要があることに注意してください。 、補強学習は、この事前に訓練されたモデルで勇敢な新世界を探求するためです。悪いモデルから始めれば、自分自身を改善するために永遠にかかることになります。
Seq2Seqは、Cho et al。、2014によってリリースされた素晴らしいモデルです。最初は機械翻訳を行うために使用されていました。すぐに、他のものに何かをマッピングすることについては、seq2Seqモデルによっても達成できることに気付くでしょう。チャットボットはこれらの奇跡の1つであり、連続したダイアログをある種の「マッピング」関係と見なしています。
以下は、Gmail Auto-Reply機能に関するこのブログ投稿からのSEQ2SEQモデルアーキテクチャを示す古典的なイントロピクチャーを示しています。
問題は、これまでのところ、チャットボットのより良い目的機能を見つけていないことです。私たちはまだMLE(最大可能性の推定値)を使用していますが、これは機械翻訳に適していますが、常に「私も」、「私はそう思う」、「私はあなたを愛している」などの一般的な応答を生成します。
これらの応答は有益ではありませんが、コーパスのトレーニングに何度も現れる傾向があるため、大きな確率があります。チャットボットは常にこれらのノンセンスに返信することはないので、ボットをより「興味深い」、技術的に言えば、reponseの「困惑」を高めるための何らかの方法を見つける必要があります。
ここでは、Liの仕事を再現します。 et al。、2016この問題を解決してみてください。主なアイデアは、言語モデルと同じSeq2Seqモデルを使用して、各デコードタイムスタンプで高い確率でアンチモデルとして高い確率を持つ候補の単語を取得することです。その後、これらの単語は常に入力の確率が高いことをペナルティします。このアンチモデルにより、より特別な、一般的ではない有益な対応を得ることができました。
Liの元の作品。 et alは、対応する抗言語モデルの最良の確率の重み(スコア(t)= p(t | s) - λu(t) +γnt)の最良の確率の重みを見つけるためのメトリックとしてBLEUを使用してMERT(OCH、2003 )を使用します。しかし、チャットコーパスのブルースコアは常にゼロである傾向があるため、ここで意味のある結果を得ることができないことがわかります。誰かがこれについて何か考えを持っているなら、私にメッセージを送ってください、ありがとう!
lib/config.pyでモデルトレーニングと予測のためのいくつかのオプションがあります。基本的に、それらは自己説明されており、ほとんどの場合、デフォルト値で動作する可能性があります。ここでは、構成する必要があるもののみをリストします。
環境について
| 名前 | タイプ | 説明 |
|---|---|---|
| モード | 弦 | 作業モード:トレーニング/テスト/チャット |
| model_name | 弦 | モデル名は、作業パスに影響します(データの保存、nn_model、結果フォルダー) |
| scope_name | 弦 | Tensorflowでは、2つのグラフを同時にロードする必要がある場合は、異なる名前空間に保存/ロードする必要があります。 (1つのseq2seqモデルのみが必要な場合は、デフォルトのままにしておきます) |
| vocab_size | 整数 | コーパス言語に依存します:英語の場合、60000で十分です。中国語の場合、少なくとも100000または200000が必要です。 |
| gpu_usage | フロート | Tensorflow GPUメモリの分数は使用され、デフォルトは1であり、TensorflowはGPUの100%を占めます。 GPUリソースを共有するマルチジョブがある場合は、2または3のジョブで0.5または0.3にします。 |
| RENFORCE_LEARN | int | 補強学習モードを有効にするには、1を設定します |
デコードについて
| 名前 | タイプ | デフォルト | 説明 |
|---|---|---|---|
| beam_size | int | 10 | ビーム検索サイズ、設定1は貪欲な検索に等しくなります |
| アンチルム | フロート | 0(無効) | 対言語モデルの重量を罰します |
| n_bonus | フロート | 0(無効) | 文の長さの報酬の重み |
抗LM機能はデフォルトで無効になっているため、アンチルム= 0.5〜0.7およびn_bonus = 0.05の設定から開始すると、結果の違いが好きかどうかを確認できます。
トレーニングには、SEQ2SEQは大規模なモデルであるため、GPUが推奨されます。特に大きなビーム検索サイズを設定する場合、トレーニングを行い、効率的に予測するには特定のコンピューティング能力が必要です。
DRAMの要件は、確率的勾配を適切に行っているため、CPU/GPUのように厳密ではありません。
あなたがGPUのようなものをセットアップすることに慣れていないなら、Python環境はあなたにとって迷惑です、ここに私の機械学習環境のドッカーがあります:
(非GPUバージョンDocker) /(GPUバージョンDocker)
seq2seqは多くの予選を持つモデルであり、私はかなりの時間を測量するのにかなりの時間を費やしてきました。
RNN、LSTM、GRU、SEQ2SEQモデルを説明する最高のブログ投稿:Christopher OlahによるLSTMネットワークの理解。
この作業Sherjilozair/char-RNN-Tensorflowは、Tensorflowの言語モデルと実装グラフについて多くのことを学ぶのに役立ちます。
RNNについてのより多くの魔法に興味があるなら、ここに必読のブログ投稿があります:Andrej Karpathyによる再発性ニューラルネットワークの不合理な有効性。
バニラバージョンSEQ2SEQ+注意:Nicolas-Ivanov/TF_SEQ2SEQ_CHATBOT。これは、Vanilla Seq2Seqモデルの主要な流れを把握するのに役立ち、この作業に基づいてこのリポジトリを構築します。
現在、グラフからビーム検索を作成します。つまり、非常に遅いことを意味します。あちこちでグラフ内でそれを構築することについての議論があります。しかし、残念ながら、この抗LM作業のようにビーム検索以上のものを追加したい場合は、グラフにするためにビーム検索以上のものが必要です。
現在、BLEがゼロであるため、BLEを使用したMERTがどのように抗LMモデルの重量を最適化できるかはわかりません。