这是论文的实现:
学习带有面向任务的对话系统参数的知识库。 Andrea Madotto 、Samuel Cahyawijaya、Genta Indra Winata、Yan Xu、Zihan Liu、Zhaojian Lin、Pascale Fung EMNLP 2020 调查结果[PDF]
如果您在工作中使用此工具包中包含的任何源代码或数据集,请引用以下论文。 bibtex 列出如下:
@文章{madotto2020学习, title={面向任务的对话系统使用参数学习知识库}, 作者={Madotto、Andrea 和 Cahyawijaya、Samuel 和 Winata、Genta Indra 和 Xu、Yan 和 Liu、Zihan 和 Lin、Zhaojian 和 Fung、Pascale}, 期刊={arXiv预印本arXiv:2009.13656}, 年={2020} }
面向任务的对话系统要么是模块化的,具有单独的对话状态跟踪(DST)和管理步骤,要么是端到端可训练的。无论哪种情况,知识库 (KB) 在满足用户请求方面都发挥着重要作用。模块化系统依赖 DST 与 KB 交互,这在注释和推理时间方面是昂贵的。端到端系统直接使用 KB 作为输入,但当 KB 大于几百个条目时,它们无法扩展。在本文中,我们提出了一种将任意大小的 KB 直接嵌入到模型参数中的方法。生成的模型不需要任何 DST 或模板响应,也不需要 KB 作为输入,并且它可以通过微调动态更新其 KB。我们在五个具有小、中、大 KB 大小的面向任务的对话数据集中评估我们的解决方案。我们的实验表明,端到端模型可以有效地将知识库嵌入其参数中,并在所有评估的数据集中实现有竞争力的性能。
我们在requirements.txt
中列出了我们的依赖项,您可以通过运行来安装依赖项
❱❱❱ pip install -r requirements.txt
此外,我们的代码还包括带有apex
fp16
支持。您可以从 https://github.com/NVIDIA/apex 找到该软件包。
数据集下载预处理后的数据集并将 zip 文件放入./knowledge_embed/babi5
文件夹中。通过执行解压 zip 文件
❱❱❱ cd ./knowledge_embed/babi5
❱❱❱ unzip dialog-bAbI-tasks.zip
通过 bAbI-5 数据集生成去词汇化对话
❱❱❱ python3 generate_delexicalization_babi.py
通过 bAbI-5 数据集生成词汇化数据
❱❱❱ python generate_dialogues_babi5.py --dialogue_path ./dialog-bAbI-tasks/dialog-babi-task5trn_record-delex.txt --knowledge_path ./dialog-bAbI-tasks/dialog-babi-kb-all.txt --output_folder ./dialog-bAbI-tasks --num_augmented_knowledge <num_augmented_knowledge> --num_augmented_dialogue <num_augmented_dialogues> --random_seed 0
其中最大<num_augmented_knowledge>
为558(推荐), <num_augmented_dialogues>
为264,因为它对应于bAbI-5数据集中的知识数量和对话数量。
微调 GPT-2
我们提供在 bAbI 训练集上微调的 GPT-2 模型的检查点。您还可以选择使用以下命令自行训练模型。
❱❱❱ cd ./modeling/babi5
❱❱❱ python main.py --model_checkpoint gpt2 --dataset BABI --dataset_path ../../knowledge_embed/babi5/dialog-bAbI-tasks --n_epochs <num_epoch> --kbpercentage <num_augmented_dialogues>
请注意, --kbpercentage
的值等于来自词汇化的<num_augmented_dialogues>
值。此参数用于选择要嵌入到训练数据集中的增强文件。
您可以通过执行以下脚本来评估模型
❱❱❱ python evaluate.py --model_checkpoint <model_checkpoint_folder> --dataset BABI --dataset_path ../../knowledge_embed/babi5/dialog-bAbI-tasks
对 bAbI-5 进行评分要运行 bAbI-5 任务模型的评分器,您可以运行以下命令。 Scorer将读取从evaluate.py
生成的runs
文件夹下的所有result.json
python scorer_BABI5.py --model_checkpoint <model_checkpoint> --dataset BABI --dataset_path ../../knowledge_embed/babi5/dialog-bAbI-tasks --kbpercentage 0
数据集
下载预处理后的数据集并将zip文件放在./knowledge_embed/camrest
文件夹下。通过执行解压 zip 文件
❱❱❱ cd ./knowledge_embed/camrest
❱❱❱ unzip CamRest.zip
通过 CamRest 数据集生成去词汇化对话
❱❱❱ python3 generate_delexicalization_CAMREST.py
通过 CamRest 数据集生成词汇化数据
❱❱❱ python generate_dialogues_CAMREST.py --dialogue_path ./CamRest/train_record-delex.txt --knowledge_path ./CamRest/KB.json --output_folder ./CamRest --num_augmented_knowledge <num_augmented_knowledge> --num_augmented_dialogue <num_augmented_dialogues> --random_seed 0
其中最大<num_augmented_knowledge>
为201(推荐), <num_augmented_dialogues>
为156,相当大,因为它对应于CamRest数据集中的知识数量和对话数量。
微调 GPT-2
我们提供在 CamRest 训练集上微调的 GPT-2 模型的检查点。您还可以选择使用以下命令自行训练模型。
❱❱❱ cd ./modeling/camrest/
❱❱❱ python main.py --model_checkpoint gpt2 --dataset CAMREST --dataset_path ../../knowledge_embed/camrest/CamRest --n_epochs <num_epoch> --kbpercentage <num_augmented_dialogues>
请注意, --kbpercentage
的值等于来自词汇化的<num_augmented_dialogues>
值。此参数用于选择要嵌入到训练数据集中的增强文件。
您可以通过执行以下脚本来评估模型
❱❱❱ python evaluate.py --model_checkpoint <model_checkpoint_folder> --dataset CAMREST --dataset_path ../../knowledge_embed/camrest/CamRest
CamRest 评分要运行 bAbI 5 任务模型的评分器,您可以运行以下命令。 Scorer将读取从evaluate.py
生成的runs
文件夹下的所有result.json
python scorer_CAMREST.py --model_checkpoint <model_checkpoint> --dataset CAMREST --dataset_path ../../knowledge_embed/camrest/CamRest --kbpercentage 0
数据集
下载预处理后的数据集并将其放在./knowledge_embed/smd
文件夹下。
❱❱❱ cd ./knowledge_embed/smd
❱❱❱ unzip SMD.zip
微调 GPT-2
我们提供在 SMD 训练集上微调的 GPT-2 模型的检查点。下载检查点并将其放在./modeling
文件夹下。
❱❱❱ cd ./knowledge_embed/smd
❱❱❱ mkdir ./runs
❱❱❱ unzip ./knowledge_embed/smd/SMD_gpt2_graph_False_adj_False_edge_False_unilm_False_flattenKB_False_historyL_1000000000_lr_6.25e-05_epoch_10_weighttie_False_kbpercentage_0_layer_12.zip -d ./runs
您还可以选择使用以下命令自行训练模型。
❱❱❱ cd ./modeling/smd
❱❱❱ python main.py --dataset SMD --lr 6.25e-05 --n_epochs 10 --kbpercentage 0 --layers 12
准备知识嵌入对话
首先,我们需要建立用于SQL查询的数据库。
❱❱❱ cd ./knowledge_embed/smd
❱❱❱ python generate_dialogues_SMD.py --build_db --split test
然后,我们根据域预先设计的模板生成对话。以下命令使您能够在weather
领域生成对话。如果您想在其他两个域中生成对话,请将dialogue_path
和domain
参数中的weather
替换为navigate
或schedule
。您还可以通过更改参数num_augmented_dialogue
来更改重新词法化过程中使用的模板数量。
❱❱❱ python generate_dialogues_SMD.py --split test --dialogue_path ./templates/weather_template.txt --domain weather --num_augmented_dialogue 100 --output_folder ./SMD/test
使微调的 GPT-2 模型适应测试集
❱❱❱ python evaluate_finetune.py --dataset SMD --model_checkpoint runs/SMD_gpt2_graph_False_adj_False_edge_False_unilm_False_flattenKB_False_historyL_1000000000_lr_6.25e-05_epoch_10_weighttie_False_kbpercentage_0_layer_12 --top_k 1 --eval_indices 0,303 --filter_domain ""
您还可以通过并行运行实验来加速微调过程。请修改代码#L14中的GPU设置。
❱❱❱ python runner_expe_SMD.py
数据集
下载预处理后的数据集并将其放在./knowledge_embed/mwoz
文件夹下。
❱❱❱ cd ./knowledge_embed/mwoz
❱❱❱ unzip mwoz.zip
准备知识嵌入对话(如果您已下载上面的 zip 文件,则可以跳过此步骤)
您可以通过运行来准备数据集
❱❱❱ bash generate_MWOZ_all_data.sh
shell 脚本通过调用从 MWOZ 数据集生成去词汇化对话
❱❱❱ python generate_delex_MWOZ_ATTRACTION.py
❱❱❱ python generate_delex_MWOZ_HOTEL.py
❱❱❱ python generate_delex_MWOZ_RESTAURANT.py
❱❱❱ python generate_delex_MWOZ_TRAIN.py
❱❱❱ python generate_redelex_augmented_MWOZ.py
❱❱❱ python generate_MWOZ_dataset.py
微调 GPT-2
我们提供在 MWOZ 训练集上微调的 GPT-2 模型的检查点。下载检查点并将其放在./modeling
文件夹下。
❱❱❱ cd ./knowledge_embed/mwoz
❱❱❱ mkdir ./runs
❱❱❱ unzip ./mwoz.zip -d ./runs
您还可以选择使用以下命令自行训练模型。
❱❱❱ cd ./modeling/mwoz
❱❱❱ python main.py --model_checkpoint gpt2 --dataset MWOZ_SINGLE --max_history 50 --train_batch_size 6 --kbpercentage 100 --fp16 O2 --gradient_accumulation_steps 3 --balance_sampler --n_epochs 10
入门我们使用neo4j
社区服务器版本和apoc
库来处理图形数据。 apoc
用于在neo4j
中并行化查询,以便我们可以更快地处理大规模图
在继续进行数据集部分之前,您需要确保安装了neo4j
(https://neo4j.com/download-center/#community) 和apoc
(https://neo4j.com/developer/neo4j-apoc/)在您的系统上。
如果您不熟悉CYPHER
和apoc
语法,可以按照https://neo4j.com/developer/cypher/
和https://neo4j.com/blog/intro-user-defined-procedures-apoc/
中的教程进行操作
数据集下载原始数据集并将 zip 文件放入./knowledge_embed/opendialkg
文件夹中。通过执行解压 zip 文件
❱❱❱ cd ./knowledge_embed/opendialkg
❱❱❱ unzip https://drive.google.com/file/d/1llH4-4-h39sALnkXmGR8R6090xotE0PE/view?usp=sharing.zip
通过 opendialkg 数据集生成去词汇化对话(警告:这需要大约 12 小时才能运行)
❱❱❱ python3 generate_delexicalization_DIALKG.py
该脚本将生成./opendialkg/dialogkg_train_meta.pt
,它将用于生成词汇化对话。然后,您可以通过 opendialkg 数据集生成词汇化对话
❱❱❱ python generate_dialogues_DIALKG.py --random_seed <random_seed> --batch_size 100 --max_iteration <max_iter> --stop_count <stop_count> --connection_string bolt://localhost:7687
该脚本最多会生成batch_size * max_iter
个样本的对话样本,但在每个批次中,有可能没有有效的候选者,从而导致样本较少。生成数量受到另一个称为stop_count
因素的限制,如果生成的样本数量大于等于指定的stop_count
该因素将停止生成。该文件将生成 4 个文件: ./opendialkg/db_count_records_{random_seed}.csv
、 ./opendialkg/used_count_records_{random_seed}.csv
和./opendialkg/generation_iteration_{random_seed}.csv
Generation_iteration_{random_seed}.csv 用于检查分布偏移在数据库中计数;和./opendialkg/generated_dialogue_bs100_rs{random_seed}.json
{random_seed}.json 其中包含生成的样本。
注意事项:
generate_delexicalization_DIALKG.py
和generate_dialogues_DIALKG.py
中的neo4j
密码。微调 GPT-2
我们提供在 opendialkg 训练集上微调的 GPT-2 模型的检查点。您还可以选择使用以下命令自行训练模型。
❱❱❱ cd ./modeling/opendialkg
❱❱❱ python main.py --dataset_path ../../knowledge_embed/opendialkg/opendialkg --model_checkpoint gpt2 --dataset DIALKG --n_epochs 50 --kbpercentage <random_seed> --train_batch_size 8 --valid_batch_size 8
请注意, --kbpercentage
的值等于来自词法化的<random_seed>
值。此参数用于选择要嵌入到训练数据集中的增强文件。
您可以通过执行以下脚本来评估模型
❱❱❱ python evaluate.py --model_checkpoint <model_checkpoint_folder> --dataset DIALKG --dataset_path ../../knowledge_embed/opendialkg/opendialkg
对 OpenDialKG 进行评分要运行 bAbI-5 任务模型的评分器,您可以运行以下命令。 Scorer将读取从evaluate.py
生成的runs
文件夹下的所有result.json
python scorer_DIALKG5.py --model_checkpoint <model_checkpoint> --dataset DIALKG ../../knowledge_embed/opendialkg/opendialkg --kbpercentage 0
有关实验、超参数和评估结果的详细信息,您可以在我们工作的主要论文和补充材料中找到。