Transformer论文的地址:https://arxiv.org/pdf/1706.03762.pdf
Transformer代码的地址:personal/transformer · GitHub
左侧的是输入,包含有N个编码器Encoder(这N个编码器的结构都是相同的,参数不同,解码器也是一样的道理,但是编码器和解码器是不一样的)
右侧的是输出,包含N个解码器Decoder
输入
1、输入部分
1.1Embedding:
将词语或句子表示为高维空间中的向量,用这个向量来表示这个词或句子
1.2 Position Encoding:
RNN:循环神经网络(RNN)的 timesteps 共享一套参数,可以使网络可以学习捕捉序列中的模式,并在不同的时间步上应用相同的规律。RNN 把上一时刻的输出 作为下一个时刻的输入。是串行的。
而transform利用多头注意力机制可以并行化,比RNN会快很多,但是失去了单词之间的序列关系(这个序列关系很重要),故而在RNN输入的时候将词向量和位置编码相加来作为输入,位置编码具有与嵌入相同的维度,因此两者可以相加。Position Encoding保存了单词在序列中的相对位置或者绝对位置。
pos:表示单词在句子中的位置
d:表示PE的维度
2i是偶数的维度,2i+1是奇数的维度
这么做的好处:可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
2、注意力机制
2.1、Q、K、V的计算
Q:表示将当前时间步的输入(或上一层的输出)
K:表示输入的另一个线性变换,生成用于计算注意力权重的键向量
V:表示模型关注的实际信息
X1和、、相乘得到q1、k1、v1
2.2、Self-Attention 的输出
当较大时,即Q和K的维度较大时,Q的值比较大,使 softmax 函数的输出值接近于 0 或 1,从而导致模型的梯度接近于 0,为了抵消这种效果,就除以的平方根。得到Q矩阵之后,对其矩阵的每一行进行softmax,即让每一行的和都变为1
之后再和V矩阵相乘就得到了Z矩阵
2.3、Multi-Head Attention
这是论文中的Multi-Head Attention,由h个Scaled Self-Attention组成的。通过输入X传递到h个不同的Self-Attention中,计算得出h个Z矩阵,假如h=8
将h个Z矩阵通过线性变化得到最终的Z矩阵
3、Encoder
Encoder包含了2个模块,模块之间是并行的,模块内部是串行的
第一个模块是多头自注意机制,第二个模块是一个简单的、位置全连接的前馈网络。我们在每个模块周围采用残差连接(先)和层规范化(后)。也就是说,每个模块的输出都是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。
放大如下图:
通过Multi-Head Attention得到Z,再和X相加,(残差网络)
3.1、Feed Forward:
两层的全连接层网络,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下:
3.2、Add & Norm
Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:
X是Multi-Head Attention的输入,这里用到了残差网络,Add指的是:将Multi-Head Attention的输出和X进行相加,残差网络如下图所示:
Norm指的是:Layer-norm(可以单独对一个样本的所有的单词做缩放),将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
输出
4、Decoder
Decoder和Encoder的区别:
1、Decoder有包含两个 Multi-Head Attention 层。
2、第一个Multi-Head Attention 层采用了 Masked 操作。
3、第二个 Multi-Head Attention 层所输入的Q、K、V矩阵,K、V矩阵是通过Enconder得到,Q矩阵是上一个 Decoder 模块的输出
4.1、 第一个 Multi-Head Attention
在自注意力机制(Self-Attention)中,在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。为了防止每个位置关注到未来的信息,可以使用掩码来将未来的位置的注意力权重设为负无穷,这样的掩码确保每个位置只能关注到当前位置及之前的信息。下面以 "我有一只猫" 翻译成 "I have a cat" 为例
根据输入 "<Begin>" 预测出第一个单词为 "I",然后根据输入 "<Begin> I" 预测下一个单词 "have"。
第一步:Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 "<Begin> I have a cat" (0, 1, 2, 3, 4) 五个单词的表示向量,而Mask 是一个 5×5 的矩阵。在Mask矩阵中,单词1只能使用单词0、1的信息
第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算Q和 的乘积 Q。
第三步:在得到 Q之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
被遮住的部分的值都为0
第四步:Mask Q和矩阵V相乘得到矩阵矩阵Z,通过 Multi-Head Attention 拼接多个输出Z
4.2、 第二个 Multi-Head Attention
第二个 Multi-Head Attention 层所输入的Q、K、V矩阵,K、V矩阵是通过Enconder得到,Q矩阵是上一个 Decoder 模块的输出;这么做的好处是:每一位单词都可以利用到Encoder所有单词的信息。
5、softmax预测
根据输出矩阵的每一行来预测下一个单词