2018年,Bert等预训练语言模型的出现,给NLP下游任务带来了普遍的效果提升,成为NLP的一个重要里程碑,但这些预训练语言模型并没有反映对话的特点,比如分角色、多轮次、知识约束、讲对话策略、口语化等。2020年,面向对话的专用预训练模型(我们称作预训练对话模型)开始涌现,代表性的如微软DialoGPT、Meta的Blender等,在对话任务上有进一步的大幅效果提升。但这些模型仍存在一些缺陷,数据上,大部分只用了开放域数据,未使用或仅使用少量任务型对话数据;模型上,大多只面向回复生成进行建模,很少考虑对话理解、对话策略建模;算法上,只利用了自监督预训练目标。
达摩院对话智能团队在该方向做了一系列深入研究,目标是要做数据知识双驱动的预训练对话模型,以充分利用海量(百亿级)无标注对话数据和大规模(千万级)有标注对话知识,那如何结合有标和无标,我们提出了半监督预训练SPACE(Semi-supervised Pre-trAined Conversation Model)的新范式,在对话预训练过程中融入对话标注知识。我们打造了SPACE-1/2/3的系列大模型:
在modelscope中我们主要开源SPACE模型系列的最新版本也就是SPACE-3,本文后续部分SPACE统一指代该模型版本。
模型采用统一的单个Transformer架构作为模型底座,由四个连续的组件组成,以建模任务型对话中的对话流:
针对每个模型组件设计不同的预训练目标,最终模型采用5个预训练目标:片段掩码语言建模,半监督理解语义建模,语义区域建模,策略语义建模和对话生成建模,最后以多任务学习的方式进行训练。 因此,模型可以在预训练过程中同时学习到对话理解,对话策略和对话生成的能力,可以同时用于下游各种类型的任务型对话任务。 针对对话理解类任务,只需要复用模型的对话编码模块和对话理解模块进行编码;针对对话策略和对话生成类任务,需要使用完整模型的所有模块进行编码和生成。
本模型适用于作为基座模型进行对话相关任务的下游fine-tuning,下游需要具有一定数量的训练集,可以与一些下游任务的结构结合使用。
from modelscope.hub.snapshot_download import snapshot_download
model_id = 'damo/nlp_space_pretrained-dialog-model'
model_dir = snapshot_download(model_id, revision='v1.0.0')
model_dir就是下载后返回的本地缓存的模型路径,在下载之后我们就可以基于预训练对话模型SPACE进行下游任务的fine-tuning,由于fine-tuning时间及内存开销较大,不建议用户使用cpu。
下面我们分别基于意图识别和回复生成任务作为对话理解和生成任务的代表,详细介绍下基于SPACE 3.0进行下游任务fine-tuning的过程。
任务介绍:针对对话中的用户query进行意图识别,输入用户query,输出用户对应的意图类别。
数据集:银行领域意图识别数据集banking,共包含77个意图,训练集和测试集大小分别是10003和3080。
下面我们基于该数据集,使用SPACE进行意图分类任务上的fine-tuning的示例:
# Download data
from modelscope.msdatasets import MsDataset
data_banking = MsDataset.load('banking77')
data_dir = data_banking._hf_ds.config_kwargs['split_config']['train']
# get config and dir, need to define a function to modify the cfg
import os
save_dir = '' # user can define themselves
def cfg_modify_fn(cfg):
cfg.BPETextField.vocab_path = os.path.join(model_dir,'vocab.txt')
cfg.BPETextField.data_root = data_dir
cfg.Model.init_checkpoint = model_dir
cfg.Trainer.save_dir = save_dir
cfg.Dataset.data_dir = data_dir
# use following code to start using cpu instead of gpu
# cfg.use_gpu = False
return cfg
kwargs = dict(model_dir=model_dir,cfg_name='intent_train_config.json',cfg_modify_fn=cfg_modify_fn)
# Train
from modelscope.metainfo import Trainers
from modelscope.trainers import build_trainer
trainer = build_trainer(name=Trainers.dialog_intent_trainer, default_args=kwargs)
trainer.train()
训练完成后得到模型就可以根据保存的路径,构建一个评估用的trainer,使用如下代码评估:
# use the codes above to get data dir, construct config and args, change the model_dir to your save_dir
# the model name should change to 'pytorch_model.bin' and 'vocab.txt' should be copied and added from the download version
trainer = build_trainer(name=Trainers.dialog_intent_trainer, default_args=kwargs)
trainer.eval()
模型 | TOD-BERT | PLATO | PPTOD | UniLM | SPACE 3.0 |
---|---|---|---|---|---|
意图识别效果 | 92.76 | 92.56 | 93.86 | 93.12 | 94.94 |
任务介绍:输入对话的上下文(包括当前query),输出对话的回复文本,属于文本生成任务;
数据集:跨领域任务对话数据集MultiWOZ 2.0, 共包含7个领域超过8千session 115K轮次的对话数据。
下面我们基于该数据集,使用SPACE进行端到端的回复生成任务fine-tuning与模型评估:
import os
from modelscope.hub.snapshot_download import snapshot_download
from modelscope.metainfo import Trainers
from modelscope.msdatasets import MsDataset
from modelscope.trainers import build_trainer
from modelscope.utils.constant import DownloadMode, ModelFile
model_id = 'damo/nlp_space_pretrained-dialog-model'
save_dir = './dialog_generation_fintune_result'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
# Download data
data_multiwoz = MsDataset.load(
'MultiWoz2.0',
namespace='modelscope',
download_mode=DownloadMode.REUSE_DATASET_IF_EXISTS)
data_dir = os.path.join(
data_multiwoz._hf_ds.config_kwargs['split_config']['train'],
'data')
# Download model
model_dir = snapshot_download(model_id)
# Get config and dir
def cfg_modify_fn(cfg):
config = {
'seed': 10,
'gpu': 1,
'use_data_distributed': False,
'valid_metric_name': '-loss',
'num_epochs': 1,
'save_dir': save_dir,
'token_loss': True,
'batch_size': 8,
'log_steps': 10,
'valid_steps': 0,
'save_checkpoint': True,
'save_summary': False,
'shuffle': True,
'sort_pool_size': 0
}
cfg.Trainer = config
cfg.use_gpu = True
return cfg
kwargs = dict(
model_dir=model_dir,
cfg_name='gen_train_config.json',
data_dir=data_dir,
work_dir=save_dir,
cfg_modify_fn=cfg_modify_fn)
# Train
trainer = build_trainer(
name=Trainers.dialog_modeling_trainer, default_args=kwargs)
trainer.train()
# Evaluate
checkpoint_path=os.path.join(save_dir, ModelFile.TORCH_MODEL_BIN_FILE)
# Evaluate the best model choosed by the validation set, the best checkpoint maybe in the 4-10 epoch.
trainer.evaluate(checkpoint_path=checkpoint_path)
模型 | Inform | Success | BLEU | Comb |
---|---|---|---|---|
SimpleTOD | 84.40 | 70.10 | 15.01 | 92.26 |
DoTS | 86.59 | 74.14 | 15.06 | 95.43 |
UBAR | 95.40 | 80.70 | 17.00 | 105.05 |
MTTOD | 90.99 | 82.58 | 20.25 | 107.04 |
SPACE | 95.30 | 88.00 | 19.30 | 110.95 |
目前在意图分类任务上,由于我们在modelscopt中采用了统一的基座,相对论文减少了一次中间预训练过程,最终效果会有大概1%左右的偏差;
下游模型为SPACE在Banking77数据集上finetune得到的意图识别模型,给定单轮的的用户语句,模型会针对用户的输入语句输出一个该领域的意图类别,如 “lost_or_stolen_card”(银行卡丢失), “card_linking”(银行卡绑定) 等。
详情见ModelCard: https://www.modelscope.cn/models/damo/nlp_space_dialog-intent-prediction/summary
下游模型为SPACE-3 在MultiWOZ2.2上finetune得到的对话状态追踪模型,输入完整的对话历史(包括用户语句、系统语句、系统动作),模型会给出当前轮的对话状态(即用户所表达出想要的槽值对)。
详情见ModelCard: https://www.modelscope.cn/models/damo/nlp_space_dialog-state-tracking/summary
下游模型为SPACE-3 在MultiWOZ2.2上finetune得到的端到端对话生成模型,称作 space_dialog-modeling,输入用户语句,模型就能够开始多轮交互,帮助用户完成特定的任务(如找到某个用户感兴趣的餐馆、酒店)。
详情见ModelCard: https://www.modelscope.cn/models/damo/nlp_space_dialog-modeling/summary
@inproceedings{he2022galaxy,
title={Galaxy: A generative pre-trained model for task-oriented dialog with semi-supervised learning and explicit policy injection},
author={He, Wanwei and Dai, Yinpei and Zheng, Yinhe and Wu, Yuchuan and Cao, Zheng and Liu, Dermot and Jiang, Peng and Yang, Min and Huang, Fei and Si, Luo and others},
booktitle={Proceedings of the AAAI Conference on Artificial Intelligence},
volume={36},
number={10},
pages={10749--10757},
year={2022}
}
@inproceedings{he-etal-2022-space,
title = "{SPACE}-2: Tree-Structured Semi-Supervised Contrastive Pre-training for Task-Oriented Dialog Understanding",
author = "He, Wanwei and
Dai, Yinpei and
Hui, Binyuan and
Yang, Min and
Cao, Zheng and
Dong, Jianbo and
Huang, Fei and
Si, Luo and
Li, Yongbin",
booktitle = "Proceedings of the 29th International Conference on Computational Linguistics",
month = oct,
year = "2022",
address = "Gyeongju, Republic of Korea",
publisher = "International Committee on Computational Linguistics",
url = "https://aclanthology.org/2022.coling-1.46",
pages = "553--569"
}
@article{he2022unified,
title={Unified Dialog Model Pre-training for Task-Oriented Dialog Understanding and Generation},
author={He, Wanwei and Dai, Yinpei and Yang, Min and Huang, Fei and Si, Luo and Sun, jian and Li, Yongbin},
journal={SIGIR},
year={2022}
}