导读:人机对话是人工智能的重要挑战,近几年随着人工智能的兴起,人机对话系统的研究也越来越火热。为了帮助广大开发者们更快捷地实现对话系统的开发,飞桨在自然语言处理模型库(PaddleNLP)中开源了对话模型工具库,内置了对话通用理解模型(DGU)和对话自动评估模型(ADE)。本篇文章将先为大家介绍飞桨对话通用理解模型(DGU)。
1. 人机对话概述
人机对话(Human-Machine Conversation)是指让机器理解和运用自然语言实现人机通信的技术,如下图所示。通过人机对话交互,用户可以查询信息,如示例中的第一轮对话,用户查询天气信息;用户也可以和机器进行聊天,如示例中的第二轮对话;用户还可以获取特定服务,如示例中的最后两轮对话,用户获取了电影票预定服务。
人机对话是人工智能的重要挑战,近年来获得了学术界和工业界的广泛关注。越来越多的人机对话产品,如语音助手、智能音箱、闲聊软件等相继问世,正在改变着人们的生活。
2. 飞桨DGU模型介绍
2.1. 模型介绍
在人机对话系统中,常常需要根据场景的变化去解决多种多样的任务。任务的多样性(意图识别、槽位解析、DA识别、DST等等),以及领域训练数据的稀少,给人机对话系统的研究和应用带来了巨大的困难和挑战。要使得对话系统得到更好的发展,需要开发一个通用的对话理解模型。
为此,飞桨开源了对话通用理解模型(Dialogue General Understanding,DGU),在几乎全部对话理解任务上取得了比肩甚至超越各个领域业内最好的模型的效果,展现了学习一个通用对话理解模型的巨大潜力。
DGU的模型结构如下图所示:
飞桨DGU可以支持意图识别、槽位解析、DA、DST、语义匹配五种对话任务。
(1)意图识别
意图识别,也被称为SUC(Spoken Utterance Classification),顾名思义,是指将用户输入的自然语言会话进行分类,不同类别(classification)对应的就是不同的意图。例如,用户输入“今天天气如何”,其意图可分类为为“询问天气”。从而,可以将意图识别看作是典型的多分类问题。意图的分类和定义可参考ISO-24617-2标准,其中共有56种详细的定义。面向任务的对话系统中的意图识别通常可以视为文本分类任务。同时,意图的定义与对话系统自身的定位和所具有的知识库有很大关系,即意图的定义具有非常强的领域相关性。
(2)槽位解析
槽位,指的是意图所带的参数。一个意图可能对应若干个槽位,例如询问公交车路线时,需要给出出发地、目的地、时间等必要参数。以上参数即“询问公交车路线”这一意图对应的槽位。槽位解析任务的主要目标是在已知特定领域或特定意图的语义框架(semantic frame)的前提下,从输入语句中抽取该语义框架中预先定义好的语义槽的值。语义槽位填充任务可以转化为序列标注任务,即运用经典的IOB标记法,标记某一个词是某一语义槽的开始(begin)、延续(inside),或是非语义槽(outside)。
(3)DA
DA是指对话行为(Dialogue Acts),它在一定程度上反应了说话人的意图,对于确定语句的语用信息具有重要意义。DA识别是计算机理解自然语言的关键步骤,在人机对话、交互式信息检索、机器翻译和交互式问答系统等众多应用领域具有重要作用。
(4)DST
DST是指对话状态追踪(Dialog State Tracking),DST的目标是追踪用户需求并判断当前的对话状态。该模块以多轮对话历史、当前的用户动作为输入,通过总结和推理,更好地理解在上下文的环境下用户当前所输入的文本的具体含义。对于对话系统来说,DST模块有着重大意义,很多时候需要综合考虑用户的多轮输入才能让对话系统理解用户的真正需求。
(5)语义匹配
语义匹配是检索式对话系统的核心技术。在检索式的对话系统中,在用户输入一段文本后,需要调用语义匹配模块,在知识库和大量的候选答案中,进行召回和排序,找到与用户输入最为匹配的答案,进行输出。
2.2. 效果评测
基于对话相关的业内公开数据集进行评测,飞桨DGU的模型效果如下表所示:
表格说明:
udc: 使用R1@10、R2@10、R5@10三个指标评估匹配任务的效果;
atis_slot: 使用F1指标来评估序列标注任务;
dstc2: 使用joint acc 指标来评估DST任务的多标签分类结果;
atis_intent: 使用acc指标来评估分类结果;
mrda: 使用acc指标来评估DA任务分类结果;
swda:使用acc指标来评估DA任务分类结果;
3. 飞桨DGU上手指南
下面将送上代码,手把手地教您如何使用飞桨对话通用理解模块(DGU)。
3.1. 安装说明
环境依赖:
Python >= 2.7
cuda >= 9.0
cudnn >= 7.0
pandas >= 0.20.1
PaddlePaddle >= 1.6.0,
克隆项目:
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/dialogue_model_toolkit/dialogue_general_understanding
3.2. 任务简介
本模块内共包含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识别任务;
3.3. 数据准备
数据集说明:
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 && bash prepare_data_and_model.sh
数据路径:data/input/data
预训练模型路径:data/pretrain_model
已训练模型路径:data/saved_models/trained_models
下载的数据集中已提供了训练集,测试集和验证集。
3.4. 模型配置
配置文件路径: data/config/dgu.yaml
3.5. 单机训练
方式一:推荐直接使用模块内脚本训练
bash run.sh task_name task_type
task_name和task_type为具体的任务参数,可以在文末Github查看详细内容。
方式二: 执行训练相关的代码
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"
if [ -f "./data/saved_models/${TASK_NAME}" ]; then
rm "./data/saved_models/${TASK_NAME}"
fi
if [ ! -d "./data/saved_models/${TASK_NAME}" ]; then
mkdir "./data/saved_models/${TASK_NAME}"
fi
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
3.6. 模型预测
方式一:推荐直接使用模块内脚本预测
bash run.sh task_name task_type
task_name和task_type为具体的任务参数,可以在文末Github查看详细内容。
方式二: 执行预测相关的代码
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
3.7. 模型评估
方式一: 推荐直接使用模块内脚本评估
bash run.sh task_name task_type
task_name和task_type为具体的任务参数,可以在文末Github查看详细内容。
方式二: 执行评估相关的代码
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}"
3.8. 模型推断
方式一: 推荐直接使用模块内脚本保存inferencemodel
bash run.sh task_name task_type
task_name和task_type为具体的任务参数,可以在文末Github查看详细内容。
方式二: 执行inferencemodel相关的代码:
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}"
3.9. 预训练模型
支持飞桨官方提供的BERT及ERNIE相关模型作为预训练模型。
3.10. 服务部署
模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。
今天关于飞桨对话通用理解模型(DGU)的介绍到这里就结束了,赶快动手尝试一下吧!
想与更多的深度学习开发者交流,请加入飞桨官方QQ群:796771754。
如果您想详细了解更多飞桨PaddlePaddle的相关内容,请参阅以下文档。
官网地址:
https://www.paddlepaddle.org.cn/
项目地址:
https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleNLP/PaddleDialogue