Transformer原理

综述

Transformer是一种用于序列的神经网络模型,相比起RNN和LSTM,Transformer可以解决RNN和LSTM无法完全解决的长期依赖问题。Transformer首先会将输入序列通过编码器转成高阶特征的形式,然后编码器的输出作为解码器的输入,通过解码器的解码操作得到输出序列。

输入层

Transformer的输入层由两个向量组成,分别是词向量和位置向量

词向量

词向量由独热编码乘上系数矩阵获得,使用Embedding层

位置向量

位置向量有两种实现方式,一种是利用确定性的位置编码,即位置编码一经决定不再改变;另一种是使用位置的独热编码乘上一个可学习的参数矩阵获得,这种方法的位置编码是可以根据任务自动调整。第一种方法可以很好地应对测试集的序列长度大于训练集的序列的情况,而第二种方法可以很好地根据任务调整合适的位置编码

编码器(x6)

编码器由6个编码层组成,每个编码层由两个子层构成:自注意力层和前向传播层。每一层的计算都使用到layer normalization和skip-connection,即输入为$X$,中间经过的作用为函数$f$,则真正的输出$Y$为:

自注意力(x8)

自注意力层的作用是计算输入序列自己对自己的注意力,作用是分析获得输入序列内部的依赖关系,由于输入序列自己对自己的全连通的,所以无论多长的依赖都可以计算获得。自注意力层使用了多头注意力机制,即对输入序列独立计算8次注意力,每次注意力都会关注到序列不同的依赖关系,过程如下:
(1) 输入序列为X,三个参数矩阵为$Q_w$,$K_w$,$V_w$
(2) 计算得到$Q=X\cdot Q_W$,$K=X\cdot K_W$,$V=X\cdot V_w$
(3) 计算注意力:$ attn=softmax(\frac{QK^T}{\sqrt{d_k}}) $
(4) 计算加权和得到输出:$A=attn\cdot V$
(5) 8次独立计算上述过程,将8次输出拼接在一起并左乘矩阵$W_0$加上偏置项$b_0$使得维度等于输入序列$X$的维度,得到总输出$f(X)$

前向传播

(1) 自注意力层的输出为$X$,作为这一层的输入
(2) 得到输出:$FFN=max(0,XW_1+b_1)W_2+b_2$

解码器(x6)

解码器和编码器很多地方是一样,有几处细节不同

带掩码的自注意力(x8)

自注意力层比起编码器的自注意力层,加上了一个掩码层,使得过去的输入不会受到未来的输入的影响。因为解码器是按顺序生成序列的,所以未来是不会影响过去的,只能由过去单向影响未来,即计算注意力时,只能计算过去对未来的注意力。

编码-解码注意力(x8)

计算完输出序列的自注意力后,还需要计算编码器的输出序列对解码器的输入序列的注意力,注意力的计算方式和自注意力相同,这一层的注意力计算不需要掩码层。

前向传播

与编码器相同