文章由参考文章重新组合而来。
暴露偏差又叫Exposure Bias,是由Teacher Forcing 导致的。
Teacher Forcing
Teacher Forcing 是一种用于序列生成任务的训练技巧,与Autoregressive模式相对应,这里阐述下两者的区别:
- Autoregressive 模式下,在 timesteps t decoder模块的输入是 timesteps t−1 的输出 y t − 1 y_t−1 yt−1 。这时候我们称 y t y_t yt−1 为当前预测步的 context;
- Teacher-Forcing 模式下,在 timestep t decoder模块的输入是 Ground-truth 语句中位置的 y t ∗ − 1 y_t^*−1 yt∗−1 单词。这时候我们称 y t ∗ − 1 y_t^*−1 yt∗−1 为当前预测步的 context;
更具体的,我们可以看下图的例子:
Teacher-Forcing 技术之所以作为一种有用的训练技巧,主要是因为:
- Teacher-Forcing 能够在训练的时候矫正模型的预测,避免在序列生成的过程中误差进一步放大。
- Teacher-Forcing 能够极大的加快模型的收敛速度,令模型训练过程更加快&平稳。
- Teacher-Forcing 技术是保证 Transformer 模型能够在训练过程中完全并行计算所有token的关键技术。
Teacher Forcing 的问题
由于训练和预测的时候decode行为的不一致, 导致预测单词(predict words)在训练和预测的时候是从不同的分布中推断出来的。而这种不一致导致训练模型和预测模型直接的Gap,就叫做 Exposure Bias。
除了常见的 Exposure Bias 问题之外,今年的ACL2019 最佳paper中还指出好几个存在的问题:
- Teacher-Forcing 技术在解码的时候生成的字符都受到了 Ground-Truth 的约束,希望模型生成的结果都必须和参考句一一对应。这种约束在训练过程中减少模型发散,加快收敛速度。但是一方面也扼杀了翻译多样性的可能。
- Teacher-Forcing 技术在这种约束下,还会导致一种叫做 Overcorrect(矫枉过正) 的问题。例如:
Beam Search
事实上,我们真正做题的时候并不总是这样子,假如我们卡在某步无法确定时,我们就遍历几种选择,然后继续推下去,看后面的结果反过来辅助我们确定前面无法确定的那步。对应到Seq2Seq来说,这其实就相当于基于Beam Search的解码过程。
对于Beam Search,我们应该能发现,beam size并不是越大越好,有些情况甚至是beam size等于1时最好,这看起来有点不合理,因为beam size越大,理论上找到的序列就越接近最优序列,所以应该越有可能正确才对。事实上这也算是Exposure Bias的现象之一。
简单例子
我们来举一个简单例子。设序列长度只有2,候选序列是(a,b)和(c,d),而目标序列是(a,b),训练完成后,模型的概率分布情况为
如果beam size为1,那么因为p(a)>p©,所以第一步只能输出a,接着因为p(b|a)>p(d|a),所以第二步只能输出b,成功输出了正确序列(a,b)。但如果beam size为2,那么第一步输出(a,0.6),(c,0.4),而第二步遍历所有组合,我们得到
所以输出了错误的序列(c,d)。
那是因为模型没训练好吗?并不是,前面说过Softmax加交叉熵的目的就是让目标的得分最大,对于第一步我们有p(a)>p©,所以第一步的训练目标已经达到了,而第二步在a已经预先知道的前提下我们有p(b|a)>p(d|a),这说明第二步的训练目标也达到了。因此,模型已经算是训练好了,只不过可能因为模型表达能力限制等原因,得分并没有特别高,但“让目标的得分最大”这个目标已经完成了。
对策
从上述例子中读者或许可以看出问题所在了:主要是p(d|c)太高了,而p(d|c)是没有经过训练的,没有任何显式的机制去抑制p(d|c)变大,因此就出现了“最优序列并不是目标序列”的现象。
看到这里,读者可能就能想到一个朴素的对策了:添加额外的优化目标,降低那些Beam Search出来的非目标序列不就行了?事实上,这的确是一个有效的解决方法,相关结果发表在2016年的论文《Sequence-to-Sequence Learning as Beam-Search Optimization》。但这样一来几乎要求每步训练前的每个样本都要进行一次Beam Search,计算成本太大。还有一些更新的结果,比如ACL 2019的最佳长论文《Bridging the Gap between Training and Inference for Neural Machine Translation》就是聚焦于解决Exposure Bias问题。此外,通过强化学习直接优化BLEU等方法,也能一定程度上缓解Exposure Bias。
然而,据笔者所了解,这些致力于解决Exposure Bias的方法,大部分都是大刀阔斧地改动了训练过程,甚至会牺牲原来模型的训练并行性(需要递归地采样负样本,如果模型本身是RNN那倒无妨,但如果本身是CNN或Transformer,那伤害就很大了),成本的提升幅度比效果的提升幅度大得多。
构建负样本
纵观大部分解决Exposure Bias的论文,以及结合我们前面的例子和体会,不难想到,其主要思想就是构造有代表性的负样本,然后在训练过程中降低这些负样本的概率,所以问题就是如何构造“有代表性”的负样本了。这里给出笔者构思的一种简单策略,实验证明它能一定程度上缓解Exposure Bias,提升文本生成的表现,重要的是,这种策略比较简单,基本能做到即插即用,几乎不损失训练性能。
方法很简单,就是随机替换一下Decoder的输入词(Decoder的输入词有个专门的名字,叫做oracle words),如下图所示:
其中紫色的[R]代表被随机替换的词。其实不少Exposure Bias的论文也是这个思路,只不过随机选词的方案不一样。笔者提出的方案很简单:
1、50%的概率不做改变;
2、50%的概率把输入序列中30%的词替换掉,替换对象为原目标序列的任意一个词。
也就是说,随机替换发生概率是50%,随机替换的比例是30%,随机抽取空间就是目标序列的词集。这个策略的灵感在于:尽管Seq2Seq不一定能完全生成目标序列,但它通常能生成大部分目标序列的词(但顺序可能不对,或者重复出现同一些词),因此这样替换后的输入序列通常可以作为有代表性的负样本。对了,说明一下,50%和30%这两个比例纯粹是拍脑袋的,没仔细调参,因为生成模型调一次实在是太累了。
对抗训练
思考到这里,我们不妨再“天马行空”一下:既然解决Exposure Bias的思路之一就是要构造有代表性的负样本输入,说白了就是让模型在扰动下依然能预测正确,而前些天我们不是才讨论了一种生成扰动样本的方法吗?不错,那就是对抗训练。实验表明通过往baseline模型里边加入对抗训练,可以提升生成效果。
参考
https://zhuanlan.zhihu.com/p/93030328
https://spaces.ac.cn/archives/7259