# 对话通用理解模块DGU * [1、模型简介](#1、模型简介) * [2、快速开始](#2、快速开始) * [3、进阶使用](#3、进阶使用) * [4、参考论文](#4、参考论文) * [5、版本更新](#5、版本更新) ## 1、模型简介 对话相关的任务中,Dialogue System常常需要根据场景的变化去解决多种多样的任务。任务的多样性(意图识别、槽位解析、DA识别、DST等等),以及领域训练数据的稀少,给Dialogue System的研究和应用带来了巨大的困难和挑战,要使得dialogue system得到更好的发展,需要开发一个通用的对话理解模型。为此,我们给出了基于BERT的对话通用理解模块(DGU: DialogueGeneralUnderstanding),通过实验表明,使用base-model(BERT)并结合常见的学习范式,就可以在几乎全部对话理解任务上取得比肩甚至超越各个领域业内最好的模型的效果,展现了学习一个通用对话理解模型的巨大潜力。 ## 2、快速开始 ### 安装说明 #### a、环境依赖 - Python >= 2.7 - cuda >= 9.0 - cudnn >= 7.0 - PaddlePaddle >= 1.3.1,请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装, 由于模块内模型基于bert做finetuning, 训练速度较慢, 建议用户安装GPU版本PaddlePaddle进行训练。 注意:使用Windows GPU环境的用户,需要将示例代码中的[fluid.ParallelExecutor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#parallelexecutor)替换为[fluid.Executor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#executor)。 #### b、安装代码 克隆代码库到本地 ``` git clone https://github.com/PaddlePaddle/models.git cd models/PaddleNLP/dialogue_model_toolkit/dialogue_general_understanding ``` ### 任务简介 本模块内共包含6个任务,内容如下: ``` udc: 使用Ubuntu Corpus V1公开数据集,实现对话匹配任务; atis_slot: 使用微软提供的公开数据集(Airline Travel Information System),实现槽位识别任务; dstc2: 使用对话状态跟踪挑战(Dialog State Tracking Challenge)2公开数据集,实现对话状态追踪(DST)任务; atis_intent: 使用微软提供的公开数据集(Airline Travel Information System),实现意图识别任务; mrda: 使用公开数据集Meeting Recorder Dialogue Act,实现DA识别任务; swda:使用公开数据集Switchboard Dialogue Act Corpus,实现DA识别任务; ``` ### 数据准备 数据集说明: ``` UDC: Ubuntu Corpus V1; ATIS: 微软提供的公开数据集(Airline Travel Information System),模块内包含意图识别和槽位解析两个任务的数据; DSTC2: 对话状态跟踪挑战(Dialog State Tracking Challenge)2; MRDA: Meeting Recorder Dialogue Act; SWDA:Switchboard Dialogue Act Corpus; ``` 数据集、相关模型下载: ``` cd dgu && sh prepare_data_and_model.sh ``` 下载的数据集中已提供了训练集,测试集和验证集,用户如果需要重新生成某任务数据集的训练数据,可执行: ``` cd dgu/scripts && sh run_build_data.sh task_name 参数说明: task_name: udc, swda, mrda, atis, dstc2, 选择5个数据集选项中用户需要生成的数据名 ``` ### 单机训练 #### 方式一: 推荐直接使用模块内脚本训练 ``` sh run.sh task_name task_type 参数说明: task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项; task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程); 训练示例: sh run.sh atis_intent train ``` 方式一如果为CPU训练: ``` 请将run.sh内参数设置为: 1、export CUDA_VISIBLE_DEVICES= ``` 方式一如果为GPU训练: ``` 请将run.sh内参数设置为: 1、如果为单卡训练(用户指定空闲的单卡): export CUDA_VISIBLE_DEVICES=0 2、如果为多卡训练(用户指定空闲的多张卡): export CUDA_VISIBLE_DEVICES=0,1,2,3 ``` #### 方式二: 执行训练相关的代码: ``` export FLAGS_sync_nccl_allreduce=0 export FLAGS_eager_delete_tensor_gb=1 #开启显存优化 export CUDA_VISIBLE_DEVICES=0 #GPU单卡训练 #export CUDA_VISIBLE_DEVICES=0,1,2,3 #GPU多卡训练 #export CUDA_VISIBLE_DEVICES= #CPU训练 if [ ! "$CUDA_VISIBLE_DEVICES" ] then use_cuda=false else use_cuda=true fi TASK_NAME="atis_intent" #指定训练的任务名称 BERT_BASE_PATH="data/pretrain_model/uncased_L-12_H-768_A-12" python -u main.py \ --task_name=${TASK_NAME} \ --use_cuda=${use_cuda} \ --do_train=true \ --in_tokens=true \ --epoch=20 \ --batch_size=4096 \ --do_lower_case=true \ --data_dir="./data/input/data/atis/${TASK_NAME}" \ --bert_config_path="${BERT_BASE_PATH}/bert_config.json" \ --vocab_path="${BERT_BASE_PATH}/vocab.txt" \ --init_from_pretrain_model="${BERT_BASE_PATH}/params" \ --save_model_path="./data/saved_models/${TASK_NAME}" \ --save_param="params" \ --save_steps=100 \ --learning_rate=2e-5 \ --weight_decay=0.01 \ --max_seq_len=128 \ --print_steps=10 \ --use_fp16 false ``` 注:采用方式二时,模型训练过程可参考run.sh内相关任务的参数设置 ### 模型预测 #### 方式一: 推荐直接使用模块内脚本预测 ``` sh run.sh task_name task_type 参数说明: task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项; task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程); 预测示例: sh run.sh atis_intent predict ``` 方式一如果为CPU预测: ``` 请将run.sh内参数设置为: 1、export CUDA_VISIBLE_DEVICES= ``` 方式一如果为GPU预测: ``` 请将run.sh内参数设置为: 支持单卡预测(用户指定空闲的单卡): export CUDA_VISIBLE_DEVICES=0 ``` 注:预测时,如采用方式一,用户可通过修改run.sh中init_from_params参数来指定自己训练好的需要预测的模型,目前代码中默认为加载官方已经训练好的模型; #### 方式二: 执行预测相关的代码: ``` export FLAGS_sync_nccl_allreduce=0 export FLAGS_eager_delete_tensor_gb=1 #开启显存优化 export CUDA_VISIBLE_DEVICES=0 #单卡预测 #export CUDA_VISIBLE_DEVICES= #CPU预测 if [ ! "$CUDA_VISIBLE_DEVICES" ] then use_cuda=false else use_cuda=true fi TASK_NAME="atis_intent" #指定预测的任务名称 BERT_BASE_PATH="./data/pretrain_model/uncased_L-12_H-768_A-12" python -u main.py \ --task_name=${TASK_NAME} \ --use_cuda=${use_cuda} \ --do_predict=true \ --in_tokens=true \ --batch_size=4096 \ --do_lower_case=true \ --data_dir="./data/input/data/atis/${TASK_NAME}" \ --init_from_params="./data/saved_models/trained_models/${TASK_NAME}/params" \ --bert_config_path="${BERT_BASE_PATH}/bert_config.json" \ --vocab_path="${BERT_BASE_PATH}/vocab.txt" \ --output_prediction_file="./data/output/pred_${TASK_NAME}" \ --max_seq_len=128 ``` 注:采用方式二时,模型预测过程可参考run.sh内具体任务的参数设置 ### 模型评估 模块中6个任务,各任务支持计算的评估指标内容如下: ``` udc: 使用R1@10、R2@10、R5@10三个指标评估匹配任务的效果; atis_slot: 使用F1指标来评估序列标注任务; dstc2: 使用joint acc 指标来评估DST任务的多标签分类结果; atis_intent: 使用acc指标来评估分类结果; mrda: 使用acc指标来评估DA任务分类结果; swda:使用acc指标来评估DA任务分类结果; ``` 效果上,6个任务公开数据集评测效果如下表所示: | task_name | udc | udc | udc | atis_slot | dstc2 | atis_intent | swda | mrda | | :------ | :------ | :------ | :------ | :------| :------ | :------ | :------ | :------ | | 对话任务 | 匹配 | 匹配 | 匹配 | 槽位解析 | DST | 意图识别 | DA | DA | | 任务类型 | 分类 | 分类 | 分类 | 序列标注 | 多标签分类 | 分类 | 分类 | 分类 | | 任务名称 | udc | udc | udc| atis_slot | dstc2 | atis_intent | swda | mrda | | 评估指标 | R1@10 | R2@10 | R5@10 | F1 | JOINT ACC | ACC | ACC | ACC | | SOTA | 76.70% | 87.40% | 96.90% | 96.89% | 74.50% | 98.32% | 81.30% | 91.70% | | DGU | 82.03% | 90.59% | 97.73% | 97.14% | 91.23% | 97.76% | 80.37% | 91.53% | #### 方式一: 推荐直接使用模块内脚本评估 ``` sh run.sh task_name task_type 参数说明: task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项; task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程); 评估示例: sh run.sh atis_intent evaluate ``` 注:评估计算ground_truth和predict_label之间的打分,默认CPU计算即可; #### 方式二: 执行评估相关的代码: ``` TASK_NAME="atis_intent" #指定预测的任务名称 python -u main.py \ --task_name=${TASK_NAME} \ --use_cuda=false \ --do_eval=true \ --evaluation_file="./data/input/data/atis/${TASK_NAME}/test.txt" \ --output_prediction_file="./data/output/pred_${TASK_NAME}" ``` ### 模型推断 #### 方式一: 推荐直接使用模块内脚本保存inference model ``` sh run.sh task_name task_type 参数说明: task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项; task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程); 保存模型示例: sh run.sh atis_intent inference ``` 方式一如果为CPU执行inference model过程: ``` 请将run.sh内参数设置为: 1、export CUDA_VISIBLE_DEVICES= ``` 方式一如果为GPU执行inference model过程: ``` 请将run.sh内参数设置为: 1、单卡模型推断(用户指定空闲的单卡): export CUDA_VISIBLE_DEVICES=0 ``` #### 方式二: 执行inference model相关的代码: ``` TASK_NAME="atis_intent" #指定预测的任务名称 BERT_BASE_PATH="./data/pretrain_model/uncased_L-12_H-768_A-12" export CUDA_VISIBLE_DEVICES=0 #单卡推断inference model #export CUDA_VISIBLE_DEVICES= #CPU预测 if [ ! "$CUDA_VISIBLE_DEVICES" ] then use_cuda=false else use_cuda=true fi python -u main.py \ --task_name=${TASK_NAME} \ --use_cuda=${use_cuda} \ --do_save_inference_model=true \ --init_from_params="./data/saved_models/trained_models/${TASK_NAME}/params" \ --bert_config_path="${BERT_BASE_PATH}/bert_config.json" \ --inference_model_dir="data/inference_models/${TASK_NAME}" ``` ### 预训练模型 支持PaddlePaddle官方提供的BERT及ERNIE相关模型作为预训练模型 | Model | Layers | Hidden size | Heads |Parameters | | :------| :------: | :------: |:------: |:------: | | [BERT-Base, Uncased](https://bert-models.bj.bcebos.com/uncased_L-12_H-768_A-12.tar.gz) | 12 | 768 |12 |110M | | [BERT-Large, Uncased](https://bert-models.bj.bcebos.com/uncased_L-24_H-1024_A-16.tar.gz) | 24 | 1024 |16 |340M | |[BERT-Base, Cased](https://bert-models.bj.bcebos.com/cased_L-12_H-768_A-12.tar.gz)|12|768|12|110M| |[BERT-Large, Cased](https://bert-models.bj.bcebos.com/cased_L-24_H-1024_A-16.tar.gz)|24|1024|16|340M| |[ERNIE, english](https://ernie.bj.bcebos.com/ERNIE_en_1.0.tgz)|24|1024|16|3.8G| ### 服务部署 模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。 #### 服务器部署 请参考PaddlePaddle官方提供的[服务器端部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/deploy/inference/index_cn.html)文档进行部署上线。 ## 3、进阶使用 ### 背景介绍 dialogue_general_understanding模块,针对数据集开发了相关的模型训练过程,支持分类,多标签分类,序列标注等任务,用户可针对自己的数据集,进行相关的模型定制;并取得了比肩业内最好模型的效果: ### 模型概览