現在のリポジトリには、ブログ投稿に付随するコードが含まれています。転移学習を使用して最先端の会話型 AI を構築する方法。
このコードは、OpenAI GPT および GPT-2 Transformer 言語モデルからの転送学習を活用したダイアログ エージェントのトレーニングに使用できる、トレーニングおよびテスト スクリプトを備えたクリーンでコメントされたコード ベースです。
このコードベースは、自動メトリクスに関する最先端の NeurIPS 2018 ダイアログ コンペティション ConvAI2 への HuggingFace の参加結果を再現するために使用できます。 3,000 行を超える競争コードが、分散および FP16 オプションを備えた約 250 行のトレーニング コードに抽出されて、現在のリポジトリが形成されました。
このモデルは、8 V100 クラウド インスタンス (現在のコストは約 25 ドル) で約 1 時間でトレーニングでき、事前トレーニングされたモデルも利用できます。
トレーニングおよび推論スクリプトをインストールして使用するには、リポジトリを複製し、要件をインストールしてください。
git clone https://github.com/huggingface/transfer-learning-conv-ai
cd transfer-learning-conv-ai
pip install -r requirements.txt
python -m spacy download en
Docker を使用してインストールするには、自己完結型イメージをビルドしてください。
docker build -t convai .
注: Docker セットアップがコンテナーの構築に十分なメモリを割り当てていることを確認してください。デフォルトの 1.75GB でビルドすると、Pytorch ホイールが大きいため失敗します。
画像を入力できます
ip-192-168-22-157:transfer-learning-conv-ai loretoparisi$ docker run --rm -it convai bash
root@91e241bb823e:/ # ls
Dockerfile README.md boot dev home lib media models proc root sbin sys train.py utils.py
LICENCE bin convai_evaluation.py etc interact.py lib64 mnt opt requirements.txt run srv tmp usr var
その後、事前トレーニングされたモデルでinteract.py
スクリプトを実行できます。
python3 interact.py --model models/
ここでは、事前トレーニングされ微調整されたモデルを S3 で利用できるようにしています。このモデルをダウンロードして使用する最も簡単な方法は、 interact.py
スクリプトを実行してモデルと対話することです。引数を指定しないと、このスクリプトはモデルを自動的にダウンロードしてキャッシュします。
トレーニング スクリプトは、シングル GPU またはマルチ GPU 設定で使用できます。
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
トレーニング スクリプトは、トレーニングを調整するためにいくつかの引数を受け取ります。
口論 | タイプ | デフォルト値 | 説明 |
---|---|---|---|
データセットのパス | str | "" | データセットのパスまたは URL。空の場合は S3 からダウンロードします。 |
データセットキャッシュ | str | './dataset_cache.bin' | データセット キャッシュのパスまたは URL |
モデル | str | "openai-gpt" | モデルのパス、URL、または短縮名 |
候補数 | int | 2 | 研修受講希望者数 |
max_history | int | 2 | 履歴に保存する以前の交換の数 |
train_batch_size | int | 4 | トレーニングのバッチサイズ |
valid_batch_size | int | 4 | 検証用のバッチサイズ |
gradient_accumulation_steps | int | 8 | 複数のステップで勾配を蓄積する |
lr | float | 6.25e-5 | 学習率 |
lm_coef | float | 1.0 | LM損失係数 |
mc_coef | float | 1.0 | 多肢選択損失係数 |
最大ノルム | float | 1.0 | クリッピング勾配ノルム |
n_epochs | int | 3 | トレーニング エポックの数 |
性格順列 | int | 1 | 人格文の順列の数 |
デバイス | str | "cuda" if torch.cuda.is_available() else "cpu" | デバイス (cuda または cpu) |
FP16 | str | "" | fp16 トレーニングの場合は O0、O1、O2、または O3 に設定します (apex ドキュメントを参照) |
ローカルランク | int | -1 | 分散トレーニングのローカル ランク (-1: 分散されていない) |
8 つの V100 GPU を備えたサーバーで結果を再現する方法は次のとおりです (ノード数とバッチ サイズを構成に合わせて調整します)。
python -m torch.distributed.launch --nproc_per_node=8 ./train.py --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=2 --n_epochs=1 --num_candidates=4 --personality_permutations=2 --train_batch_size=2 --valid_batch_size=2
このモデルは、convai2 評価スクリプト (以下を参照) を使用すると、Hits@1 が 79、パープレキシティが 20.5、F1 が 16.5 になるはずです。
これらの数値は、ConvAI2 コンペティションで得られた数値よりわずかに低くなります。同じ結果を得るために調整できることは次のとおりです。
トレーニング スクリプトは、すべての実験とチェックポイントを、リポジトリ ベース フォルダーの./runs
フォルダー内の実験のタイムスタンプで名前が付けられたサブフォルダーに保存します。
その後、このフォルダーを指定するだけで、対話型スクリプトを使用してモデルを操作できます。
インタラクティブ スクリプトを実行するコマンド ラインの例を次に示します。
python ./interact.py --model_checkpoint ./data/Apr17_13-31-38_thunder/ # run the interactive script with a training checkpoint
python ./interact.py # run the interactive script with the finetuned model on our S3
微調整されたモデルでは、FINAL Hits@1: 0.715 が得られます。
インタラクティブ スクリプトは、デコード アルゴリズムを微調整するためにいくつかの引数を受け入れます。
口論 | タイプ | デフォルト値 | 説明 |
---|---|---|---|
データセットのパス | str | "" | データセットのパスまたは URL。空の場合は S3 からダウンロードします。 |
データセットキャッシュ | str | './dataset_cache.bin' | データセット キャッシュのパスまたは URL |
モデル | str | "openai-gpt" | モデルのパス、URL、または短縮名 |
max_history | int | 2 | 履歴に保存する以前の発言の数 |
デバイス | str | cuda if torch.cuda.is_available() else cpu | デバイス (cuda または cpu) |
no_sample | アクションstore_true | サンプリングの代わりに貪欲なデコードを使用するように設定します | |
最大長 | int | 20 | 出力発話の最大長 |
min_length | int | 1 | 出力発話の最小長 |
シード | int | 42 | シード |
温度 | int | 0.7 | ソフトマックス温度のサンプリング |
トップ_k | int | 0 | サンプリング前に上位 k 個のトークンをフィルタリングします ( <=0 : フィルタリングなし) |
トップ_p | float | 0.9 | サンプリング前の核フィルタリング (top-p) ( <=0.0 : フィルタリングなし) |
ConvAI2 チャレンジの評価スクリプトを実行するには、まず次のようにParlAI
リポジトリのベース フォルダーにインストールする必要があります。
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
その後、 ParlAI
ベース フォルダーから評価スクリプトを実行できます。
cd ParlAI
python ../convai_evaluation.py --eval_type hits@1 # to download and evaluate our fine-tuned model on hits@1 metric
python ../convai_evaluation.py --eval_type hits@1 --model_checkpoint ./data/Apr17_13-31-38_thunder/ # to evaluate a training checkpoint on hits@1 metric
評価スクリプトは、評価メトリクスを選択し、デコード アルゴリズムを調整するためにいくつかの引数を受け取ります。
口論 | タイプ | デフォルト値 | 説明 |
---|---|---|---|
eval_type | str | "hits@1" | ConvAI2 検証データセットのhits@1 、 ppl 、またはf1 メトリクスでモデルを評価します。 |
モデル | str | "openai-gpt" | モデルのパス、URL、または短縮名 |
max_history | int | 2 | 履歴に保存する以前の発言の数 |
デバイス | str | cuda if torch.cuda.is_available() else cpu | デバイス (cuda または cpu) |
no_sample | アクションstore_true | サンプリングの代わりに貪欲なデコードを使用するように設定します | |
最大長 | int | 20 | 出力発話の最大長 |
min_length | int | 1 | 出力発話の最小長 |
シード | int | 42 | シード |
温度 | int | 0.7 | ソフトマックス温度のサンプリング |
トップ_k | int | 0 | サンプリング前に上位 k 個のトークンをフィルタリングします ( <=0 : フィルタリングなし) |
トップ_p | float | 0.9 | サンプリング前の核フィルタリング (top-p) ( <=0.0 : フィルタリングなし) |
example_entry.py
と上部のコメントを参照してください。
研究でこのコードを使用する場合は、NeurIPS CAI ワークショップの論文を引用できます。
@article{DBLP:journals/corr/abs-1901-08149,
author = {Thomas Wolf and
Victor Sanh and
Julien Chaumond and
Clement Delangue},
title = {TransferTransfo: {A} Transfer Learning Approach for Neural Network
Based Conversational Agents},
journal = {CoRR},
volume = {abs/1901.08149},
year = {2019},
url = {http://arxiv.org/abs/1901.08149},
archivePrefix = {arXiv},
eprint = {1901.08149},
timestamp = {Sat, 02 Feb 2019 16:56:00 +0100},
biburl = {https://dblp.org/rec/bib/journals/corr/abs-1901-08149},
bibsource = {dblp computer science bibliography, https://dblp.org}
}