
Encoder包括:Inputs、多头注意力、前馈神经网络和Add&Norm。整个架构用流程图表示如下:
如上图把Token Embedding和Position Encoding计算后得到向量x,入多头注意力层,再经过Add & Norm,激活函数之后输出。
输出的数据被分为四个分支进入Encoder中,其中三个分支进入多注意力层,一个分支原封不动的输入到 Add & Norm中。
输入Inputs
多头注意力
见Transformer模型-5-MultiHead Attention-笔记
Add & Norm
Transformer中的Add&Norm层是一种常用的层,用于在多头自注意力机制和前馈神经网络之间添加残差连接和归一化操作。
这个层的作用是将前一层的输出与前一层的输入相加,并进行归一化,以便更好地传递信息和控制梯度。
换一种说法: Add&Norm层的作用是在保持信息流畅性的同时,避免梯度消失或爆炸的问题,从而提高模型的训练效率和性能。
Add&Norm层主要完成以下几件事情:
残差连接:将前一层的输出与前一层的输入相加,得到一个残差向量。
归一化:对残差向量进行归一化,以便更好地传递信息和控制梯度。归一化可以采用不同的方法,如Layer Normalization或Batch Normalization。
线性变换:对归一化后的向量进行线性变换,以便更好地适应下一层的输入。
Add
什么是残差连接
什么是残差连接呢?残差连接就是把网络的输入和输出相加,得到网络的输出为 <math xmlns="http://www.w3.org/1998/Math/MathML"> F ( x ) + x F(x)+x </math>F(x)+x。
分析在网络结构比较深的时候,网络梯度反向传播更新参数时,容易造成梯度消失的问题,但是如果每层的输出都加上一个x的时候,就变成了F(x)+x,对x求导结果为1,所以就相当于每一层求导时都加上了一个常数项'1',这样就有效解决了梯度消失问题。
Transformer中的残差连接
在Transformer中,数据过Attention层和FFN层后,都会经过一个Add & Norm 处理。其中Add为residule block(残差模块) ,数据在这里进行residule connection(残差连接)
残差连接的图表如下所示:
![]() |
![]() |
Add是一种残差连接,用于缓解梯度消失,这一概念在ResNet中被提出: ![]() |
Add: 让反向传播过程中,有一路的梯度不会经过梯度F(x) 计算(如上右图公式中的第一个F(x)),直接经过后续的处理(传播), 能够保存更多的梯度信息。有了Add(残差连接)我们可以将网络做的更深。
Norm
什么是Normalization
Norm即为Normalization(标准化)模块,就是把输入数据X,在输送给神经元之前先对其进行平移和伸缩变换,将X的分布规范化成在固定区间范围的标准分布,简单的说就是 将数据统一到固定区间内。变化框架
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> h = f ( g ∗ x − μ α + b ) μ :平移参数, δ :缩放参数 b :再平移参数, g 再缩放参数,得到的数据符合均值为 b 、方差为 g 2 的分布。 h=f(g * \frac{x-μ}{α} + b) \\ μ:平移参数 ,δ:缩放参数 b :再平移参数, g 再缩放参数,得到的数据符合均值为 b 、方差为g^2 的分布。 </math>h=f(g∗αx−μ+b)μ:平移参数,δ:缩放参数b:再平移参数,g再缩放参数,得到的数据符合均值为b、方差为g2的分布。
Normalization的作用很明显,把数据拉回标准正态分布,因为神经网络的Block大部分都是矩阵运算,一个向量经过矩阵运算后值会越来越大,为了网络的稳定性,我们需要及时把值拉回正态分布。
Normalization根据标准化操作的维度不同可以分为batch Normalization和Layer Normalization,不管用何种维度方式其本质都是为了让数据在相应的维度上归一化,以解决上一层传递的数值千奇百怪的分布的问题。其中BatchNorm是通过对BatchSize这个维度归一化来让分布稳定下来, LayerNorm则是通过对Hidden size这个维度归一化来让某层的分布稳定。
BN与LN的的区别
Re-Scaling不变性
Layer normalization和Batch normalization类似,缓解Internal Covariate Shift问题,可以将数据分布拉到激活函数的非饱和区,具有权重/数据伸缩不变性的特点。起到缓解梯度消失/爆炸、加速训练、正则化的效果。
权重矩阵Re-Scaling 不变性 | 权重向量Re-Scaling不变性 | 数据Re-Scaling不变性 | |
---|---|---|---|
Batch Normalization | 不变 | 不变 | 不变 |
Layer Normalization | 不变 | 变化 | 不变 |
Instance Normalization | 不变 | 不变 | 不变 |
Group Normalization | 不变 | 变化 | 不变 |
类似的normalization方法还有weight / Instance / group normalization, 比较时一起列出(不舍得删)
二者原理上的差异
batch normalization对一个神经元的batch所有样本进行标准化,layer normalization对一个样本同一层所有神经元进行标准化,前者纵向 normalization,后者横向 normalization。
Batch Normalization | Layer Normalization |
---|---|
纵向规范化 ![]() |
横向规范化 ![]() |
计算方式 ![]() |
计算方式 ![]() |
Transformer中采用的是Layer Normalization(层标准化)方式。
- BN是对一个batch-size样本内的每个特征做归一化,LN是对每个样本的所有特征做归一化。
- BN抹杀了不同特征之间的大小关系,但是保留了不同样本间的大小关系;LN抹杀了不同样本间的大小关系,但是保留了一个样本内不同特征之间的大小关系。
场景上的异同
- 在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。
- 但是有些场景是不能使用BN的,例如batch size较小或者序列问题中可以使用LN。这也就解答了RNN 或Transformer为什么用Layer Normalization?
训练和预测的异同
- LN针对的是单独一个样本,在训练和预测阶段的使用并无差别;
- BN是针对一个batch进行计算的,训练时自然可以根据batch计算,但是预测时有时要预测的是单个样本,此时要么认为batch size就是1,不进行标准化处理,要么是在训练时记录标准化操作的均值和方差直接应用到预测数据,这两种解决方案都不是很完美,都会存在偏差。
Transformer中Norm
Transformer中采用的是Layer Normalization(层标准化)方式。
Normalization 的作用很明显,把数据拉回标准正态分布,因为神经网络的Block大部分都是矩阵运算,一个向量经过矩阵运算后值会越来越大,为了网络的稳定性,我们需要及时把值拉回正态分布。
![]() |
![]() |
Add的结果经过LN进行层归一化: ![]() |
Feed Forword - 前馈神经网络
什么是前馈神经网络
前馈神经网络(Feedforward Neural Network, FNN) 是最早发明的简单人工神经网络。在前馈神经网络中,各神经元分别属于不同的层,每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第0层称为输入层 ,最后一层称为输出层 ,其他中间层称为隐藏层。整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示。
Transformer中的前馈神经网络

Feed Forward 层是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> m a x ( 0 , X W 1 + b 2 ) W 2 + B 2 max(0,XW_1 + b_2) W_2 + B_2 </math>max(0,XW1+b2)W2+B2
Feed Forward 结果再次经过Add&Norm后,就得到了Encoder的输出:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> L a y e r N o r m ( X + F e e d F o r w a r d ( X ) ) LayerNorm(X + FeedForward(X)) </math>LayerNorm(X+FeedForward(X))
------ 笔记写于:2023年11月07日