当时传统的seq2seq模型由于核心的Encoder和Decoder原理还是RNN,在处理长序列时容易出现梯度消失和梯度爆炸等限制问题,且难以捕捉长距离的上下文关系。以及CNN卷积操作通常计算由于矩阵点积尺寸需要固定,每次处理序列的时候需要对长度进行预处理,结果就是效率低下。
这时,最早由Google在2017年论文Attention Is All You Need提出的Transformer,采用了Self-attention自主力机制很好的解决了这些问题。
多头自注意力Multi-head self attention
本人之前做过简单的理解(从seq2到seq2到self-attention个人理解&学习小结-CSDN博客),学完后决定对Self-attention再作一些理解补充。
Self-attention的理论直观结构图:
其中:a为输入序列,蓝色矩形部分是Self-attention的操作,最终的输出序列b由所有的a计算得到,携带了a每个位置与其他位置的相关性,这是之前的seq2seq所没有的。
Self-attention就好像我们一个个体读一句话一样,读完一句话以后,再次读它每个字词的时候,就会注意到上下文哪些是有关联的。而Transformer采用的则是Self-attention的一种小变形:采用了掩码多头自注意力(Masked-Multi-head self attention)
为什么是Masked-Multi-head self attention?
对比与传统Self-attention的最大区别就是“掩码”和“多头”:
“掩码”:读到那里算哪里,只管前面不管后面(落实到计算输出序列b不是由所有的a计算得到,而是自身和前面部分组成的序列a')
“多头”:如果说Self-attention像是一个个体,那么Masked-Multi-head self attention就像是多个个体在一起思考,他们分别考虑不同的事情,例如一句话的时间,地点,人物。然后再把大家的思想结合起来,那么对一句话的理解程度可想而知。
在每个时间点只能关注到之前时间的信息,不能了解未来的信息,这些可以帮助Transformer模型在阅读序列时维持字词时间的因果关系,并且对未来的信息进行模糊处理(过滤)。因此,Transformer使用掩码多头自注意力来处理时间序列数据,以便更好地捕获序列的依赖关系。
Feed Forward神经网络层
先介绍残差连接:将输入直接加到神经网络层的输出上,使得梯度更容易地在网络中传播,也很好地缓解了梯度消失地问题。在我们的Transformer模型中,通常会在每个子层(如Self-attention和Feed-Forward层)的输入与输出之间添加残差连接,能得到更好的效果
我们的Feed-Forward层的作用就是对输入进行非线性变换
它由两个全连接层组成,之间有一个激活函数(ReLU常见),可以在每个位置上对特征进行灵活的转换和组合。这有助于契合不同模型的需要,从而提高了Transformer模型的表达能力。
它与掩码多头自注意力机制(Masked-Multi-head self attention)等共同构成了Transformer的重要神经网络层:Feed-Forward
模型个人理解
当我初次学的时候,有了上面的理解,再加上Encoder和Decoder的知识基础,Transformer模型直接水到渠成,跃然纸上,直接拍手高呼绝了(不是)
Transformer模型图:
从总体上来看,它由Encoder(左)和Decoder(右)两大部分组成
结合之前提到的掩码多头自注意机制+全连接神经网络,配合上残差连接(Add&Norm旁边的黑箭头)。
我们走一遍图流程:
输入数据经过编码器(Encoder)部分:
首先,从左下角的Inputs输入开始,输入数据经过一个嵌入层(embedding layer)转换为词嵌入向量。
然后,词嵌入向量通过位置编码(Positional Encoding)进行处理,以保留词语在句子中的位置信息。
数据经过多个相同的Transformer Block,每个Block包括Self-Attention层和Feed-Forward神经网络层。在Self-Attention层中,模型可以在一个句子中的所有词语之间进行注意力计算。
最后,通过编码器的输出,得到了编码后的词语表示。
经过编码器后的数据传输到解码器(Decoder)部分:
解码器同样包含多个Transformer Block。在每个Block中,除了Self-Attention和Feed-Forward层外,还包含一个Encoder-Decoder Attention层,该层允许解码器在生成输出时,关注输入句子的信息。
解码器还通过自注意力机制,以及位置编码对输入进行处理,同时也经过多个Transformer Block的处理。
最后,解码器的输出通过一个全连接层,生成最终的输出结果。
整体来说,Transformer的处理数据过程主要包括输入的嵌入,位置编码,经过多个Transformer Block的处理,并且通过编码器和解码器的交互和最终的输出,完成了对序列数据的处理和翻译等任务。
---------------------------------------------------------------------------------------------------------------------------------
感谢阅读,学无止境,我们一起进步鸭!
参考资料: