上部に注意:プロジェクトは維持されていません。
トランスベースのダイアログモデルはより適切に機能し、RNNベースのCakechatの代わりにそれらを使用することをお勧めします。たとえば、https://github.com/microsoft/dialogptを参照してください
Cakechatは、会話を介して感情を表現できるチャットボットのバックエンドです。

CakechatはKerasとTensorflowの上に構築されています。
コードは柔軟であり、任意のカテゴリ変数によってモデルの応答を条件付けることができます。たとえば、独自のペルソナベースのニューラル会話モデル[1]をトレーニングするか、感情的なチャットマシン[2]を作成できます。

モデル:
埋め込み層:
デコード
メトリック:
Dockerに精通している場合は、以前に訓練されたCakechatモデルをサーバーとして実行する最も簡単な方法です。 sudoで次のコマンドを実行する必要がある場合があります。
CPUバージョン:
docker pull lukalabs/cakechat:latest &&
docker run --name cakechat-server -p 127.0.0.1:8080:8080 -it lukalabs/cakechat:latest bash -c "python bin/cakechat_server.py"
GPUバージョン:
docker pull lukalabs/cakechat-gpu:latest &&
nvidia-docker run --name cakechat-gpu-server -p 127.0.0.1:8080:8080 -it lukalabs/cakechat-gpu:latest bash -c "CUDA_VISIBLE_DEVICES=0 python bin/cakechat_server.py"
それでおしまい!次のコマンドをホストマシンで実行して、Cakechatサーバーをテストします。
python tools/test_api.py -f localhost -p 8080 -c "hi!" -c "hi, how are you?" -c "good!" -e "joy"
応答dictは次のようになるかもしれません:
{'response': "I'm fine!"}
Dockerは、環境をセットアップし、トレーニングとテストのためのすべての依存関係をインストールする最も簡単な方法です。
注:Cakechatモデルのトレーニングには、GPU対応環境を使用することを強くお勧めします。推論は、GPUとCPUの両方で行うことができます。
Dockerをインストールします。
DockerHubからCPUのみのDocker画像を引く:
docker pull lukalabs/cakechat:latest
docker run --name <YOUR_CONTAINER_NAME> -it lukalabs/cakechat:latest
GPUサポートにNVIDIA-Dockerをインストールします。
dockerhubからGPU対応のDocker画像を引く:
docker pull lukalabs/cakechat-gpu:latest
nvidia-docker run --name <YOUR_CONTAINER_NAME> -it cakechat-gpu:latest
それでおしまい!これで、モデルをトレーニングしてチャットできます。詳細については、以下の対応するセクションを参照してください。
Dockerに対処したくない場合は、すべての要件を手動でインストールできます。
pip install -r requirements.txt -r requirements-local.txt
NB:
システムパッケージをめちゃくちゃにするのを防ぐために、Virtualenv内に要件をインストールすることをお勧めします。
python tools/fetch.pyを実行して、事前に訓練されたモデルの重みをダウンロードできます。
事前に訓練されたモデルのパラメーションは次のとおりです。
このモデルは、約5,000万のダイアログ(11GBのテキストデータ)を備えた前処理されたTwitterコーパスで訓練されました。コーパスをきれいにするために、削除しました
私たちは感情分類器を使用して、次の5つの感情のいずれかに各発言にラベルを付けました: "neutral", "joy", "anger", "sadness", "fear" 、そしてトレーニング中にこれらのラベルを使用しました。たとえば、deepmojiツールなど、感情で独自のコーパスをマークアップするために。
残念ながら、Twitterのプライバシーポリシーにより、データセットの提供は許可されていません。利用可能なテキストの会話データセットでダイアログモデルをトレーニングできます。既存の会話データセットの素晴らしい概要は、https://breakend.github.io/dialogdatasets/にあります。
トレーニングデータは、ダイアログの発話のリストを表す有効なJSONオブジェクトであるTXTファイルである必要があります。必要なファイル構造を確認するには、ダミートレインデータセットを参照してください。トレーニング前に、このダミーコーパスをデータに置き換えてください。
2つのオプションがあります。
最初のアプローチは制限性が低いです。必要なトレーニングデータを使用して、モデルの構成パラメーションを設定できます。ただし、良いモデルの応答を得るのに十分な列車データ(少なくとも〜50MB)、1つ以上のGPU、および十分な忍耐(日)が必要であることに注意する必要があります。
2番目のアプローチは、事前に訓練されたモデルの構成パラメーションの選択によって制限されます。完全なリストについては、 cakechat/config.py参照してください。デフォルトのパラメーションがタスクに適している場合、微調整が適切なオプションでなければなりません。
python tools/fetch.pyを実行して、Amazon S3から事前に訓練されたモデルを取得します。
Training Text Corpusをdata/corpora_processed/train_processed_dialogs.txtに配置します。データセットが十分に大きいことを確認してください。そうしないと、モデルがデータに過剰に適合するリスクがあり、結果が悪くなります。
python tools/train.pyを実行します。
results/nn_models事前に訓練されたモデルの重みを探します。フルパスは、config paramsのセットから推測されます。-i引数を介してファイルへのパスを指定できます。たとえば、 python tools/train.py -i results/nn_models/my_saved_weights/model.current 。CUDA_VISIBLE_DEVICES=<GPU_ID>環境変数(<gpu_id> nvidia-smiコマンドの出力など)を設定することを忘れないでください。たとえば、 CUDA_VISIBLE_DEVICES=0 python tools/train.py 0番目のGPUでトレインプロセスを実行します。-sを使用して、トレーニングデータの最初のNサンプルのサブセットでモデルをトレーニングして、デバッグの前処理を高速化します。たとえば、 python tools/train.py -s 1000を実行して、最初の1000サンプルでトレーニングします。訓練されたモデルの重みはresults/nn_models/に保存されます。
Training Text Corpusをdata/corpora_processed/train_processed_dialogs.txtに配置します。
cakechat/config.pyでトレーニングパラメーターを設定します。詳細については、構成設定の説明を参照してください。
PYTHONHASHSEED=42 python tools/prepare_index_files.pyの実行を検討して、トレーニングコーパスのトークンと条件でインデックスファイルを構築します。必ずPYTHONHASHSEED Environment変数を設定してください。そうしないと、スクリプトの異なる起動に対して異なるインデックスファイルを取得できます。警告:このスクリプトは、元のTokensインデックスファイルdata/tokens_index/t_idx_processed_dialogs.jsonおよびdata/conditions_index/c_idx_processed_dialogs.jsonを上書きします。コーパスがモデルに理解してもらいたいすべての単語を含めるのに十分な大きさの場合にのみ、このスクリプトを実行する必要があります。それ以外の場合は、上記のように事前に訓練されたモデルを微調整することを検討してください。インデックスファイルを台無しにしてデフォルトのバージョンを取得したい場合は、コピーを削除して、 python tools/fetch.pyを実行します。
python tools/train_w2v.pyを実行して、トレーニングコーパスからW2V埋め込みを構築することを検討してください。警告:このスクリプトはdata/w2v_modelsに保存されている元のW2V重みを上書きします。コーパスがモデルに理解してもらいたいすべての単語を含めるのに十分な大きさの場合にのみ、このスクリプトを実行する必要があります。それ以外の場合は、上記のように事前に訓練されたモデルを微調整することを検討してください。 W2Vファイルを台無しにしてデフォルトバージョンを取得したい場合は、ファイルコピーを削除して、 python tools/fetch.pyを実行します。
python tools/train.pyを実行します。
CUDA_VISIBLE_DEVICES=<GPU_ID>環境変数(<gpu_id> nvidia-smiコマンドの出力など)を設定することを忘れないでください。たとえば、 CUDA_VISIBLE_DEVICES=0 python tools/train.py 0番目のGPUでトレインプロセスを実行します。-sを使用して、トレーニングデータの最初のNサンプルのサブセットでモデルをトレーニングして、デバッグの前処理を高速化します。たとえば、 python tools/train.py -s 1000を実行して、最初の1000サンプルでトレーニングします。 「開発モード」を有効にするようにIS_DEV=1を設定することもできます。モデルパラメーターの数の減少(隠された層寸法の減少、入力および出力サイズのトークンシーケンスなど)を使用して、冗長ロギングを実行します。 Dev Paramsの完全なリストについてはcakechat/config.pyの最終行を参照してください。
訓練されたモデルの重みはresults/nn_models/に保存されます。
GPU対応のDockerコンテナは、Horovodを使用して複数のGPUで分散列車をサポートします。
たとえば、 python tools/distributed_train.py -g 0 1を実行して、0および1 GPUでトレーニングを開始します。
トレーニング中に、次のデータセットが検証メトリックの計算に使用されます。
data/corpora_processed/val_processed_dialogs.txt (ダミーの例、データに置き換えます) - コンテキストに敏感なデータセットについてdata/quality/context_free_validation_set.txt - コンテキストフリー検証データセット用data/quality/context_free_questions.txt - ロギングとコンピューティングの応答を生成するために使用されます。data/quality/context_free_test_set.txt - トレーニングされたモデルのメトリック、例えばランキングメトリックの計算に使用されますメトリックはcakechat/results/tensorboardに保存され、Tensorboardを使用して視覚化できます。提供されたCPUまたはGPU対応のDocker画像からDockerコンテナを実行する場合、Tensorboardサーバーは自動的に起動し、 http://localhost:6006で提供する必要があります。ブラウザでこのリンクを開いて、トレーニンググラフを表示します。
要件を手動でインストールした場合は、Cakechatルートディレクトリから次のコマンドを実行して、最初にテンソルボードサーバーを開始します。
mkdir -p results/tensorboard && tensorboard --logdir=results/tensorboard 2>results/tensorboard/err.log &
その後、 http://localhost:6006に進みます。
次のツールを実行して、テストデータでトレーニングされたモデルを評価できます(ダミーの例、データに置き換えます):
tools/quality/ranking_quality.py - ダイアログモデルのランキングメトリックを計算しますtools/quality/prediction_distinctness.py - ダイアログモデルの個別のメトリックを計算しますtools/quality/condition_quality.py - 条件値に従ってデータのさまざまなサブセットでメトリックを計算しますtools/generate_predictions.py - モデルを評価します。指定されたダイアログコンテキストのセットでダイアログモデルの予測を生成し、メトリックを計算します。 「*-reranking」予測モードを使用する場合は、 data/nn_modelsディレクトリにリバースモデルが必要であることに注意してくださいtools/generate_predictions_for_condition.py - 特定の条件値の予測を生成します指定された入力メッセージを使用してHTTP-Requestsを処理するサーバーを実行し、モデルから応答メッセージを返します。
python bin/cakechat_server.py
特定のGPUでサーバーを実行するにはCUDA_VISIBLE_DEVICES=<GPU_ID>環境変数を指定します。
事前に訓練されたモデルを使用する場合は、サーバーを開始する前に、 python tools/fetch.pyを実行することを忘れないでください。
すべてが正常に機能することを確認するには、次の会話でモデルをテストします
- こんにちは、エディ、どうしたの?
- そうではありません、あなたはどうですか?
- 元気です、ありがとう。明日映画に行きますか?
コマンドを実行することで:
python tools/test_api.py -f 127.0.0.1 -p 8080
-c "Hi, Eddie, what's up?"
-c "Not much, what about you?"
-c "Fine, thanks. Are you going to the movies tomorrow?"
たとえば、意味のある答えを得る必要があります。
{'response': "Of course!"}
JSONパラメーターは次のとおりです。
| パラメーター | タイプ | 説明 |
|---|---|---|
| コンテクスト | 文字列のリスト | 対話履歴からの以前のメッセージのリスト(最大3が使用されています) |
| 感情 | 文字列、列挙の1つ | {'neutral'、 'Anger'、 'Joy'、 'fear'、 '悲しみ'の1つ。応答を条件付ける感情。オプションのPARAMは、指定されていない場合、「ニュートラル」が使用されます |
POST /cakechat_api/v1/actions/get_response
data: {
'context': ['Hello', 'Hi!', 'How are you?'],
'emotion': 'joy'
}
200 OK
{
'response': 'I'm fine!'
}
Gunicornを使用して、モデルのAPIを生産スケールで提供することをお勧めします。
インストールGunicorn: pip install gunicorn
入力メッセージを使用してHTTP-Queriesを処理するサーバーを実行し、モデルの応答メッセージを返します。
cd bin && gunicorn cakechat_server:app -w 1 -b 127.0.0.1:8080 --timeout 2000
Cakechatモデルを電報ボットとして実行できます。
python tools/telegram_bot.py --token <YOUR_BOT_TOKEN>して、Telegramでチャットします。 cakechat/dialog_model/ - 計算グラフ、トレーニング手順、その他のモデルユーティリティが含まれていますcakechat/dialog_model/inference/ - 応答生成のためのアルゴリズムcakechat/dialog_model/quality/ - メトリックの計算とロギングのコードcakechat/utils/ - テキスト処理のためのユーティリティ、W2Vトレーニングなど。cakechat/api/ - HTTPサーバーを実行する機能:API構成、エラー処理tools/ - モデルのトレーニング、テスト、評価のためのスクリプトbin/cakechat_server.py - 指定されたダイアログコンテキストと感情を与えられたモデルの応答メッセージを返すHTTP-Serverを実行します。詳細については、実行セクションを参照してください。tools/train.py - データのモデルをトレーニングします。 --reverseオプションを使用して、より正確な予測のために「*-RERANKING」応答生成アルゴリズムで使用されるリバースモデルをトレーニングできます。tools/prepare_index_files.py - 最も一般的に使用されるトークンと条件のインデックスを準備します。モデルを独自のデータでゼロからトレーニングする前に、このスクリプトを使用してください。tools/quality/ranking_quality.py - ダイアログモデルのランキングメトリックを計算します。tools/quality/prediction_distinctness.py - ダイアログモデルの個別のメトリックを計算します。tools/quality/condition_quality.py - 条件値に応じて、データの異なるサブセットでメトリックを計算します。tools/generate_predictions.py - モデルを評価します。指定されたダイアログコンテキストのセットでダイアログモデルの予測を生成し、メトリックを計算します。 「*-reranking」予測モードを使用する場合は、 results/nn_modelsディレクトリにリバースモデルが必要であることに注意してください。tools/generate_predictions_for_condition.py - 特定の条件値の予測を生成します。tools/test_api.py - 実行中のHTTP-Serverにリクエストを送信するためのコードの例。tools/fetch.py - それに関連付けられている事前に訓練されたモデルとインデックスファイルをダウンロードします。tools/telegram_bot.py - 訓練されたモデルの上にTelegramボットを実行します。ネットワークアーキテクチャ、トレーニング、予測、ロギングの手順のすべての構成パラメーターは、 cakechat/config.pyで定義されています。 HTTPサーバーで使用されるいくつかの推論パラメーターはcakechat/api/config.pyで定義されています。
ネットワークアーキテクチャとサイズ
HIDDEN_LAYER_DIMENSION再発層の非表示ユニットの数を定義する主なパラメーターです。WORD_EMBEDDING_DIMENSIONとCONDITION_EMBEDDING_DIMENSION各トークン/条件がマッピングされる非表示ユニットの数を定義します。tokens_indexディレクトリの辞書のトークンの数で定義されます。デコードアルゴリズム:
PREDICTION_MODE_FOR_TESTS 、モデルの応答の生成方法を定義します。オプションは次のとおりです。DEFAULT_TEMPERATUREパラメーターを調整することにより、温度値を制御できます。SAMPLES_NUM_FOR_RERANKINGとMMI_REVERSE_MODEL_SCORE_WEIGHTパラメーターを選択して、このモードをチューニングできます。応答生成プロセスに影響する他のパラメーターがあることに注意してください。 REPETITION_PENALIZE_COEFFICIENT 、 NON_PENALIZABLE_TOKENS 、 MAX_PREDICTIONS_LENGTHを参照してください。
データセットエントリ内で追加の条件ラベルを提供することにより、次のモデルを構築できます。
これらの余分な条件を利用するには、モデルのトレーニングセクションを参照してください。トレーニングの「条件」フィールドを次のいずれかのいずれかに設定するだけです。ペルソナID 、感情、またはトピックラベル、インデックスファイルを更新してトレーニングを開始します。
Cakechatは、Replikaチームによって開発および維持されています。
ニコラス・イヴァノフ、マイケル・カルマン、ニキータ・スメタニン、アルテム・ロディチェフ、デニス・フェデレンコ。
Oleg Akbarov、Alexander Kuznetsov、Vladimir Chernosvitovによるデモ。
ここでは、すべての問題と機能リクエストをここで追跡できます。GitHubの問題。
©2019 Luka、Inc。Apacheライセンスに基づいてライセンスされたバージョン2.0。詳細については、ライセンスファイルを参照してください。