---
# System prepended metadata

title: 讨论 2023-05-25

---

讨论 2023-05-25
=
###### tags: `tutorials` `Fudan` `2023`
# 序列生成中的累积误差
今天主要介绍一个序列生成中的问题，累积误差。该问题具体是指随着序列的生成过程变长，模型的误差会逐渐增大，也就是生成的越长，生成的偏差越大。

## 什么是累积误差
我们以前曾经介绍过语言模型的生成过程是自回归的，也就是逐个生成每一个单词，假如我们前文生成的内容逐渐变差，变得不像自然语言，那后续生成的内容可能也会逐步下降。

有些研究探讨了这一问题，https://aclanthology.org/2022.findings-acl.58.pdf (不太推荐)
![](https://hackmd.io/_uploads/H1MPQpjB2.png =500x)
假如文本生成的误差随生成长度线性增加，说明没有累积误差，因为每一步都有误差，所以至少是线性的。而像图中出现了超线性的增长，说明语言模型是存在累积误差的，因为实际误差比每一步增加的误差要多。这类现象也被称之为Exposure Bias


累积误差的成因尚未有严格的定论，一般认为是训练和测试的domain不一致，即模型没有见过生成的文本，所以当模型生成一些训练集没有见过的样本时，会有domain shift的问题，导致生成效果变差。

另一方面，我们也可以认为这是自回归的一种固有误差，因为自回归生成中，每一个新的单词都依赖于之前生成的序列，所以其误差也会被继承。

![](https://hackmd.io/_uploads/HJC7IBnBh.png)

## 累积误差与解码算法也有关系

ExErrAcc可以看作对累积误差的一个估计，而seq-rep-4为4-gram的重复率，rep为单词重复率，wrep为预测错的token的重复率，uniq即单一无二的序列数。
![](https://hackmd.io/_uploads/B1ycHpiSn.png)

有趣的是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，再让他们的输出尽可能一致，作为一种约束。
![](https://hackmd.io/_uploads/Bk4p8Tjrn.png)

### 规整路径

在GPS处理中，一个很常用的技术就是把GPS轨迹规整到路网数据里。同样的，如果我们全部使用惯性导航，那么长路径的误差都是难以容忍的，我们需要把路径规整到一个已知的框架里，即车不能在房顶上开，也不能在河里开。

![](https://hackmd.io/_uploads/H1V49aiS2.png)


这种思路其实在文本生成中也存在，我们需要把生成的内容限定在自然语言的范围里，不能让他自由的无限往下说。目前有一些尝试的工作，比如生成长文本之后，在中途做一次信息总结，比如变成对话状态（用少量结构化的状态概括前文），或者直接把之前的长文做一次摘要。其本质方法是把信息浓缩到一个更小的空间里，然后我们就更容易检查生成内容的合理性。

在早期工作中，还有一种思路来解决这类问题，即生成一段文本，然后在庞大的语料库里检索一段真实文本。用检索到的真实文本替换生成文本。当然这要求语料库有相似的内容，在开放领域不容易，但如果是针对特定任务的，其实是可以做的。