最近一个模型需要用到注意力机制,但是对它的工作原理不是很了解,通过查找资料将觉得有用的记录下来以便后面遗忘后复习(内容来源于网络,我只是个搬运工)
一、Transformer架构
原文地址:Transformer模型深度解读
机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是: Simple RNN, Contextualize RNN, Contextualized RNN with attention, Transformer(2017)
因为要理解程序,所以重点记录Attention的参数含义及计算过程
Self-Attention是怎么运作:Self-Attention是怎么运作
上图中x1、x2、x3、x4是单词的one-hot形式,处理后得到Embedding形式的a1、a2、a3、a4作为模型的输入,这一步实际上就是word2vec过程。
a1、a2、a3、a4分别乘上一些矩阵(就是对两层神经元进行全连接操作,计算方式如下)得到各自的q、k、v,q相当于query用来匹配k,k相当于key用来被q匹配,v相当于value指被用来提取的信息,具体怎么用后边会说。这里看不明白没有关系,只需要知道有这么一个东西就可以了,下面用到的时候再返回来看一下就好。
然后要做的就是用每个 query q 去对每个 key k 做 attention,这个attention的核心就是匹配q和k然后输出得分α(可将此步看作是计算二者的相似度)。首先用q1分别去attention k1、k2、k3、k4得到α1,1、α1,2、α1,3、α1,4,如下:
这里分母相当于对计算结果进行了一次缩放,至于为什么是这种形式原论文作者也没有详细解释,一般就直接默认使用这个值了。
得到α1,1、α1,2、α1,3、α1,4后进行softmax处理获得:
从过程里不难发现,这里b1的产生其实attend到了整个句子的所有信息,这就是Self-Attention的妙用,完美解决了之前RNN、LSTM等对于长距离单词无法attend到的问题。
刚才我们只计算了b1,对于后面的b2(如下)、b3、……类似,而且不难发现,这些计算过程完全可以同时进行,不像之前的RNN必须严格按照给定序列依次计算。
那么我们再回到Self-Attention Layer中,把所有参数考虑进来整个流程写成矩阵的形式就是下面这个样子:
二、Attention机制涉及到的参数
三、通俗理解Attention
以机器翻译为例,用通俗的语言阐释一下attention的作用,以及query, key, value的含义。
query对应的是需要被表达的序列(称为序列A),key和value对应的是用来表达A的序列(称为序列B)。其中key和query是在同一高维空间中的(否则无法用来计算相似程度),value不必在同一高维空间中,最终生成的output和value在同一高维空间中。上面这段巨绕的话用一句更绕的话来描述一下就是:
Encoder部分中只存在self-attention,而Decoder部分中存在self-attention和cross-attention
【self-attention】encoder中的self-attention的query, key, value都对应了源端序列(即A和B是同一序列),decoder中的self-attention的query, key, value都对应了目标端序列。
【cross-attention】decoder中的cross-attention的query对应了目标端序列,key, value对应了源端序列(每一层中的cross-attention用的都是encoder的最终输出)
Decoder端的Mask
Transformer模型属于自回归模型,也就是说后面的token的推断是基于前面的token的,Decoder端的Mask的功能是为了保证训练阶段和推理阶段的一致性。
四、多头Attention (Multi-head Attention)
Attention是将query和key映射到同一高维空间中去计算相似度,而对应的multi-head attention把query和key映射到高维空间 的不同子空间 中去计算相似度。
将单个Self-attention进行分裂就得到Multi-head Self-attention,这里以2个heads为例进行说明(实际使用时head数目也是需要作为参数进行调的)。
d Attention的本质是,在参数总量保持不变的情况下,将同样的query, key, value映射到原来的高维空间的不同子空间中进行attention的计算,在最后一步再合并不同子空间中的attention信息。这样降低了计算每个head的attention时每个向量的维度,在某种意义上防止了过拟合;由于Attention在不同子空间中有不同的分布,Multi-head Attention实际上是寻找了序列之间不同角度的关联关系,并在最后concat这一步骤中,将不同子空间中捕获到的关联关系再综合起来。
五、Transformer模型架构中的其他部分
1.Feed Forward Network
每一层经过attention之后,还会有一个(Feed Forward Network)FFN,这个FFN的作用就是空间变换。FFN包含了2层linear transformation层,中间的**函数是ReLu。
曾经我在这里有一个百思不得其解的问题:attention层的output最后会和 [公式] 相乘,为什么这里又要增加一个2层的FFN网络?
其实,FFN的加入引入了非线性(ReLu**函数),变换了attention output的空间, 从而增加了模型的表现能力。把FFN去掉模型也是可以用的,但是效果差了很多。
2.Positional Encoding
位置编码层只在encoder端和decoder端的embedding之后,第一个block之前出现,它非常重要,没有这部分,Transformer模型就无法用。位置编码是Transformer框架中特有的组成部分,补充了Attention机制本身不能捕捉位置信息的缺陷。
Positional Embedding的成分直接叠加于Embedding之上,使得每个token的位置信息和它的语义信息(embedding)充分融合,并被传递到后续所有经过复杂变换的序列表达中去。
3.Layer Normalization
在每个block中,最后出现的是Layer Normalization。Layer Normalization是一个通用的技术,其本质是规范优化空间,加速收敛。
当我们使用梯度下降法做优化时,随着网络深度的增加,数据的分布会不断发生变化,假设feature只有二维,那么用示意图来表示一下就是: