目前的儲存庫包含部落格文章附帶的程式碼?如何透過遷移學習建構最先進的對話式人工智慧。
該程式碼是一個乾淨且帶有註釋的程式碼庫,包含訓練和測試腳本,可用於訓練對話代理,利用 OpenAI GPT 和 GPT-2 Transformer 語言模型的遷移學習。
該程式碼庫可用於重現 HuggingFace 參加 NeurIPS 2018 對話競賽 ConvAI2 的結果,該競賽在自動指標方面是最先進的。 3k 多行競賽程式碼被提煉為大約 250 行具有分散式和 FP16 選項的訓練程式碼,形成了目前的儲存庫。
該模型可以在 8 V100 雲端實例上訓練約一小時(目前成本約為 25 美元),並且還提供預訓練模型。
要安裝和使用訓練和推理腳本,請複製儲存庫並安裝要求:
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 設定分配足夠的記憶體來建立容器。由於 Pytorch 輪過大,使用預設 1.75GB 進行建置將會失敗。
然後就可以輸入圖片了
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 | 參加培訓的人數 |
最大歷史記錄 | int | 2 | 要保留在歷史記錄中的先前交換數量 |
訓練批次大小 | int | 4 | 訓練的批量大小 |
有效批次大小 | int | 4 | 用於驗證的批量大小 |
梯度累積步驟 | int | 8 | 在幾個步驟中累積梯度 |
LR | float | 6.25e-5 | 學習率 |
流明係數 | 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 | "" | 設定為 O0、O1、O2 或 O3 以進行 fp16 訓練(請參閱 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
使用 concai2 評估腳本(見下文),模型的 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 或簡稱 |
最大歷史記錄 | int | 2 | 要保留在歷史記錄中的先前話語的數量 |
裝置 | str | cuda if torch.cuda.is_available() else cpu | 設備(cuda 或 cpu) |
無樣本 | 動作store_true | 設定使用貪婪解碼而不是採樣 | |
最大長度 | int | 20 | 輸出話語的最大長度 |
最小長度 | int | 1 | 輸出話語的最小長度 |
種子 | int | 42 | 種子 |
溫度 | int | 0.7 | 採樣softmax溫度 |
前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
評估腳本接受一些參數來選擇評估指標並調整解碼演算法:
爭論 | 類型 | 預設值 | 描述 |
---|---|---|---|
評估類型 | str | "hits@1" | 根據 ConvAI2 驗證資料集上的hits@1 、 ppl 或f1 指標評估模型 |
模型 | str | "openai-gpt" | 模型的路徑、URL 或簡稱 |
最大歷史記錄 | int | 2 | 要保留在歷史記錄中的先前話語的數量 |
裝置 | str | cuda if torch.cuda.is_available() else cpu | 設備(cuda 或 cpu) |
無樣本 | 動作store_true | 設定使用貪婪解碼而不是採樣 | |
最大長度 | int | 20 | 輸出話語的最大長度 |
最小長度 | int | 1 | 輸出話語的最小長度 |
種子 | int | 42 | 種子 |
溫度 | int | 0.7 | 採樣softmax溫度 |
前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}
}