神经翻译笔记5扩展a. 序列到序列模型解码的二三事
本章(即神经翻译笔记5)主要围绕编码器解码器模型(这个名词与序列到序列模型混用,本章内不再赘述)展开,在上一节的核心知识点里,已经介绍了解码器的主流解码过程——集束搜索。这一解码方法得到了非常广泛的应用,在机器翻译领域已经成为了标配。但是,该方法也存在两个问题
- 难以控制句子长度
- 难以控制句子多样性。这一点对机器翻译问题不大(但是从后面的讲述中可以看到,如果能在这点上做出改进,也可以通过其它途径提升翻译质量),但是序列到序列模型并非只用于机器翻译领域,在自然语言处理的其它领域也都有所应用。例如在会话领域,多样性就是关注的一个重点,此时集束搜索更难以满足人们的要求
本节将就解码的这些问题做展开,介绍一些在集束搜索上做的扩展工作。其中大部分都来自于两大神经翻译框架fairseq和OpenNMT-tf提供的功能
惩罚机制
在神经翻译出现后的第一篇有影响力的系统论文[GNMT2016]中,Google介绍了他们对解码器引入的两个额外项,分别为覆盖度惩罚项(coverage penalty)和长度归一项(length normalization, 文章里的记号也可以解读为长度惩罚项length penalty),其初衷是让解码器产生长度更长的句子,同时尽量覆盖源句。假设原先集束搜索时每一步的打分函数为 s ( Y ∣ X ) = log ( P ( Y ∣ X ) ) {\rm s}(Y|X) = \log (P(Y|X)) s(Y∣X)=log(P(Y∣X)),现在则修改为
s ( Y , X ) = log ( P ( Y ∣ X ) ) / l p ( Y ) + c p ( X , Y ) l p ( Y ) = ( 5 + ∣ Y ∣ ) α ( 5 + 1 ) α c p ( X , Y ) = β ∑ i = 1 ∣ X ∣ log ( min ( ∑ j = 1 ∣ Y ∣ p i , j , 1 ) ) \begin{aligned} {\rm s}(Y,X) &= \log (P(Y|X)) / {\rm lp}(Y) + {\rm cp}(X, Y) \\ {\rm lp}(Y) &= \frac{(5+|Y|)^\alpha}{(5+1)^\alpha}\\ {\rm cp}(X, Y) &= \beta \sum_{i=1}^{|X|}\log\left(\min\left(\sum_{j=1}^{|Y|}p_{i,j}, 1\right)\right) \end{aligned} s(Y,X)lp(Y)cp(X,Y)=log(P(Y∣X))/lp(Y)+cp(X,Y)=(5+1)α(5+∣Y∣)α=βi=1∑∣X∣log⎝⎛min⎝⎛j=1∑∣Y∣pi,j,1⎠⎞⎠⎞
其中 p i , j p_{i,j} pi,j是解码器生成的第 j j j个目标单词与输入句第 i i i个源单词计算得出的注意力概率。这里对cp函数稍作解释:从宏观、抽象的角度看,对每个 i , 1 ≤ i ≤ ∣ X ∣ i, 1 \le i \le |X| i,1≤i≤∣X∣计算一个值,取log并求和,其实暗合了信息论的计算方法,可以大致解读为该公式计算了源句单词生成目标句所有单词能力的信息。更具体地拆开说,在解码的每一步,对每个源单词 i i i,cp都会计算其与每个已经生成的单词 j j j的注意力概率 p ( i , j ) p(i,j) p(i,j)。如果已经解码出了一个跟 i i i意思一样的单词,那么会有一个很大的 p ( i , j ) p(i,j) p(i,j)出现,使得所有注意力概率求和以后很可能超过1,进而 min ( ∑ p , 1 ) = 1 , log 1 = 0 \min(\sum p, 1) = 1, \log 1 = 0 min(