当前的存储库包含博客文章附带的代码?如何通过迁移学习构建最先进的对话式人工智能。
该代码是一个干净且带注释的代码库,包含训练和测试脚本,可用于训练对话代理,利用 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}
}