1 Encoder
在Encoder中存在几个不同的块,他们分别是Multi-Head Attetion,用于关注输入的不同部分特征并且捕捉到更负责的依赖关系;另一个模块为FeedForward,这是一个简单的全连接网络,用于对特征进行非线性变换。还有一部分残差连接与层归一化 (Residual Connections & Layer Normalization),用以缓解梯度消失问题,并促进训练过程中的深层网络学习以及沿着特征唯独计算均值和方差,其有助于在同一批次上的特征学习能力(用到NLP任务中就是对一个句子中的内容处理能力更强)。各个模块组成的整体Encoder架构图如下所示:
1.1 Multi-Head Attention(不足之处)((每个方法解决的问题)MHA、GQA以及其他变体)
在讲解多头注意力机制之前,需要思考为什么需要使用”Multi-Head“注意力机制,多头注意力的优势主要为以下两个方面:1、扩展了模型关注不同位置的能力。2、为注意层提供了多个“表示子空间”。多头注意力的架构示意图如下所示:
与自注意力不同,多头注意力机制的 输入向量为整个序列内容,通过多个不同的头,对整个序列内容的升纬操作创建了多个不同的W^Q、W^K、W^V,这个过程中的计算方法与自注意力中的计算方法是完全相同的,而后每个W^Q、W^K、W^V都经过注意力函数的计算的到最后的输出z_i,整合所有头的z就可以得到最后多头注意力的输出。具体数据变换过程入下图所示:
1.2 feed forward
在Transformer中的feed forward的主要作用是在继Attention的线性相关性与注意力得分计算之后,进行进一步的非线性变换和特征提取,这里的前馈神经网络的主要计算过程就需要先从单层神经网络出发来解析了,以下为单头神经网络的示意图:
最简单的单层网络通常用于处理二分类问题,这里介绍它的原因是为了后续的深层神经网络做一个原理性的解释,单层网络的计算过程等同于线性回归计算,即给每一个输入向量x分配权值,计算出一个结果向量z,同时,为了具备非线性特点,引入了激活函数来处理线性变换的得到的数值:
线性变换(加权和偏置):z = w^T x + b
非线性变换(激活函数):δ ( x ) =\frac{1}{{1 + {e^{ - z}}}}
上面的式子中w为权值,b为偏置,x为输入值,z为线性输出值,δ为非线性输出值。
在Transformer中使用的是深层神经网络,其为单层网络组成,每一步的计算都是与其相同的,也就是一个重复叠加的结果,前一层输出的结果作为后一层网络的输入,从而获得更好的区分与分类能力,其结构示意图如下:
feed forward
1.3 resnet&layerNorm
在编码器架构中的一个细节内容就是每个子层周围都有一个残差连接,然后是层规范化步骤,具体架构描述如下图:
1.3.1 resnet
在encoder架构中我们可以观察到有两条残差连接,一条是输入直接连接到add&Norm中,另一条则是feed forward的输入连接到下一个add&Norm中,这两个残差连接的作用其实都是相同的,他们的作用有如下内容:
1 缓解梯度消失问题:在深层神经网络中,随着网络层数的增加,梯度在反向传播时可能会逐渐变小,导致前几层的权重更新速度变慢,甚至不更新,从而使得网络难以有效训练。残差连接通过引入跳跃连接,让梯度可以绕过中间层直接传播到前面的层,从而缓解了梯度消失的问题。
2 加速模型训练:残差连接使得网络中的每一层实际上学习的是相对于输入的“残差”,而不是完全重新学习所有信息。这种“残差学习”的方式能够使得模型更快地收敛,加速训练过程。
3 位置网络的表示能力:通过残差连接,网络的输入可以直接加到输出上,这在一定程度上确保了即使中间层的变换没有学到有用的表示,输入信息也不会被完全丢失。这样可以有效地保护和传递输入信息,保持网络的表示能力。
4 便于构建更深的网络:残差连接的引入使得构建更深层的网络成为可能,因为它能够避免深层网络带来的训练难度。Transformer中正是通过残差连接的使用,使得编码器和解码器的多个层堆叠成为可行,从而增强了模型的表示能力。
1.3.2 LayerNorm
而其中layer的作用则是通过对每层输出的标准化,显著提高模型的训练速度、稳定性和泛化能力,同时减少了对批量大小的依赖。具体计算过程如下:
假设某一层的输入为 x=[x 1 ,x 2 ,…,x_ n ]
则LayerNorm的计算方式为:
在经过最后的线性变换后的值将会作为下一个模块的输入而进行后续的操作。
2 Decoder
transformer解码器的构成与编码器有所不同,但是其各个模块的基本工作原理与上述编码器中所描述的是完全相同的,在解码器部分主要需要理解的是如何与编码器进行协同工作的。
在解码器中,首先处理编码器最上层输出的的序列,这个序列作为解码器的输入序列转换为一组注意向量K和V。每个解码器将在“编码器-解码器注意力”层中使用它们,这有助于解码器将注意力集中在输入序列中的适当位置:具体步骤入下图所示:
直到出现终止符号,就表示transformer解码器已经完成了他的输出。每个步骤的输出都会作为下一个时间步骤中解码器模块的输入。
在Transformer的decoder中需要注意的是在不同任务中使用的K、V是由encoder最后的输出线性变换得到的,decoder提供最后的Q的输入。
2.1 Masked Multi-Head Attention
上述内容中我们提到了self-Attention中的mask(opt.)模块,在自注意力机制中并未使用到该内容,但是在decoder中就起作用了,在我之前看到的文章中,对其的解释都是这个模块的作用就是为了让decoder在生成后续内容时无法看到后面的结果,增加训练出特征的准确性与理解能力。在解码器中,自注意力层仅允许关注输出序列中的较早位置。这是通过-inf
在自注意力计算中的 softmax 步骤之前屏蔽未来位置(将其设置为)来实现的。
简单理解Masked Multi-Head Attention实际就是对encoder输出的概率矩阵内容进行上三角置0操作,这个操作会使得模型在读取每一行时只能获取当前需要预测的内容。这样就做到了”遮蔽未来位置“的作用。