讨论 2023-05-25 = ###### tags: `tutorials` `Fudan` `2023` # 序列生成中的累积误差 今天主要介绍一个序列生成中的问题,累积误差。该问题具体是指随着序列的生成过程变长,模型的误差会逐渐增大,也就是生成的越长,生成的偏差越大。 ## 什么是累积误差 我们以前曾经介绍过语言模型的生成过程是自回归的,也就是逐个生成每一个单词,假如我们前文生成的内容逐渐变差,变得不像自然语言,那后续生成的内容可能也会逐步下降。 有些研究探讨了这一问题,https://aclanthology.org/2022.findings-acl.58.pdf (不太推荐)  假如文本生成的误差随生成长度线性增加,说明没有累积误差,因为每一步都有误差,所以至少是线性的。而像图中出现了超线性的增长,说明语言模型是存在累积误差的,因为实际误差比每一步增加的误差要多。这类现象也被称之为Exposure Bias 累积误差的成因尚未有严格的定论,一般认为是训练和测试的domain不一致,即模型没有见过生成的文本,所以当模型生成一些训练集没有见过的样本时,会有domain shift的问题,导致生成效果变差。 另一方面,我们也可以认为这是自回归的一种固有误差,因为自回归生成中,每一个新的单词都依赖于之前生成的序列,所以其误差也会被继承。  ## 累积误差与解码算法也有关系 ExErrAcc可以看作对累积误差的一个估计,而seq-rep-4为4-gram的重复率,rep为单词重复率,wrep为预测错的token的重复率,uniq即单一无二的序列数。  有趣的是Beam Search和Greedy会让模型更快的偏离训练集分布,造成更明显的累积误差。这和我们之前介绍过的typical sampling有类似的观点,即模型认为高概率的序列其实并不对应真实预料中的高概率序列。 ## 如何改进 ### Scheduled Sampling 最朴素,也是最常用的方法,在训练开始阶段,全部使用真实预料训练,随着训练时间增加,逐渐增加一些模型生成的序列参与训练。 假如真实预料是 $D_r$,模型生成的语料是$D_\theta$,一开始的loss是$L(\hat{y}, y\sim D_r)$,而后变成 $L(\hat{y}, \mathrm{concat}(y_1 \sim D_\theta, y_2 \sim D_r))$ 但这个方法其实局限性很大,我们可以让模型填补几个token,这样后续的真实预料还可以接上,但如果模型填补的多了,很可能后续预料就接不上了。其实本质问题是只靠行为模仿是比不上有一个真正的reward model。在行为模仿的框架下,我们始终无法准确评价一个探索是好的还是坏的。 ### R-drop 为了让模型更鲁棒,一种通用的做法是dropout,而其中有一种方法可以更好的让模型适应不同的序列,即把一个样本输入进模型多次,每次用不同的dropout mask,再让他们的输出尽可能一致,作为一种约束。  ### 规整路径 在GPS处理中,一个很常用的技术就是把GPS轨迹规整到路网数据里。同样的,如果我们全部使用惯性导航,那么长路径的误差都是难以容忍的,我们需要把路径规整到一个已知的框架里,即车不能在房顶上开,也不能在河里开。  这种思路其实在文本生成中也存在,我们需要把生成的内容限定在自然语言的范围里,不能让他自由的无限往下说。目前有一些尝试的工作,比如生成长文本之后,在中途做一次信息总结,比如变成对话状态(用少量结构化的状态概括前文),或者直接把之前的长文做一次摘要。其本质方法是把信息浓缩到一个更小的空间里,然后我们就更容易检查生成内容的合理性。 在早期工作中,还有一种思路来解决这类问题,即生成一段文本,然后在庞大的语料库里检索一段真实文本。用检索到的真实文本替换生成文本。当然这要求语料库有相似的内容,在开放领域不容易,但如果是针对特定任务的,其实是可以做的。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up