1. Transformer是什么
Transformer
是一个利用注意力机制来提高模型训练速度的模型。关于注意力机制可以参看这篇文章,trasnformer可以说是完全基于自注意力机制的一个深度学习模型,因为它适用于并行化计算,和它本身模型的复杂程度导致它在精度和性能上都要高于之前流行的RNN循环神经网络。
对于RNN来说它一般只关注附近的关系关联,而没有从全局寻找关系紧密的相关特征。因此对于一些特定的场景,不能够很好的处理。而Transforme放眼全局,通过计算权重得到相应的向量,得到更为全面的特征
2. Transformer的构成
里面主要有两部分组成:Encoder
和Decoder
当我输入一个文本机器学习
的时候,该文本数据会先经过一个叫Encoders的模块,对该文本进行编码,然后将编码后的数据再传入一个叫Decoders的模块进行解码,解码后就得到了翻译后的文本,对应的我们称Encoders为编码器,Decoders为解码器。
这个编码模块里边,有很多小的编码器,一般情况下,Encoders
里边有6个小编码器,同样的,Decoders
里边有6个小解码器。
放大一个encoder,发现里边的结构是一个自注意力机制加上一个前馈神经网络。
3 Encoder
3.1 self-attention的步骤
这里我们以文本词向量为例。总结来说Transformer时将输入的特征信息以向量为一组,计算该向量与别的向量之间的紧密程度,即将Q与K进行点积得到权值值,经过softmax后得到所占的比重值,然后整合各向量的V*权重得到该向量的新的特征向量。
transformer
首先将词向量乘上三个矩阵,得到三个新的向量,之所以乘上三个矩阵参数而不是直接用原本的词向量是因为这样增加更多的参数,提高模型效果。对于输入X1
(机器),乘上三个矩阵后分别得到Q1,K1,V1
,同样的,对于输入X2
(学习),也乘上三个不同的矩阵得到Q2,K2,V2
。Q维要去查询的,K为等着被查的,V为实际的特征信息计算注意力得分了,这个得分是通过计算Q与各个单词的K向量的点积得到的。我们以X1为例,分别将Q1和K1、K2进行点积运算,假设分别得到得分112和96.
将得分分别除以一个特定数值8(K向量的维度的平方根,这里以K向量的维度是64为例)这能让梯度更加稳定,则得到结果如下:
进行softmax运算得到,softmax主要将分数标准化,使他们都是正数并且加起来等于1
V向量乘上softmax的结果,这个思想主要是为了保持我们想要关注的单词的值不变,而掩盖掉那些不相关的单词(例如将他们乘上很小的数字)
将带权重的各个V向量加起来,至此,产生在这个位置上(第一个单词)的self-attention层的输出,其余位置的self-attention输出也是同样的计算方式
将上述的过程总结为一个公式就可以用下图表示:
上面所举的例子我们可以发现每一个输入向量只是产生了一组Q、K、V,为了进一步提高自注意力的层的性能,产生了多头注意力机制,它通过不同的head得到多个特征表达式(理解为多个个互不干扰自的注意力机制运算,每一组的Q/K/V都不相同。然后,得到多个个不同的权重矩阵Z,每个权重矩阵被用来将输入向量投射到不同的表示子空间。),然后将所以特征拼接起来,得到更为丰富的输出,然后经过一层全连接实现降维。
如下我们得到了八个矩阵Z,将他们拼接: 后进行全连接后得到我们作为前馈神经网络的输入:
注意:为了解决梯度消失的问题,在Encoders和Decoder中都是用了残差神经网络的结构,即每一个前馈神经网络的输入不光包含上述self-attention的输出Z,还包含最原始的输入。
3.2 前馈神经网络
前馈神经网络的输入是self-attention的输出,即上图的Z,是一个矩阵,矩阵的维度是(序列长度×D词向量),之后前馈神经网络的输出也是同样的维度
4. Decorder
decoder中使用的也是同样的结构。也是首先对输出machine learning
计算自注意力得分,不同的地方在于,进行过自注意力机制后,将self-attention的输出再与Decoders模块的输出计算一遍交叉注意力机制得分,之后,再进入前馈神经网络模块
- 交叉注意力:指两个模块的矩阵进行注意力计算
- 自注意力:指在同一模块内进行注意力计算
5. 对位置应用认识
上面所举的例子当中只是单纯的由Q、K、V得到权值计算拼接后的东西。但是思考一下下面两个句子: 1
2chen Love wu
wu love chen
因此我们希望能够对位置进行编码,一般对位置编码不进行更新(大佬作品,水论文可以更)