このリポジトリには、大規模な事前に定められたダイアログ応答生成モデルのソースコードとトレーニングモデルが含まれています。人間の評価の結果は、ダイアログプから生成された応答が、単一ターン会話のチューリングテストの下での人間の応答の質に匹敵することを示しています。
リポジトリは、データ抽出スクリプト、モデルトレーニングコード、および前提条件の小(117m)培地(345m)および大規模(762m)モデルチェックポイントを含むハグFace Pytorch-TransformerとOpenai GPT-2に基づいています。
このモデルは、Redditディスカッションスレッドからの147mのマルチターンダイアログでトレーニングされています。最大のモデルは、分散トレーニングとFP16オプションを使用して、8つのV100マシンで数時間でトレーニングできます(ただし、これは必須ではありません)。
インクルードスクリプトを使用して、DSTC-7の根拠のあるダイアログ生成チャレンジの結果と、Redditデータから作成された6Kマルチリファレンスデータセットを再現できます。
プロジェクトWebページ:https://www.microsoft.com/en-us/research/project/large-scale-pretaning-for-response-generation/
Arxiv Paper:https://arxiv.org/abs/1911.00536
(更新07/09/2022)files.pushshift.io/redditサーバーの変更により、データ生成パイプラインが壊れました。これらの問題は現在修正されており、以下のデータ準備サブセクションで説明されている手順は再度機能するはずです。データは8つのプロセス( -j 8 )で約10時間で生成され、800GBの一時ディスクスペースが必要です。
(更新06/23/2021)Dialogpt(RetGen)の検索/接地バージョンをリリースしました。RetGenRepoとRetgen Paperをチェックしてください
(更新05/20/2021)Prakhar MishraによるDialogptのYouTubeでの素晴らしいビデオウォークスルー
(更新03/31/2021)Gradio Webデモを使用したAK391によるサードパーティのデモを試してみてください
(更新09/15/2020)大規模なダイアログランキングモデルのセットがリリースされました!
Dialogptの生成は、最新のダイアログランキングモデルと統合することにより改善されます。
(更新07/08/2020)6KマルチREFテストセットがリリースされました!
データを生成するには、 demo.pyを実行し、データオプションを「フル」に設定するために、生成された6KマルチREFテストセットはに配置されます
./data/test.refs.txt
(更新03/10/2020)モデルカードは、ハギングフェイストランスで利用可能です!
Huggingface Transformersリポジトリのモデルカードをご覧ください。いくつかのコードを使用すると、Dialogptをインタラクティブに再生するためにかなりシュートフォワードする必要があります。
小さなモデル:https://huggingface.co/microsoft/dialogpt-small
中モデル:https://huggingface.co/microsoft/dialogpt-medium
大規模モデル:https://huggingface.co/microsoft/dialogpt-large
(新しい)ランキングモデル:https://huggingface.co/microsoft/dialogrpt-updown
(更新01/06/2020)いくつかのサードパーティのデコードスクリプトの実装:
DialOgptはUbuntu 16.04で完全に開発されました。そして、利用可能性に応じて、同じ構成でコードを実行するのが困難な場合にサポートを提供しようとします。ただし、他のディストリビューションやオペレーティングシステムをサポートすることはできません。コードの一部は、他のUNIXフレーバー(MACO、LinuxのWindowsサブシステム、Cygwinなど)で実行される場合がありますが、メイントレーニングコードにUbuntuを使用することをお勧めします。
トレーニングコードはCPUで実行できますが、遅くなる可能性があります。 GPUを使用して、すべてのモデルを訓練および微調整することをお勧めします。 GPUの数に最小限の制限はありません。ただし、複数のGPU構成に分散列車を使用する場合、速度アップ対GPUの数はほぼ線形です。 GPUを少なく使用するときに同じバッチサイズをシミュレートするには、モデルトレーニングでより大きなgradient_accumulation_stepsを使用してください。
117mおよび345mモデルは、12gメモリを備えた単一のGPUにロードできます。 762Mモデルには、効率的なトレーニングのために16Gを超えるメモリを持つ単一のGPUが必要です。 50mのトレーニングインスタンスとV100 GPUを備えたベンチマークデータのトレーニング速度:
| N_GPU | エポック時間(h) | トークン/秒 |
|---|---|---|
| 1 | 118 | 10847 |
| 2 | 62 | 20645 |
| 4 | 34 | 37647 |
| 8 | 18 | 71356 |
新しいデータセット上の事前に保護されたモデルから微調整するには、通常、1-2エポックが必要です。
このシステムの展開の難しさを容易にするために、デモスクリプトdemo.pyを作成しました。 demo.pyは、1つのコマンドライン内のダミーデータセット上のモデルダウンロード、データ抽出、データの前処理、モデルトレーニングのパイプラインが含まれています。
以下のコマンドラインを使用してクローンを作成し、要件をインストールし、コンドラ環境をロードしてください(NVIDIA CUDA 10.0開発者ツールキットが必要であることに注意してください):
sudo apt-get install -y make wget gzip bzip2 xz-utils zstd sedgit clone https://github.com/microsoft/DialoGPT.git
cd DialoGPT
conda env create -f LSP-linux.yml -n LSP
conda activate LSP Linux以外のアーキテクチャでこれを実行している場合は、LSP- LSP-linux.yml LSP-generic.ymlを使用してください。ただし、一般的なものはすべてのプラットフォームでテストされていないため、安定性をGauranteedできないことに注意してください。 FP16トレーニングを使用するには、以下のコマンドを使用してApexをインストールしてください
conda activate LSP
git clone https://github.com/NVIDIA/apex
cd apex
git reset --hard 3d01e4a0a188cc8df54bc6e44cf5eb40ff6b4cc5
pip install -v --no-cache-dir --global-option= " --cpp_ext " --global-option= " --cuda_ext " .
python3.6 demo.py開始するには、最初に公式のレポスからDockerとNvidia-Dockerをインストールします。コードを実行するための画像環境は、以下のようにロードできます。
nvidia-docker v2。 *
$ docker run --gpus all --ipc=host --rm -it -v $PWD :/workspace --network=host icaruszyz/large-scale-training:dialogpt bashnvidia-docker v1。 *
$ nvidia-docker --rm -it -v $PWD :/workspace --network=host icaruszyz/large-scale-training:dialogpt bashDockerコンテナ内で、実行します
python demo.pyこのセクションでは、 demo.pyのすべてのコンポーネントについて説明します。
demo.pyを実行する前に、すべてのデータをダウンロードしたい場所としてdemo.pyでdata_folder (default value ./models )を設定できます。次に、単に実行します
python demo.pyに
デフォルトでは、 demo.pyがダミーデータを使用することに注意してください。オプション--dataを使用して、redditトレーニングデータを指定してください。 dummy 、 small 、 full 3つのオプションが利用可能です。
python demo.py --data small
python demo.py --data full小さなRedditデータは約140MBで、完全なRedditデータは27GBを超えています。長い時間がかかるので、完全なRedditデータで処理するときにコーヒーを準備することができます!
6KマルチREFテストセットデータを生成するには、 demo.pyを操作し、データオプションを「フル」に設定するために、世代はにあります
./data/test.refs.txt
前処理された微調整されたモデルは、Azure Blobstorageで利用できます。これらのモデルをダウンロード/使用する方法の詳細については、 demo.pyを実行/参照してください。または、 demo_utils.pyのリンクを使用して直接ダウンロードすることもできます。
まず、 prepare4db.shを使用して、TSVデータファイルを次のスクリプトで認識できる正しい形式に変換します。 TRAINIGデータは、コマンドラインの以下を備えたデータベースファイルに処理する必要があります。
python prepro.py --corpus $DATA_PATH トレーニングスクリプトは、単一のGPUまたは複数のGPU設定(単一ノード内の複数のGPUにわたって分散トレーニング)で使用できます。
python ./LSP_train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./LSP_train.py # Training on 8 GPUsトレーニングスクリプトは、トレーニングを調整するためにいくつかの議論を受け入れます。
| 口論 | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
| max_seq_length | int | 128 | 各トレーニングインスタンスのトークンの最大数。 |
| train_input_file | str | "" | .db形式のトレーニングデータセットのパス |
| eval_input_file | str | "" | TSV形式で設定された検証のパス |
| contion_from | int | 0 | 指定された数のステップの後にトレーニングを再開します |
| FP16 | boolean | True | モデルトレーニングに16ビットのフローティングポイントを使用するかどうか。 |
| train_batch_size | int | 4 | トレーニング用のバッチサイズ |
| valid_batch_size | int | 4 | 検証用のバッチサイズ |
| gradient_accumulation_steps | int | 2 | いくつかのステップに勾配を蓄積します |
| Learning_rate | float | 1e-5 | 学習率 |
| lr_schedule | str | noam | 学習率のスケジュールは、[ noam 、 noamwd 、 BERT 、 None ]から選択できます。 |
| num_optim_steps | int | 1000000 | トレーニングの最適化ステップの数 |
| NO_TOKEN_ID | boolean | True | Trueを設定する場合は、All-Zerosトークンタイプの埋め込みを使用してください。 |
トレーニング中に、2つのログファイルが更新されます。 train_log.txtおよびeval_log.txtには、トレーニングおよび開発セットのモデル損失、困惑、トレーニング速度(トークン/秒)統計が含まれています。
ログファイルと保存されたモデルチェックポイントは./models/output_model models/output_modelにあります
適切にフィルタリングされたRedditデータセットを使用しても、モデルが中程度に有毒/不適切な応答を生成する場合があることに注意してください。このため、現時点ではデコードスクリプトを提供することはできません(ライブデモとデコードスクリプトアクセスは、現在の招待状にあります)。現在、このシステムが有毒生成を防ぐために、制御されたデコード方法に取り組んでいます。お楽しみに。
サードパーティのデコード方法に関するいくつかの議論については、問題#3およびRedditディスカッションを参照してください。
サードパーティのデコード方法については、以下を参照してください。
低リソースのユーザー顧客データセットでさらに微調整できる6つの微調整モデルをリリースします。これらのモデルの合計パラメーターは、OpenAI GPT-2モデルサイズと一致して、117mから762mの範囲です。
| モデル | GPT-2から微調整 | ゼロから訓練されています |
|---|---|---|
| Dialogpt 762Mモデル | [リンク] [ハグイングフェイスモデルカード] | [リンク] |
| Dialogpt 345mモデル | [リンク] [ハグイングフェイスモデルカード] | [リンク] |
| Dialogpt 117Mモデル | [リンク] [ハグイングフェイスモデルカード] | [リンク] |
| Dialogpt 345mモデル(逆、MMIの場合) | リンク | - |
| dialogrpt(新しいランキングモデル) | リンク | - |
モデルファイルは、Huggingfaceの変圧器からのGPT-2モデルチェックポイントとまったく同じロードできます。対応する構成ファイル( merges.txt 、 config.json 、 vocab.json )をDialogptのRepo ./configs/*で見つけることができます。
逆モデルは、ターゲットからソースを予測しています。このモデルは、MMIの再ランキングに使用されます。
DialOGRPTモデルは、応答の人間のフィードバック(UPVOTES、REPRIES)を予測するために使用された最近提案されたランキングモデルです。これらのモデルを使用して、Dialogptの生成品質を向上させることができます(詳細については、EMNLPペーパーを参照してください)。
完全なモデルを再訓練する最初のステップは、前述の27GB Redditデータセットを生成することです。これには、https://files.pushshift.io/redditから完全なRedditの提出とコメントのダンプをダウンロードし、全体として700GBのローカルディスクスペースが必要です。完全なデータをダウンロードして処理するには、(CPU)コンピューティングカパビルティに応じて約1〜2日必要です(たとえば、最近のコンピューターで8コアで約24時間)。上記のセットアップとインストールの手順を実行したと仮定すると、次のいずれかを実行して、完全なデータセットを作成できます。
python demo.py --data full
または
cd reddit_extractor; SIZE=full make -j 8; cd ..
前者のコマンドは後者を呼び出すため、2つの方法は同等です。前者は、問題が発生したり、引数をカスタマイズしたりする場合にほとんど役立つため、前者をお勧めします(たとえば、データのサブセットのみを構築できるようにするmakeを使用できます)。たとえば、ジオロケーション(ファイアウォールなど)に基づいて、ダウンロードフェーズはエラーが発生しやすいことに注意してください。上記のコマンドがdata/train.tsv生成に失敗した場合、またはそのファイルが27GBに近い場所にない場合、それは何かがうまくいかなかったことを意味します。その場合、 reddit_extractor/wget-logおよびreddit_extractor/logs/*.logエラーメッセージが意味がない場合は、お気軽にお問い合わせください。その場合は、これらのログファイルから収集されたエラーメッセージを必ず含めてください。
トレーニングデータ統計:生成されたトレーニングTSVファイルは、約26.8 GBの非圧縮で、146.8mのトレーニングインスタンス、3.87Bソーストークン、2.14Bのターゲットトークン(発話レベルの0/1ウェイトを含む)が必要です。結果のtrain.tsvファイルには、146,846,215行を含める必要があります。
(1)データを生成し、(2)DB形式に変換し、(3) python LSP_train.pyを使用してモデルをトレーニングするため、 demo.py --data fullを使用して上記のデータを生成することを推奨します。 HyperParametersのいずれかをカスタマイズする場合は、 demo.pyを直接編集してください。
私たちのモデルは、DSTC-7チャレンジ応答生成タスクで最先端の結果を達成しました。
| 実験 | nist2 | nist4 | bleu2 | BLEU4 | 流星 | ENT-4 | DIST-1 | DIST-2 | 平均。レン |
|---|---|---|---|---|---|---|---|---|---|
| 人間の反応 | 2.62 | 2.65 | 12.35% | 3.13% | 8.31% | 10.45 | 16.66% | 67.01% | 18.8 |
| DSTC-7勝者 | 2.51 | 2.52 | 14.35% | 1.83% | 8.07% | 9.03 | 10.89% | 32.49% | 15.1 |
| ダイアログプ345m | 2.80 | 2.82 | 14.16% | 2.31% | 8.51% | 10.08 | 9.13% | 39.73% | 16.9 |
| Dialogpt 345m(BS) | 2.92 | 2.97 | 19.18% | 6.05% | 9.29% | 9.57 | 15.73% | 51.03% | 14.2 |
ここで、ENTはエントロピースコアを表し、DISTは個別のスコアを表します。平均長を除くすべてのメトリックについて、大きい方が優れています。
人間の反応と比較した優れた自動評価は、私たちのモデルが人間の平等を達成することを意味しないことに注意してください。より詳細な分析については、私たちの論文をチェックしてください。
8 V100 GPUを備えたサーバー上のDSTC-7チャレンジデータの345M Dialogptモデルを微調整するには、次のコマンドラインを実行してください(DSTCデータはDSTC-7リポジトリで見つけることができます):
python3 -m torch.distributed.launch --nproc_per_node=8 train_LSP.py --init_checkpoint ./models/medium/medium_ft.pkl --train_input_file ./data/DSTC_train.db --eval_input_file ./data/DSTC_valid.tsv --model_name_or_path ./model/medium/ --learning_rate 1e-4 --train_batch_size 64 --eval_batch_size 64 --no_token_id訓練されたモデルはDSTCメディアモデルで見つけることができます
次のサードパーティパッケージをダウンロードして、空のフォルダー3rdpartyに保存してください。
cpan installなど):XML:Twig、Sort:Naturally and String:Util。 DSTC-7公式リポジトリをフォローしてデータを抽出し、 data-official-test/test.refs.txtを./dstc/data/フォルダーに入れてください。
以下の抽出スクリプトを実行して、ヒューマン応答仮説ファイルhuman.resp.txtを作成します:
python extract_human.py最後に、DSTCデータセットでヒト仮説の結果を再現するには、レポフォルダーの下で次のコマンドを実行してください。
python batch_eval.py評価の結果は、フォルダー./dstc/eval/で生成されます。
Redditの6KマルチREFデータセットでテストします。結果は以下に要約されています
| 実験 | nist2 | nist4 | bleu2 | BLEU4 | 流星 | ENT-4 | DIST-1 | DIST-2 | 平均。レン |
|---|---|---|---|---|---|---|---|---|---|
| 人間の反応 | 3.41 | 4.25 | 17.90% | 7.48% | 10.64% | 11 | 14.50% | 63.00% | 13.1 |
| Dialogpt 117m | 2.39 | 2.41 | 10.54% | 1.55% | 7.53% | 10.78 | 8.60% | 39.90% | 12.8 |
| ダイアログプ345m | 3 | 3.06 | 16.96% | 4.56% | 9.81% | 9.13 | 6.80% | 26.30% | 12.2 |
| Dialogpt 762M | 2.84 | 2.9 | 18.66% | 5.25% | 9.66% | 9.72 | 7.76% | 29.93% | 11.2 |
| Dialogpt 345m(BS) | 3.4 | 3.5 | 21.76% | 7.92% | 10.74% | 10.48 | 12.38% | 48.74% | 11.3 |
| Dialogpt 345m(w/mmi) | 3.28 | 3.33 | 15.68% | 3.94% | 11.23% | 11.25 | 9.39% | 45.55% | 17.2 |
さらに、人間の評価を実施します(各方法について6kの例、各例は3人の人間の裁判官によって評価されます)。結果は、この非操作性チューリングテストの下で、私たちの世代の質が実際の人間の反応の質に近づくことに向けているという強力な証拠を示しています。
関連性:AとB、ソースプロンプトにより関連するものがあります。
| システムa | 勝利(%) | ネクタイ(%) | b勝利(%) | システムb |
|---|---|---|---|---|
| ダイアログプ345m | 2671(45%) | 513(9%) | 2816(47%) | 人間の反応 |
| ダイアログプ345m | 3281(72%) | 394(9%) | 882(19%) | パーソナリティチャット |
| ダイアログプ345m w/ mmi | 2871 (48%) | 522(9%) | 2607(43%) | 人間の反応 |
情報性:AとB、より満足しており、有益なものです。
| システムa | 勝利(%) | ネクタイ(%) | b勝利(%) | システムb |
|---|---|---|---|---|
| ダイアログプ345m | 2722(45%) | 234(4%) | 3044(51%) | 人間の反応 |
| ダイアログプ345m | 3490(77%) | 206(5%) | 861(19%) | パーソナリティチャット |
| ダイアログプ345m w/ mmi | 3011 (50%) | 234(4%) | 2755(46%) | 人間の反応 |
人間のような:aとb、それは人間によって生成される可能性が高いと思いますか。
| システムa | 勝利(%) | ネクタイ(%) | b勝利(%) | システムb |
|---|---|---|---|---|
| ダイアログプ345m | 2716(45%) | 263(4%) | 3021(50%) | 人間の反応 |
| ダイアログプ345m | 3462(76%) | 196(4%) | 899(20%) | パーソナリティチャット |
| ダイアログプ345m w/ mmi | 2978 (50%) | 241(4%) | 2781(46%) | 人間の反応 |
ARXIVペーパーの詳細については、詳細をご覧ください。
| 役割 | 応答 |
|---|---|
| ユーザー | お金は幸せを買いますか? |
| ボット | あなたがそれにどれだけのお金を使うかによります。 |
| ユーザー | 幸福を買うための最良の方法は何ですか? |
| ボット | あなたは20代前半までに億万長者にならなければなりません、そしてあなたは幸せになることができます。 |
| ユーザー | これはとても難しいです! |
| ボット | 億万長者で幸せになるのがどれほど難しいかはわかりません。金持ちがたくさんのお金を持っている理由があります |
| 役割 | 応答 |
|---|---|
| ユーザー | 人生の意味は何ですか? |
| ボット | 意味はあなたの家族や友人と一緒にいることです。 |
| ボット | 私は推測するつもりです:それはあなたの両親や友人があなたを愛していることを意味します。それが意味だと思います。 |
| ボット | 意味は、あなたが死んだときにあなたが生きていることを確認することだと思います。あなたはあなたの家族、友人、そしてあなた自身と一緒にいます。 |
| ボット | そうではありませんが、助けてくれてありがとう。 |
| ユーザー | ボット |
|---|---|
| 米国の初代大統領は誰ですか | ジョージ・ワシントン |
| 水の沸点は何ですか? | 約212 Fだと思います。 |
| 太陽と月のどちらが大きいですか? | 太陽。 |
| どの動物が黒と白の縞模様を持っていますか? | 白黒の縞模様の猫。 |
| ユーザー | ボット |
|---|---|
| 中国と米国の間の貿易戦争はまだ起こっています。 | 中国政府とuが確信しています。 s。彼らがテーブルの上に腕を保ち、お金が流れる限り、それで大丈夫でしょう。 |
| 2018年にワールドカップで優勝したのは誰ですか? | ドイツ、私は信じています。 |
| NvidiaのTitan RTXは本当に良いです。 | 私はこのカードを持っています、そして私はそれが大好きです。苦情はありません。 |
| ポルシェは新しいTaycan EVでテスラを破ることができますか? | 私はそうは思わない 。テスラはポルシェよりも強力です。 |
| ユーザー | ボット |
|---|---|
| 良い生活の意味は何ですか? | 私たちは皆、過去の人生につながっており、人生の意味はあなたが望むように生きることだと思います。 |
| どちらがより重要ですか?成功しているのですか、それとも幸せであることは? | 成功することは無限です。重要なのは幸せであることだけです。 |
| 平和は戦争を止める唯一の方法ですか? | 世界があなたと一緒に働くことをいとわない場合ではありません。平和は究極の目標ですが、平和にはそれ以上のものが必要です。 |
| 人々はどのくらいの自由を持っているべきですか? | 適切な量の自由は、あなたが人々や財産を傷つけない限り、あなたが好きなように行う自由です。 |
| ユーザー | ボット |
|---|---|
| Dialogpt Repoについてどう思いますか? | かなり良いですが、バグを見つけるのはとても簡単です。 |
あなたが見つけたら問題を始めてください:)
ライブデモとデコードスクリプトアクセスは、現在招待されています。完全なリリースにご期待ください。
Retgen:https://github.com/dreasysnail/retgen。検索された整理/接地されたダイアログプト以降。 Retgenは、エンドツーエンドの方法で密なパッセージレトリバーと知識に基づいたテキストジェネレーターを同時に最適化する共同トレーニングフレームワークです。
Microsoft Icecaps:https://github.com/microsoft/icecaps。
このプロジェクトの直交リポジトリとして、Microsoft Icecapsは、神経会話システムを構築するためのオープンソースツールキット(Tensorflow)です。 ICECAPSは、複雑なマルチタスク学習セットアップを可能にする柔軟なパラダイム内で、最近の会話モデリングと一般的なNLP文献のツールを提供します。
前提条件のUnilm:https://github.com/microsoft/unilm
MT-DNN:https://github.com/namisan/mt-dnn
Yangjianxin1によるDialogptの中国のカウンターパート。 https://github.com/yangjianxin1/gpt2-chitchat。 Dialogptで使用したMMI戦略がこのプロジェクトのパフォーマンスも向上したことを嬉しく思います。
質問/提案がある場合は、[email protected]にお問い合わせください。ただし、応答は散発的になります。遅延を期待してください。
このプロジェクトは、貢献と提案を歓迎します。ほとんどの貢献では、貢献者ライセンス契約(CLA)に同意する必要があります。詳細については、https://cla.opensource.microsoft.comをご覧ください。
プルリクエストを送信すると、CLAボットはCLAを提供し、PRを適切に飾る必要があるかどうかを自動的に決定します(たとえば、ステータスチェック、コメント)。ボットが提供する指示に従うだけです。 CLAを使用して、すべてのレポでこれを1回だけ行う必要があります。
このプロジェクトは、Microsoftのオープンソース行動規範を採用しています。詳細については、FAQのコードを参照するか、追加の質問やコメントについては[email protected]にお問い合わせください。
このリポジトリは、会話データの大規模な事前販売の研究を促進することを目的としています。このツールキットには、実行中のダイアログで実際にモデル重量ファイルを生成するために必要なモデリング機械の一部のみが含まれています。それ自体では、このモデルは、さまざまなテキストスパンの重みに関する情報のみを提供します。研究者が実際にそれを使用するためには、彼らは独自の会話データを持ち込み、事前に処理されたシステムから応答生成をデコードする必要があります。 Microsoftは、事前に守られたシステムのサードパーティの利用からのいかなる世代についても責任を負いません。
このコードを調査で使用する場合は、ARXIVペーパーを引用できます。
@inproceedings{zhang2019dialogpt,
title={DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation},
author={Yizhe Zhang and Siqi Sun and Michel Galley and Yen-Chun Chen and Chris Brockett and Xiang Gao and Jianfeng Gao and Jingjing Liu and Bill Dolan},
year={2020},
booktitle={ACL, system demonstration}
}