背景:tranformer非常吸引人,因为它有非常大的优势。首先它使用的是attention,这个机制是完全并行的,所以它的训练非常快。另外,attention这个机制计算的时候可以考虑整个句子级别的信息,通过给每一词分一个权重,可以捕捉长距离依赖、信息流的流动,所以它性能非常好。但是它也有劣势,在于它的解码端,目前transformer还是依赖于Beam search的解码方式。Beamsearch的解码方式就无可避免只能一个词一个词生成,原先在训练阶段所享受到的并行化加速优势,在解码的时候基本上不存在了。因为解码端利用的依然是self-attention,在进行每一个词计算的时候,必须要对前面所有的词进行动态运算,造成解码的时候效率比较低。
思路:不需要动态的Self-attention机制,也就是不需要给前面每个词分配一个不同的权重。相反,前面每一个词对当前词的预测其权重都是一样的,也就是一个average,认为之前所有单词对当前单词的贡献都是相同的,这样可以处理很长的句子。在注意力层之上使用了一个门限层,让模型选取保留哪些信息遗弃哪些信息,并且在输入层和门限层之间使用残差连接。为了能够并行计算,添加了一个掩码矩阵,为了加速解码,使用动态编程的方法,计算当前状态时只使用前一个状态。
第一层是最简单的Average Layer,通过一个累加平均操作总结之前位置的历史信息。不再使用动态计算注意力权重,而是使用固定的平均权重。第二层是一个Gating Layer。第三层做了一个layer norm。
其中表示Position-wise前向网络,是输入门,是遗忘门,通过该门限层,可以控制可以从先前的上下文中保留多少过去信息以及可以从当前输入
捕获多少新信息。 这有助于模型检测输入向量的相关性。在输入层和选通层之间使用残查连接,然后进行层标准化以稳定输出和梯度的比例。
并行化训练:
给它一个简单的mask矩阵,通过mask矩阵可以实现所有的average操作,这样它的训练依然是并行的。
解码加速:
简单的average运算加上原来的gating layer,在进行真实解码的时候,不需要重复计算,只需要针对下面这个做一个动态的计算,因为前面的结果是平均的,可以直接加起来。
将平均注意力网络应用在神经transformer中:
encoder的计算:
decoder的计算由两个子层组成,第一个子层是平均注意力网络:
第二个子层计算: