对比学习和文本生成的结合并不是一个新话题。但是,以往的方法大多局限于某些特定的任务场景。例如,在对话场景中,可能需要使用对比学习来区分说话者或说话的主体,以达到更好的表示学习效果。在摘要方面,也有一些作品使用对比学习,通过构造带有事实错误的负样本来增强生成的摘要与原文的一致性。然而,对于更一般的任务(以Transformer的编码器和解码器为例),在机器翻译、摘要、数据到文本生成等各种任务下,如何参考比较学习才是最有效的?为什么要比较研究?这方面的研究相对较少,本文将对此进行探讨。今天的介绍会围绕以下四点展开:动机方法实验讨论01动机我先说说为什么要用对比学习。1.为什么将对比学习应用到文本生成中首先,对比学习是一种很好的表示学习方式,尤其是在CV场景中,对比学习非常流行,在文本生成任务的上下文中,如果能够去构造有意义且对于这个任务有价值的样本可以帮助模型通过不同样本之间的比较来学习更好的意义和表示。其次,最近的研究表明,对比学习是一种有助于缓解暴露偏差问题的新思路。所谓exposurebias是指当前一代框架(多基于最大似然估计进行训练)中测试与训练的不一致性,会损害模型的泛化性能。在训练阶段,解码器只接触到正确的输入,但在测试阶段,模型必须根据自己生成的字符进行预测,从而形成测试和训练之间的偏差。之前已经有很多工作解决这个问题,比较有名的是scheduled-sampling:由于exposurebias是由训练和测试不一致造成的,所以让模型以一定的概率和测试采用相同的机制在训练中。也就是说,用上一步预测的词,以一定的概率来指导下一步的生成。此外,还有一些著名的方法,如基于强化学习、生成对抗网络等。除了令牌级别的监督和最大似然训练目标外,该模型还针对难以区分的问题进行了显式优化客观的。但是,这两种技术的实施都存在一定的困难。如果您不是经验丰富的研究人员,基于强化学习或生成对抗网络的模型可能不如纯MLE模型训练有效。2.应用对比学习可以缓解自回归模型的曝光偏差问题对比学习是如何解决这个问题的?首先回顾一下对比学习的目的。对比学习是在表征上让正例更近,反例更远。在生成的场景中,正负样本的一个非常直观的定义就是把比人类写的质量更高的样本视为正例。以翻译任务为例,人工翻译的结果是正例,然后再找一些其他含有错误的翻译结果是负例。如何减轻暴露偏差?就是在训练阶段将错误样本和正确样本同时暴露给解码器,利用对比学习损失函数让模型学习到正确标签的表示和错误标签的表示。与强化学习和GAN相比,对比学习的一个优势是在训练过程中不存在不稳定问题。3.一种简单的方法查看如何应用对比学习的示例。最简单的方法是在CV上使用SimCLR方法,即正样本是给定人写的目标句子(也称为groundtruth),一批中的其他样本视为负样本。Anchor是生成中输入的源序列。如右图所示,是德英翻译的例子。有德语输入,目标是将其翻译成适当的英语输出。图中绿色方框是人类编写的标准翻译,红色方框是与训练阶段同一批次随机抽样的结果。绿色的是正样??本,其他的是负样本。比较学习损失函数可以使用比较常见的NCE损失:正样本是分子,整个样本集是分母。最终的训练目标是将原来的token-levelNLLloss加入到新的contrastivelearningloss中。在解码阶段,可以使用普通的beam-search算法。4.其他构造正负样本的方法这种方法有一个明显的问题。在对比学习中,最重要的是正负样本对任务是否有意义。可以看出这种方法的负样本质量确实堪忧,这使得正负样本非常容易区分,以至于模型无法学习更好的表达。右图是对区分正负样本难度的分析。Batchsize越大,从中找到正例的概率就越低。红线使用的是T5模型,意味着学习效果更好,区分正负样本的准确率远高于Scratch方法。甚至可以使用对比学习的微调来找到正样本和负样本。这意味着对比学习并不具有挑战性。因此,直接从批次中选择正负样本是不够的。实验中还发现,训练损失函数下降非常快,很难捕捉到更适合这个任务的特征。现在一些相关的研究人员已经做出了一些改进。SSMBA:在离散空间中加入扰动,比如随机masking一些词,使用masked语言模型将那些词预测回来产生新的正样本。Dropout:使用dropout机制类似于SimCSE。groundtruth通过dropout机制两次输入到解码器中,得到的差异表示为一对正样本。CLAPS:在embedding空间中对groundtruth进行扰动,以与原始序列的语义变化大小作为划分正负样本的依据。5.当前基于对比学习的文本生成方法仍然存在瓶颈基于对比学习的文本生成方法仍然存在一系列的瓶颈,尚未发挥其真正的优势。主要有三点:正反例的构建:虽然之前的方法有了一定的改进,但是扰动目标序列并不能反映模型目前可能出现的误差。ContrastiveLearningLossFunction:对比学习损失函数的选择也是有问题的。InfoNCELoss只区分正负样本,而忽略负样本之间的差异。DecodingGoal:简单地使用普通的beamsearch算法意味着训练目标和解码目标之间存在不一致。02Howtosolvetheproblem1.Ourimprovement我们提出了一个新的对比学习框架——CoNT,它可以通过只做三件事来实现对之前对比学习框架性能非常显着的提升。上图是我们模型的概览。左边部分是经典的生成框架,其中原始句子输入到encoder,目标句子输入到decoder进行训练。Zx和Zy分别是编码器和解码器输出的向量表示。第一个改进是使用模型预测的样本。作为比较学习的样本,比如图中的句子,先让模型自己推理,会生成一个句子,概率大约为0.48。同时,由于beamsearch算法,可以对多个输出进行解码,得到另一个句子的概率约为0.53。一般来说,返回这两个输出的句子就足够了,但是在对比学习的情况下,还需要它们的表示。第二个改进是使用triplets的比较损失函数。这里和NCEloss不同的是,只考虑一个正样本,其他都是负样本。我们的做法是做一个相对损失函数。例如,目前有一个模型推理生成的结果,与人工翻译结果相比是负例,但与同一批次的句子相比是正例。通过损失函数可以看出为比较学习目标设计的解码目标,如果模型推理的结果更接近黄金参考的结果,那么它更类似于原始输入的锚点。从图中可以看出,如果只考虑最大似然得分,概率为0.53的句子将是最终结果,但如果再做一个相似度得分,则概率为0.48的句子将是最终结果最终输出。从判断的角度来看,这个结果显然更加准确。这是IWSLT14从德语翻译成英语的句子中的一个直观示例。主要目的是向大家展示同一批次的句子质量与自生成样本质量的对比。这是刚才模型的数学表示。首先,y+和y-分别是正样本和负样本,都来自于模型的分布。接下来,是三胞胎的对比损失函数。将所有对加起来,对于每一对,其损失函数为MarginRankingLoss。在,
