百度于去年10月公布的通用领域对话生成预训练模型PLATO,最近已正式被ACL 2020接收。PLATO是业界首个基于隐空间(Latent Space)的端到端预训练对话生成模型。据悉,该模型利用隐向量来表示对话的潜在方向,从而达到对话内容丰富度和流畅度的显著提升。针对具体对话任务,基于PLATO可以用少量数据训练得到非常流畅的对话系统。
论文名称PLATO: Pre-trained Dialogue Generation Model with Discrete Latent Variable
论文地址https://arxiv.org/abs/1910.07931
预训练模型及代码https://github.com/PaddlePaddle/Research/tree/master/NLP/Dialogue-PLATO
1. 引言
研发开放领域(Open-Domain)的对话机器人,使得它能用自然语言与人自由地交流,一直是自然语言处理领域终极目标之一。对话系统的挑战非常多,其中有两点非常重要,一是大规模开放领域多轮对话数据匮乏; 二是对话中涉及常识、领域知识和上下文关联,因此在对话回复时,存在“一对多”的问题。例如下面这段例子
李雷:今天好冷啊,外面风好大。
韩梅梅Bot 可以怎样回复李雷呢?
是啊,天气预报说今天气温骤降10度呢。
好期待下雪啊,这样就可以堆雪人了。
刚在外面走了一会,发型都被吹乱了。
一个对话的上文(Context),往往可以对应多个不同回复(Response)的方向。这些不同的回复随着不同的人,不同的背景和环境可能有所不同,但都是合理的回复。对于这种复杂的一对多模式,神经网络拟合起来往往非常棘手。在学习这样一对多的数据时,会因为模型能力和数据匮乏导致最终学习的效果趋向于平庸,极易产生如“哈哈”,“嗯”这样大家熟知的索然无味的“聊天终结语”。
预训练模型近年来不管在自然语言理解还是在自然语言生成领域都产生了巨大的影响。利用通用语料进行预训练,在目标领域上能用少量的数据得到很好的效果。尽管如此,对话预训练的效果因为上面的原因仍然不能让人满意。为了解决这些问题,百度提出了一个新的对话生成框架 — 带离散隐变量的对话生成预训练模型“柏拉图”(PLATO)。 隐变量较为普遍地在VAE, CVAE等技术中使用, 但在百度的文章中,他们首次提出将离散的隐变量结合Transformer结构,应用到通用对话领域。通过引入离散隐变量,可以对上文与回复之间的“一对多”关系进行有效建模。同时,通过利用大规模的与人人对话类似的语料,包括Reddit和Twitter,进行生成模型的预训练,后续在有限的人人对话语料上进行微调,即可以取得高质量的生成效果。PLATO可以灵活支持多种对话,包括闲聊、知识聊天、对话问答等等。而文章最终公布的成绩中,PLATO在三个公开对话数据集上的测试,都取得了新的最优效果。
2. 模型介绍
在PLATO中,离散隐变量可以有K个取值,它的每个取值,是与一个回复中的意图相对应,或者可以理解为多样化的对话动作(Action)。在PLATO的训练中,有2个任务同步进行,且共享网络参数:回复生成和隐变量识别。给定上文和离散隐变量的取值(即确定了回复中的意图),生成任务会尽量最大化目标回复的似然概率。同时,识别任务尽量估计给定上文和目标回复对应的隐变量取值。显然,隐变量的准确识别,可以进一步提升回复生成的质量。
PLATO的网络架构如图1所示,由Transformer Blocks组成。针对多轮对话的输入表示方法,PLATO也进行了独特的设计,每个token的input embedding是由对应的token,role,turn和position embedding相加得到。预训练中同步进行了2个任务 — 回复生成(response generation)和隐变量识别( latent act recognition)。 在回复生成任务中,PLATO借鉴UniLM使用了灵活的注意力机制:对上文进行了双向编码,充分利用和理解上文信息;对回复我们进行了单向解码,适应回复生成的autoregressive特性。在隐变量识别任务中,PLATO使用特殊符号[M]作为输入,收集给定上文和目标回复的信息,用于估计回复意图(即离散隐变量的取值)。
图1 带离散隐变量对话生成预训练的网络架构
PLATO训练使用了三个目标函数(loss function) — negative log-likelihood (NLL) loss,bag-of-words (BOW) loss和response selection (RS) loss,如图1最后一列所示。在文本生成任务中,最常用的是NLL loss,PLATO引入了BOW loss是为了促进离散隐变量的训练。此外,RS可以辅助判断一个回复与上文的相关性。
PLATO的模型由大规模语义预训练模型进行参数初始化,在预训练中,PLATO使用了8.3M Twitter和Reddit对话样本。预训练的PLATO模型以及代码,已经在GitHub上开源(https://github.com/PaddlePaddle/Research/tree/master/NLP/Dialogue-PLATO)。
3. 实验结果及分析
为了验证预训练模型的效果,百度公布的论文在3个公开对话数据集上进行了测试:Persona-Chat,Daily Dialog以及DSTC7-AVSD。Persona-Chat是典型的知识聊天任务:两个人讲述自己信息(persona profiles),并在对话中尽量了解对方;Daily Dialog偏向日常闲聊类型;DSTC7-AVSD是对话式问答,根据视频场景信息,两人进行多轮问答,讨论视频中物体和事件。
在每个数据集上的实验,百度对比了基线方法,以及每个数据集上的SOTA方法。PLATO在Persona-Chat和Daily Dialog上的自动和人工评估结果,如表1所示;PLATO在DSTC7-AVSD上的结果,如表2所示。由这些结果可见,PLATO在各个对话数据上,均超过了当前最优,取得了新的最优效果。
表1 Persona-Chat和Daily Dialog上的自动和人工评估结果
表2 DSTC7-AVSD上的自动评估结果
PLATO也与其他预训练模型进行了对比,在Persona-Chat上的实验结果如表3所示。其中2.2是不使用latent space的对比模型,3.1是完整PLATO模型。通过对比这些结果,可以看出:灵活的注意力机制可以充分利用上文的双向信息(model 1.2 v.s. model 1.3);大规模的Twitter和Reddit语料,显著改善回复生成(group 2&3 v.s. group 1);离散隐变量的引入,则可以进一步提升回复质量(model 3.1 v.s. model 2.2)。
表3 不同预训练模型在Persona-Chat的PPL结果
对于PLATO的定性分析,百度也在表4中提供了一些case。给定一个上文,通过对离散隐变量进行不同赋值, PLATO可以产生多样且都合理的回复。
表4 PLATO模型生成的回复
4. 总结和未来工作
尽管越来越多的工作证明了随着预训练和大规模语料的引入,自然语言处理领域开启了预训练然后微调的范式,但是在对话模型上,大规模预训练还处于初级阶段,需要继续深入探索。百度提出的隐变量空间预训练模型,可能成为端到端对话系统迈上一个新台阶的关键点之一。据悉,百度也在持续优化当前对话模型,或许在不久的将来,更加强大的对话预训练模型会被陆续披露。