Transformer

提出

  • CNNs 易于并行化,却不适合捕捉变长序列内的依赖关系。
  • RNNs 适合捕捉长距离变长序列的依赖,但是却难以实现并行化处理序列。

为了整合CNN和RNN的优势,[Vaswani et al., 2017] 创新性地使用注意力机制设计了Transformer模型。该模型利用attention机制实现了并行化捕捉序列依赖,并且同时处理序列的每个位置的tokens,上述优势使得Transformer模型在性能优异的同时大大减少了训练时间。

特点

Transformer
如图是seq2seq模型和transformer的比较,后者多了:

  1. 注意力机制采用的是多头注意力机制
  2. 基于位置的前馈网络FFN
  3. 相加归一化层add and norm

下面分别进行介绍:

多头注意力机制

Transformer
Transformer
Transformer

基于位置的前馈神经网络

Transformer 模块另一个非常重要的部分就是基于位置的前馈网络(FFN),它接受一个形状为(batch_size,seq_length, feature_size)的三维张量。Position-wise FFN由两个全连接层组成,他们作用在最后一维上。因为序列的每个位置的状态都会被单独地更新,所以我们称他为position-wise,这等效于一个1x1的卷积

与多头注意力层相似,FFN层同样只会对最后一维的大小进行改变;除此之外,对于两个完全相同的输入,FFN层的输出也将相等

Add and Norm

除了上面两个模块之外,Transformer还有一个重要的相加归一化层,它可以平滑地整合输入和其他层的输出,因此我们在每个多头注意力层和FFN层后面都添加一个含残差连接的Layer Norm层。这里 Layer Norm 与7.5小节的Batch Norm很相似,唯一的区别在于Batch Norm是对于batch size这个维度进行计算均值和方差的,而Layer Norm则是对最后一维进行计算。层归一化可以防止层内的数值变化过大,从而有利于加快训练速度并且提高泛化性能
扩展资料:https://zhuanlan.zhihu.com/p/54530247

位置编码

与循环神经网络不同,无论是多头注意力网络还是前馈神经网络都是独立地对每个位置的元素进行更新,这种特性帮助我们实现了高效的并行,却丢失了重要的序列顺序的信息。为了更好的捕捉序列信息,Transformer模型引入了位置编码去保持输入序列元素的位置。

假设输入序列的嵌入表示 XRl×dX\in \mathbb{R}^{l\times d}, 序列长度为ll嵌入向量维度为dd,则其位置编码为PRl×dP \in \mathbb{R}^{l\times d} ,输出的向量就是二者相加 X+PX + P

位置编码是一个二维的矩阵,i对应着序列中的顺序,j对应其embedding vector内部的维度索引。我们可以通过以下等式计算位置编码:
Pi,2j=sin(i/100002j/d) P_{i,2j} = sin(i/10000^{2j/d})
Pi,2j+1=cos(i/100002j/d) P_{i,2j+1} = cos(i/10000^{2j/d})
for i=0,,l1 and j=0,,(d1)/2 for\ i=0,\ldots, l-1\ and\ j=0,\ldots,\lfloor (d-1)/2 \rfloor
Transformer
相当于为序列中每个值添加一个值用来表示位置信息,奇数加cos函数值,偶数加sin函数值

编码器的实现

总体思路就是按照结构图编写一个encoderblock的组成,整个encoder是由n个encoderblock组成的

单个编码器block

Transformer
现在我们来实现整个Transformer 编码器模型,整个编码器由n个刚刚定义的Encoder Block堆叠而成,因为残差连接的缘故,中间状态的维度始终与嵌入向量的维度d一致;同时注意到我们把嵌入向量乘以 d\sqrt{d} 以防止其值过小。

Transformer

解码器

Transformer