文 | 智商掉了一地
如何让机器生成更接近人类的结果?第一步——停止复读
“人类的本质是复读机”,“重要的事情说三遍!!!”,这些年我们总能听到这样的梗,可是在日常交流中,真的有人会像复读机一样反复说同一句话吗?答案显然是否定的,很少有人会将自己想表达的相同意思反复用同一句话陈述,甚至还有言论称这不属于正常现象。
然而,这种问题却普遍存在于许多大规模预训练语言模型的生成结果中,例如 GPT2 和 BART 虽然在各种文本生成任务上取得了有代表性的结果,但它们往往会因为基于最大化的解码算法(例如贪心搜索)而陷入这种笨笨的句子级循环中,在此背景下,清华叉院近期的一篇论文引起了小编的注意。
他们的工作系统性地研究了大规模预训练语言模型(例如GPT)为什么会在贪心解码时倾向生成重复句子的问题,并通过定量研究回答了以下提问:
为什么会发生句子级的重复?
为什么模型会陷入重复循环?
什么样的句子更容易被重复?
本文的作者通过分析指出,自我强化效应(Self-Reinforcement Effect)是导致重复的核心问题。随后进一步提出了一种简单的方法 DITTO,以在训练阶段纠正模型分布的方法来解决重复问题。实验证明在各种生成解码算法 [greedy, top-p, top-k] 以及生成式摘要任务上都有着显著提高。
该文章已被 NeurIPS 2022 录用,对应的代码随后也将开源。
论文题目:
Learning to Break the Loop: Analyzing and Mitigating Repetitions for Neural Text Generation
论文链接:
https://arxiv.org/pdf/2206.02369.pdf
之前的一些研究结果发现,基于标准最大化解码的模型会陷入冗余的连续重复中,虽然也有基于解码和基于训练的方法来解决生成结果中重复的问题,但模型偏爱句子级重复的原因以及在解码过程中如何发生句子级重复仍不清楚。在此基础上,作者又进行了更为深入的探索,对于用数据集 Wikitext-103 生成的句子与人造的句子进行对比,初步统计如下图所示:
从生成结果的偏好来看,模型对连续句子级的重复强于单词或短语级,而人类语言中的“复读机”情况不太常见,这表明与人类的语言相比,模型生成的结果具有更多连续的句子级重复。因此,在接下来的内容中,作者进一步深入挖掘问题并进行了定量实验,比较重复句中相同 token 出现的概率,以分析重复的根本问题。
通过对不同语料库的定量调查,有以下发现:
模型倾向于提高重复上一个句子的概率。具体来说,即使只有一个句子级的上下文重复,在大多数情况下,当前步骤的重复概率也会增加。造成这种现象的原因可能是模型对它的上下文非常“自信”,当有一个之前的 token 共享同一个句子级的上下文时,模型学会了直接复制 token。
自我强化效应:重复的概率几乎随历史重复次数的增加而单调增加。最后,重复的概率稳定在某个上限值附近。例如在下图中,随着重复次数的增大,其中一些单词出现的概率几乎都随之增加,最后趋于稳定。
初始概率较高的句子通常具有较强的自我强化效应。例如,在下图中,可以发现具有较高初始概率的句子增长得更快,并且可以在多次重复后达到极高的值。此外,具有较高初始似然的句子(如由模型本身用基于最大化的解码算法生成的句子)可能具有更强的自我强化效应。
由此得出,该模型倾向于生成重复结果的原因可能是:基于最大化的解码算法生成前一句的概率相对较高,且模型倾向于进一步增大该句重复的概率。一旦模型生成一个重复句子,则该句之后出现的概率将进一步增加,因为有更多重复共享相同句子级的上下文来支持这个复制的操作。其结果是,由于自我强化效应,模型陷入了这种句子级重复。
为研究重复句子的概率与上下文中先前重复的概率之间的关系,作者定义了几个指标来衡量概率如何随着重复次数的增加而变化,并讨论在解码过程中句子级的重复如何发生。
平均 Token 概率:第n个重复句子 的平均 token 概率有多少。
Token 概率增加率:与 中初始 token 相比, 中 token 增加的概率有多少。
胜率:当 且 称 为胜者。较高的胜率意味着重复更有可能是由基于最大化的解码算法生成的。
通过实验结果,作者对之前提出的三个问题进行了回答:
为什么会发生句子级的重复? 如下图 (b) 所示,在不同语料库中, 高于 90%,这意味着即使只有一个句子级的上下文重复,在大多数情况下重复的概率也会增加。这表明模型有重复前面句子的强烈偏好。因此,模型可能对之前的上下文重复过于自信,并学会了直接复制下一个 token 这一“廉价”捷径。而这与人类语言习惯有很大的差异,人类会尽量避免完整的句子级重复,因为重复的句子在大多数情况下不具有新信息。
为什么模型会陷入重复循环? 如下图所示,随着重复次数的增加,、 和 均单调增加。这意味着,句子级别的重复具有自我强化效应。最后,、 和 收敛于特定的上限值。
什么样的句子更容易被重复? 初始句子概率 较高的句子,具有较强的自我强化效应: 和 增长较快,并在少量重复后达到较高的上限值。 和 越高,基于最大化的解码算法生成的句子重复的可能性越大(生成的句子具有更高的初始似然性)。
根据上述实验,在基于最大化算法的解码过程中,进行如下分析:
先前生成的句子可能性很高,因此更有可能被重复;
对于之前已生成的句子,模型更容易生成重复的句子,因为模型对历史生成的上下文很有信心,并试图在当前生成的上下文中找到提示;
一旦句子重复了几次,由于自我强化效应,模型就会陷入句子级循环。
而随机采样方法(如 top-k 和核采样)的有效性可能取决于:
与基于最大化的解码算法相比,之前生成的句子出现的可能性较低,因此句子被重复的风险较小;
当前 token 是随机生成的,而非以最大概率选择,这可以避免自我强化效应。
为减少重复前面句子的倾向,克服自我强化效应,作者的目标是让模型意识到生成冗余句的概率应当降低。此外,句子级重复次数越多,冗余句出现的概率越低。在本文中提出了一种简单有效的**基于训练的方法——伪重复惩罚法(Pseudo-Repetition Penalization,DITTO)**。先手动地向模型输入重复的句子,然后显式地教模型对抗这种重复。
通过重复从训练语料库中采样的句子来手动构建伪数据,通过将句子 s 重复 N+1 次,构造一个伪重复样本 x。
在这些伪数据上设计了一个重复惩罚损失函数,让模型学会随着句子重复次数的增加,以指数方式衰减重复概率。
在实验中通过微调标准 MLE 基线(平均混合句子级重复惩罚更新和正常 MLE 损失更新)来应用句子级重复惩罚。作者发现,将另一个从训练语料库中随机采样的句子作为前缀附加到伪重复数据 x 上,可以实现更好和更稳定的性能。
在人类语言中会出现必要的词汇和短语级重复(如人名、城市和谚语)。因此模型应能够从给定的前缀中复制这些单词或短语,并增加它们的重复概率。这些有用的重复可以被视作正样本,而本文设置的伪重复数据可以被视为负样本,将它们结合起来训练,模型应学会区分上下文是否有用。因此,尽管本方法的动机是克服句子级重复问题,但也可以提高模型的学习能力和泛化性。与以前的方法设置硬约束来惩罚任何重复不同,本文的训练目标明确地编码了模型应该倾向于避免过度重复的直觉,因此也可以减轻过度惩罚的弊端。
模型的评价指标有:
MAUVE:通过近似计算模型生成序列分布与人类语言之间的 KL 散度来衡量模型生成的文本与人类语言的接近程度。MAUVE 的范围是从 0 到 1。MAUVE得分越高表示生成的序列越好。
困惑度(Perplexity)和 准确率(Accuracy):给定前缀和真正的下一个 token,使用困惑度和下一个 token 预测准确率来衡量语言建模能力。
重复(Repetition):计算生成序列中重复的 4-gram 的部分(Repetition-4)以衡量短语级重复,定义为 和平均完成次数。同样地,使用重复句子的部分(Repetition-Sen)来衡量句子级的重复,定义为 。
如下表所示,DITTO 不仅能减少重复,还可以帮助模型提升语言建模和生成质量。表中 DITTO 可以显著减少短语级和句子级的重复,并达到0.77 的最佳 MAUVE 分数。虽然 UL-token+seq 可以生成更少的重复,但它对 MAUVE 衡量的模型总体质量的改进是有限的,因为它的生成通常与前缀无关。与标准基线 MLE 相比,其他模型通过牺牲困惑度来减少重复,而 DITTO 则实现了更低的困惑度和更高的准确率。
基于采样的解码算法如 top-k 和核采样 top-p 广泛应用于各种场景和大型模型。实验也证实了 DITTO 与这些流行的随机解码策略是兼容的。在下表中的结果可以看出,与基线 MLE 相比,使用 DITTO 训练的模型可以减少重复,并在重复度量上达到与人类最接近的结果。对于生成序列的质量,DITTO 在 top-k/top-p 时达到最高的 MAUVE 为0.96。
实验还进行了成对的众包评估,以判断与其他基线相比几代 DITTO 的质量。对于每一对方法,模型基于来自 Wikitext-103 测试集的相同 100 个随机前缀生成文本,评估者被要求独立判断哪一代在语法、相关性、连贯性和信息量方面更好。如下表所示,在不同的解码策略上,DITTO 始终显著优于其他模型。
如前所述,句子级重复具有自我强化效应,而这也是句子级重复的核心问题。用不同的训练方法对模型进行进一步的研究,如下图所示,分析如下:
在 UL 和 SG 中 、 和 几乎是单调增长的,说明这些基于训练的方法都没解决自我强化效应。
当使用 DITTO 训练模型时,随着重复次数的增加,这些指标迅速下降,说明 DITTO 在克服自我强化效应方面是有效的。
接下来进一步对定向生成式摘要任务 CNN/DailyMail 进行实验:给定一个输入文档,模型生成几个句子作为摘要。作者采用最先进的 BART-large 模型作为基线,利用DITTO训练微调模型以获得最佳验证困惑度。对于 DITTO 训练,给定一个文档及其摘要,首先从摘要中随机抽样一个句子,然后重复它,直到达到解码器模型的最大摘要长度,同时保持文档不变,从而构造伪数据。
作者用基于F1的ROUGE评分来评估模型的性能,如下表所示,DITTO 训练方法始终优于 UL 和 SG ,也优于其他一些基线。结果还表明,DITTO 与 n-gram blocking(一种基于解码的减少重复的方法)兼容,这也进一步证明了 DITTO 方法的通用性。
如下图 (a) 和 (b) 所示,在不同解码长度的约束下,使用 DITTO 训练的模型一致且显著优于使用 MLE 训练的模型,体现了 DITTO 方法的有效性和鲁棒性。
为更好地使用和理解 DITTO,作者还进行了两个超参数的研究:伪数据和实际数据的混合比 和惩罚因子 。如上图(c)所示,当 时,模型在两个数据集上均达到最佳性能。因此建议将 DITTO 更新和 MLE 训练损失更新等量混合。
至于 ,可以观察到在不同任务中的最优值是不同的。在开放式生成任务 Wikitext-103 中优选 的较强惩罚。然而,在摘要任务中 的温和惩罚效果较好。由此推测,在具有更多自由度的生成任务(如开放式生成)中重复问题更严重。
尽管前人的工作中已经意识到生成任务中重复的端倪,但本文首次系统地定量研究了为什么基于最大化解码的语言模型更喜欢连续的句子级重复,并通过分析表明,了解到导致重复的核心问题在于重复之前句子的倾向和自我强化效应。作者通过构建伪数据,并教模型学习随着句子重复次数的增加而逐渐降低重复概率,提出了一种简单有效的方法 DITTO。在 Wikitext-103 开放式生成任务和 CNN/DailyMail 摘要任务上的实验证明了方法的有效性。如论文审稿人所说,这个方法也将对该领域未来的工作提供一定程度的贡献,即如何在不损害语言模型建模能力的前提下克服语义重复。
加入卖萌屋NLP、CV、搜推广与求职讨论群