前言
众所周知,预训练BERT语言模型在许多NLP任务重大放异彩,用来文本内容和语义的表征学习很有效果,而且大大降低了下游任务的训练时间。但是由于普通文本和任务型对话之间的语言模式的潜在差异,使得现在的预训练语言模型在实际使用中作用不大。
至于对话领域的预训练语言模型,大多数都用的是开放域的数据集来训练,例如Reddit或Twitter,用于对话响应的生成。而对于任务导向型对话预训练语言模型来说,还没有效果很好或者说是开源了的好模型,所以本篇论文针对面向任务的对话系统,结合现有 BERT 基础架构提出了一个新的预训练目标。
TOD-BERT带来了如下的成果:
- 在任务导向型对话的IR(意图识别),DST(对话状态追踪),DAP(对话行为预测),RS(响应选择)这四个下游任务中,达到了SOTA的效果;
- 实验证明了,TOD-BERT具有较强的few-shot能力,可以缓解面向任务对话的数据稀缺的问题;
- TOD-BERT在训练时,把BERT中NSP(预测下一个句子是否是下一句)替换为RCL(Response contrastive loss响应对比损失);
论文提供的源码以及我应用在对话系统中的实践仓库如下:
TOD-BERT
nlp-dialogue
模型细节
数据集
首先我们需要来看一下,模型使用了九种数据集,都是多轮对话,在数据集上也取得了很好的效果,使用多领域多轮对话也是因为坐着极力想证明,做任务导向型的对话所用的预训练模型,一定要用任务导向型的语料库来训练效果才好。
This paper aims to prove this hypothesis: self-supervised language model pre-training using task-oriented corpora can learn better representations than existing pre-trained models for task-oriented downstream tasks.
使用语料如下:
模型结构
预训练语言模型方面,选用的是Base BERT(不过文中提到使用其他语言模型也是可以的,选用BERT只是因为它比较火,事实上论文的源码也是使用了很多其他的语言模型),损失函数方面使用的是MLM和RCL(后面详细说明)。
还有一个比较特别的就是TOD-BERT为用户和系统引入了两个特殊的token来模拟相应的对话行为,即在用户的utterance前加入[USR],在系统的utterance前加入[SYS]。从而能够将一个多轮对话的所有的utterance连接起来,变成一个序列,结构如下:
损失函数
首先是MLM,熟悉BERT的应该都知道,我在这里就提一下:
L m l m = − ∑ m = 1 M l o g P ( x m ) L_{mlm}=-\sum_{m=1}^MlogP(x_m) Lmlm=−m=1∑MlogP(xm)
其中, M M M 为被mask的token的总数, P ( x m ) P(x_m ) P(xm) 是token x m x_m xm 在词汇表上预测的概率。
接下来重点看一下RCL,它有如下几个优点:
- 能够学到[CLS]这个token的更好的表示,这对于所有下游任务都是必不可少的;
- 刺激模型去捕获潜在的对话顺序、结构信息和响应相似性;
具体做法是,采用双编码器方法,模拟了多个负样本。有一批对话 { D 1 , … , D b } \{D_1,…,D_b \} { D1,…,Db},随机选择的回合 t t t 分割每个对话,例如, D 1 D_1 D1 将被分割成两部分,一部分是上下文 S 1 1 , U 1 1 . . . S t 1 , U t 1 S_1^1,U_1^1...S_t^1,U_t^1 S11,U