1、回顾
传统的序列到序列的机器翻译大都利用RNN或CNN来作为encoder-decoder的模型基础。实际上传统机器翻译基于RNN和CNN进行构建模型时,最关键一步就是如何编码这些句子的序列。往往第一步是先将句子进行分词,然后每个词转化为对应的词向量,那么每个句子都可以由这些词向量来构造对应的句子的序列表示向量。
(1)RNN递归进行:
不管是LSTM、GRU还是SRU,缺点是无法并行计算,速度慢,并且RNN无法特别好地学习到全局的信息,仍然无法彻底解决长距离依赖问题。
(2)CNN卷积:
窗口式遍历,比如卷积核大小为3,那么它的窗口就是3,可以捕获:
诸如其他卷积也一样可以捕获到相对应核大小的窗口信息,还有一种空洞卷积可以使跨度增大但有间隔的方式去捕获更多的全局信息。并且CNN方便并行。
2、Transformer
纯注意力机制可以一步到位可以获得全局信息,具体方案:
上图结构在原论文中是如下复述的:
Encoder: 编码器由6个相同的层堆叠在一起,每一层又有两个支层。第一个支层是一个多头的内部注意机制,第二个支层是一个简单的全连接前馈网络。在两个支层外面都添加了一个residual的连接,然后进行了layer nomalization的操作。模型所有的支层以及embedding层的输出维度都是dmodel = 512.
备注:
剩余(residual)连接等同于“跳过连接”。它们被用来允许梯度通过网络直接流动,而不通过非线性激活函数。非线性激活函数,本质上是非线性的,导致梯度爆炸或消失(取决于权重)。
跳过连接从概念上形成了一个“总线”,它沿着网络向右流动,反过来,梯度也可以沿着它向后流动。
每个网络层的“块”,如conv层、poolings等,在总线上的某个点上使用值,然后在总线上添加/减去值。这意味着块确实会影响梯度,反过来也会影响正向输出值。
现在,用一个直接连接替换其中一个块。如果你喜欢,可以用一个标识块替换,或者根本就没有。这是一个剩余/跳过连接。实际上,剩余的conv单元可能是两个系列单元,中间有一个激活层。
Decoder: 模型的解码器也是堆叠了六个相同的层。不过每层除了编码器中那两个支层,解码器还加入了第三个支层,如图中所示同样也用了residual以及layer normalization。
3、Attention层
Attention层分成了一下两种形式:
(1)Multi-Head Attention