
因为循环神经网络通常是沿着符号输入输出序列的位置来考虑计算,将这些位置与计算时间中的步骤对齐,它们生成一系列隐藏状态
h
t
h_t
ht,作为前一个隐藏状态
h
t
−
1
h_{t−1}
ht−1和位置t的输入的函数。这种固有的顺序让训练示例不能使用并行计算,让序列长度成为了关键,因为容量极限限制了每个batch输入的示例。
因此作者就提出了一种新的模型Transformer,这种模型避免了循环而是完全依赖于注意力机制在输入输出之间绘制全局关系,并且Transformer模型允许并行计算,在机器翻译上也取得突出的成绩。
self-attention在对自己进行编码的时候,每个词都是句子当中的一部分,但是在融合语义信息的时候方法也不是一样的,因为每个词语在其中的权重不同,不仅只考虑自己当前这个词,还要考虑全局的信息。
比如下面这两句话:

第一句话中的it指代的是animal,第二句话中指代的是street,两句话中的it所指代的内容不一样,所以他在编码的时候考虑的权重也是不一样的。

selef-attention的计算方法,结合上图进行分析:
那么这三个矩阵是有什么作用呢?见下图:





通过不同的head得到多个特征表示的,将所有特征拼接到一起,可以通过再一层全连接来降低维度,一般设置8个头。

多头注意力机制的执行过程:

多头注意里机制不同的注意力结果不同,得到的特征向量的表达式有也不同。

多层堆叠
上面是经过一次self-attention得到的结果,随后输出的还是向量,既然是向量那我们还可以继续对他进行一次self-attention,这也就是多层堆叠。

位置信息编码
在self- attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就有些不符合了,我们希望模型能对位置有额外的认识。
本文中的位置编码使用的是余弦周期进行编码的。

层级归一化(layerNormlize)
首先了解一下batch-Normlize,如下图中一个batch有四个数据,然后把一个batch的某一层的特征按照batch的维度,让他均值为0,标出差为1.

这里加上了一个layerNormlize,目的就是让它训练的更稳定更快。

** 残差连接**
因为一个参数经过多层的堆叠之后,进行层级归一化的效果不一定是最完美的,于是就做了2手准备,看看是经过多层堆叠的效果最好呢还是直接经过一个self-attention的效果好,然后对比结果,那个结果好就选择那个,这个就叫做残差连接,其实就是做两手准备。

** Decoder aattention**
解码的过程需要用到解码器的Q去查询编码器中的K和V,总之得把编码器中的训练的信息要用起来。

** mask机制**
Decoder预测结果是基于前面一个词预测下一个词,那么既然是预测下一个词,那就不能提前知道这个词,所有就把他mask掉,相当于遮住,然后让他自己预测。

后面再继续完善