前言
- 翻译自:https://jalammar.github.io/illustrated-transformer/(强推)
- 同时参考:https://blog.csdn.net/shenziheng1/article/details/89323074
- https://blog.csdn.net/hpulfc/article/details/80448570
- https://www.youtube.com/watch?v=gciHGREJdJ4
- 侵删
一、Attention机制的引入背景
传统seq2seq模型的缺点:
1)Recurrent神经网络的ht需要ht-1和t进行计算生成hidden,无法并行处理。
2)当句子长度较长时,会发生长程的梯度消失,造成长序列到定长向量转化而造成的信息损失的瓶颈,通常会忘记序列早期的部分。
3)传统seq2seq模型用于所有的编码器时间步长的固定上下文向量不同,attention机制计算每次注意力权重为每个时间步长计算单独的上下文向量。
二、传统seq2seq模型结构与添加了Attention机制的模型结构对比
- 传统的seq2seq模型为典型的encode-decode方式。
1)先利用encoder通过非线性变换生成输入句子的中间语义表示C:
2)再利用解码器Decoder利用Source句子的中间语义表示C与之前生成的历史信息来生成i时刻要生成的单词。
- 加入了Attention机制的encode-decode模型
1)目标Target句子的Hi-1(隐藏层状态节点,在注意力模型中为Q)与输入句子Source每个单词对应的隐藏层节点状态hj(k)及逆行对比(相似度计算)。通过函数F(hj,Hi-1)来获得目标单词与每个输入单词对应的对齐可能性(前馈神经网络)。F函数在不同论文中采用的方法不同(点积,拼接,感知机)。最后将F的输入利用某种转化(如softmax)得到注意力得分(V)。
2)中间语义C(就是V矩阵)对于不同位置的yi具有不同的值:
3)利用目标句子(Target)中对应位置的语义编码获得yi
三、Transformer模型整体架构
前言: 传统的Attention机制还是难以并行化,因此谷歌提出了Transformer模型,只使用注意力摆脱了所有的卷积和循环层。
Transformer模型包含两个重要的组成部分:1)encoders(编码组件); 2)decoders (解码组件)
编码组件和解码组件分别包含一堆编码器和解码器。
每个编码器和解码器的内部组成结构:
整体模型结构:
三、各个内部组成结构
总体:input->encode->decode->output
在encode层:
(1)在encoder最底端的encode层是对input进行embedding
(2)经过self-attention获得Z
(3)经过feed forward获得r1
self attention层介绍:
例如句子:”The animal didn’t cross the street because it was too tired”
其中的it与街道有关还是与动物有关(指代消歧),对于人类来说非常简单,但是对于算法来说不是一件简单的事情。
self attention :当模型处理每个单词(输入序列中的每个位置)时,self - attention允许它查看输入序列中的其他位置,以寻找有助于更好地编码这个单词的线索。
作用机制: 通过计算词与词之间的attention score,如果计算呢?分两步
第一步:通过矩阵WQ, WK, WV分别与embedding(第一层encode中为embedding)相乘,得到q,k,v
(假设embedding的维度为512,一般为最长的句子长度)
第二步:通过将当前词的q和相关词的k进行点乘,得到
第三步和第四步:将上述的点乘除以8(就是k矩阵的维度开方),文章说是为了能够获得更多稳定的梯度(不太懂)。
然后将所得的值进行softmax操作(归一化)
第五步是将softmax的值与v矩阵相乘,作用是为了想保持我们想要的词不变,通过设置为0.001这样的小数将不相关的词剔除。
第六步是将加权后的v矩阵相加(是将原v1与加权后的v1相加吗??)
最后将上述的结果送到feed-forward神经网络中。
上述的过程是以一个单词为例子,在实际的应用中为矩阵间的运算,如下图。
通过下述公式概括上述六个步骤:
Muti-head attention机制
多头注意力机制,即有多个平行的上述步骤,得到多个z输出矩阵,再通过处理输出成单个矩阵到FFNN中,目的是为了获得更多层次的表示空间。
将得到的多个z进行:1)concat;2)乘于额外的权重矩阵W0
为了更清晰展示多头注意力机制,作者画了个图:
与单头注意力机制不同,多头attention出来的结果更丰富
因为没有自回归结构获取上下文信息,所以将在embedding中加入位置信息(positional encoding),形成带time signal的embedding作为输入。
以4维的embedding为例:(positional encoding是通过一个get_timing_signal_id( ) 函数产生的)
最后作者补充,在encoder里的每一个子层都具有一个add&normalize的层,如图所示。
具体的内部操作如图所示,:
在解码层:
将顶部编码器的输出转换成一组attention向量K和V。每个解码器在其“encoder-decoder attention”层中将使用这些信息,这有助于解码器将注意力集中在输入序列中的适当位置。在decoder中,self-attention 中会将未来的信息进行遮掩(MASK)。"encode-decode attention"层与多头注意力机制类似,但其会从上一层中创建Q矩阵,同时利用encoder生成的K,V矩阵。
在编码层之后
接linear层和softmax层,将输出的结果映射到输入的类型上,例如翻译成英文(假设共10,000个单词),得到的输出为10,000维。softmax层将得分转换为概率(归一化,均为正数,相加为1),最高的概率将被选择,作为最后的输出。