总结自acl2019最佳长论文《Bridging the Gap between Training and Inference for Neural Machine Translation》
背景:
在训练神经翻译模型的时候,实际译文被用作上下文。在使用神经翻译模型推理时,整个序列是由结果模型自己生成的,因此由模型生成的前一个单词作为上下文提供。因此,训练和推理时的预测词是从不同的分布中提取的,即从数据分布中提取,而不是从模型分布中提取。这种差异被称为暴露偏差,导致了训练和推断之间的差距。随着目标序列的增长,误差在序列之间积累,模型必须在训练时从未遇到过的条件下进行预测。直观地说,为了解决这个问题,模型应该在它在推理时所面临的相同条件下进行预测训练。
数据准备:
在数据集中,原序列表示为,实际译文表示为
编码器:
用ei表示xi的嵌入向量 ,用一个双向的GRU来得到两个隐状态序列,
添加注意力:
计算目标单词y*j和第i个原单词的相关系数
解码器:
计算目标隐状态
计算目标单词的概率分布
其中g是一个线性变换
主要方法框架:
作为上下文输入的单词有两种选择:实际单词(原文是ground truth word,gtw)或之前预测的单词(称为oracle word,ow),两种单词是以概率p随机选择的
方法包含以下3个部分:
1. 选择ow
2. 以概率p选择实际单词或以概率1-p选择ow
3. 将选择的单词带入6,7式预测下一个单词
选择ow:
选择ow的方式有两种:句子级ow和单词级ow
1. 单词级ow
计算各ow候选词的概率,选出概率最大的一个
2. 句子级ow
1)在每个batch的所有句子上进行beam查找,得到k个最佳翻译结果
2)在查找过程中添加Gumbel噪声
3)采用BLEU句子级度量来评估翻译结果,选择得分最高的作为oracle句子(os),记为
句子级ow可以从os中对应位置选出
强制编码:
句子级ow的一个问题是无法保证和实际译文等长,这样不能进行BLEU评分,因此需要采用某种方法使os与实际译文等长,做法如下:
1)如果产生译文的过程中<EOS>为下一单词的概率最大且此时译文长度小于实际的,则跳过<EOS>选择第二个单词
2)如果产生译文的过程译文长度超过了实际的但<EOS>还不是下一单词的概率最大的,则直接选择<EOS>作为下一单词
衰减采样:
对于之前提到的选择实际单词还是ow作为上下文输入的概率p,应有以下特征:
1)在训练初期,为了避免收敛慢或陷入局部收敛,应尽量选择实际单词作为输入
2)在训练后期,为了模拟推理时遇到的情况,应尽量选择ow作为单词输入
因此,可以这样选择p,其中e是训练轮次,mu是超参数
训练:
选出yj-1后,就可以根据6,7,8,9式推算出yj,损失函数如下
N是数据集中句子的数量,|yn|是第n个实际句子的长度,Pnj是第j步中预测的第n个句子的概率分布,Pnj[ynj]是第j步生成实际单词的概率