前段时间有读者留言『怎么看最近的platoxl』,那么就 安!排!
PLATO是百度Siqi Bao等人在2020年-2021年针对NLP对话领域提出的一系列预训练模型,具体包括PLATO,PLATO-2,PLATO-XL,前两篇分别发表在ACL2020和ACL-IJCNLP2021,PLATO-XL则是今年9月在arxiv上预印。
大规模预训练模型BERT、XLNet等在大量的广泛语料上训练,在下游任务上取得了突破性的进展,其证明了预训练—微调框架的有效性。
但是在对话系统上,由于对话语料不同于常规语料,缺少这样大规模的预训练模型。因此PLATO系列利用了大规模的对话语料,对对话系统进行训练,从PLATO到PLATO-XL,用的数据越来越多,模型大小也越来越大。之前开放PLATO的微信体验机器人,也着实让它又火了一遍。
那么本文就来梳理下PLATO家族,具体涉及到的文章链接如下:
PLATO系列也在github上开源了,只不过用的是paddlepaddle
PS:我始终没找到为什么这个模型叫PLATO,因为它说话像哲学家?
想了一下,先把三个模型的概览给放在这儿,让大家看起来更方便一些:M=10^6, B=10^9
模型 | 语言 | 模型大小 | 语料量 |
---|---|---|---|
PLATO | 英文 | 132M | 8.3M |
PLATO-2 | 英文 | 1.6B | 684M |
PLATO-2 | 中文 | 1.6B | 1.2B |
PLATO-XL | 英文 | 11B | 811M |
PLATO-XL | 中文 | 11B | 1.2B |
三个动机与对应方案:
一方面用BERT进行初始化;另一方面,没啥好说的,利用了大量Reddit和Twitter的数据,来做对话的文本,进行第二次的训练
对方的文本是完全可见的(可以用双向模型建模),要回答的文本时单向生成的(用单向模型建模)。因此采用了Unified Language Model的形式,具体如下图中的Seq-to-Seq LM:
即seg1能看见seg1的所有,不能看见seg2;seg2能看见seg1的所有,能单向看见自己的历史。这样做就能完全利用对方的文本,并单向生成自己的文本。
PS:有兴趣的小伙伴可以参考unified LM原文
对话本来就没有标准的回答,需要个性化。如果不进行个性化的后果是,回答没有任何信息量,让人没有交谈的兴趣。这个我的理解是不个性化,网络学到的就是一种平均的表达,他把不同人都会表达的意思表达了,但是十分无聊。
一对多映射也是作者本文的重点。作者首先指明对话中的三要素:对话内容(dialogue context)、回应(response)和隐变量。其中隐变量建模成一个K维的类别向量。这三要素之间是什么关系呢,下面这张图做了说明:
对话内容和回应能够反映隐变量,对话内容和隐变量能够决定生成的回应。这就像讲相声,郭德纲先说了一段,要是你听到后一段的内容,根据风格就能猜出这搭档是谁,要是你知道搭档是谁,那也能做好心理准备接下来的内容是什么风格。所以啊,这又是一个鸡生蛋蛋生鸡的故事。针对这种问题,其实也没什么好的解决方案,作者采用的方法就是在一个batch上跑3遍(OMG!),如下图
第一遍用正确的回答生成隐变量的概率(图片右下角);
第二遍随机采样一个非本对话内容的回答,和第一遍的比较去训练一个回答比较器(RS)(图片右下角),让其发现第一遍的回答优于第二遍,损失函数为基于交叉熵的损失;
第三遍再用隐变量的概率采样得到隐变量让后生成回答,与原回答比较计算基于自回归的损失函数NLL和非自回归损失函数BOW。
作者在8张V100上训练了3.5M步(一般实验室还支撑的起)。
在推断时,对每一个隐表达进行推断,然后用回答比较器判断哪一个回答最优。
额外提一嘴模型的输入包括
在我看来角色embedding和轮数embedding有点像,作者也在不断调整,PLATO-XL输入就发生了相应的变化。
作者分别在三个下游数据集上进行了finetune并测试。这三个数据集分别为
实验结果如下图所示
提一个我观察到的比较有趣的现象。不使用隐变量(Our w/o Latent)其实在BLEU上表现更好(也就是与“正确”回答更像),但是多样性也差很多(Distinct-1/2)。这样看来,用隐变量的方法达到了目标,回答更加有个性了,但是也牺牲了BLUE的性能。
PLATO-2相比于PLATO主要想解决的问题是在更大规模的预料上(684M vs. 8M)训练更大规模的网络(作者分别整了1.6B、314M、93M vs 132M的模型)。
值得注意的是PLATO中作者是用BERT进行模型初始化的,而这篇文章没有提及,我默认他是从头开始训练(看了一下代码,应该确实没有)。没有采用BERT进行初始化+更大的模型增大了模型训练的难度。因此作者采用了课程学习的思路(Curriculum Learning),先不采用隐变量,进行one-to-one的粗训练,然后再接上隐变量进行精细化训练,第二阶段的训练方法基本和PLATO一致。
主要的实验结果在下面两张表格中
这里作者采用了人工打分(Human Evaluation)和自动多样性打分(Distinct-1/2)。表格1的self-chat是自己和自己对话,结果主要有三件事:
表格2中自动多样性打分劣于小冰的原因作者解释为:小冰可以进行检索得到更多丰富的内容。
作者参加了DSTC9这个比赛(2021年),在三个赛道上都取得了第一名的成绩。
作者在这里额外对回答选择模块(response selection)进行了对比实验,结果如下图
表格中三行的结果分别是前向、后向和选择打分相比于人工打分的不同准确率,可以看到选择打分的优势十分明显。
PLATO-XL相比于PLATO-2,数据更多(811M vs. 684M),模型更大(11B vs. 1.6B)。作者在这篇文章里返璞归真,抛弃了之前的隐变量和课程学习的方法,直接训练。只不过在训练时加入了Multi-Party Aware Pre-training。
如果大家还有印象的话,在PLATO中,除了token embedding和positional embedding,作者还采用了role embedding(角色表达)和turn embedding(轮数表达)。
而Multi-Party Aware Pre-training中的Role embedding可不像PLATO中只有A和B,因为从Reddit上爬取的数据不可避免地会存在多个用户对同一个对话地回应。
如上图右所示,Role embedding让response编码成角色A,从右到左地新角色依次为B、C、D。Type embedding则是对context和response进行了编码。
结果上依然和之前的PLATO-2进行了对比,
看来隐变量这些方法在大规模数据上也被超越了(笑。而且作者和商业引擎进行了对比,
这个才是最强的地方。分数时0-2分,可以看到很多指标要么接近于2,要么就接近于0了。作者在一些下游任务上也finetune后测试,也是取得了SOTA的结果。
三个模型各自的亮点:
码字不易,欢迎点赞、收藏与交流探讨~
[1]
PLATO: Pre-trained Dialogue Generation Model with Discrete Latent Variabl: https://aclanthology.org/2020.acl-main.9.pdf
[2]
PLATO-2: Towards Building an Open-Domain Chatbot via Curriculum Learning: https://aclanthology.org/2021.findings-acl.222.pdf
[3]
PLATO-XL: Exploring the Large-scale Pre-training of Dialogue Generation: https://arxiv.org/pdf/2109.09519.pdf
[4]
Unified Language Model Pre-training for Natural Language Understanding and Generation: https://arxiv.org/pdf/1905.03197.pdf
- END -