关于FFN与Add&Norm的一些学习与思考
FFN(Feed-forward Network)
- Transformer中的FFN实际上就是由线性层fc+relu激活函数+线性层fc的结构组成
- 论文中作者提出,attention输出的embedding维度为512,ffn将输入从512升维至2048,而后经过激活后又降维至512

- FFN的引入主要有四个作用:
- 语义强化:每个神经元可以视作一个简单的分类器,用以近似输入数据的高维映射 通过升维,原始的输入被扩展到了高维度空间,能够学习到更丰富的信息与特征,而后又进行降维,将学习到的信息重新进行压缩,提取更精确的表达。第一层中,每个神经元可以视作一个简单的分类器,用以近似输入数据的高维映射(从一维卷积的角度看,升维可以提取更多的特征)。由此可见,虽然输入输出维度没有变化,但是后者所蕴含的信息多于前者
- 增强表达:通过relu的运算,为embedding引入了非线性信息,如果没有 FFN 层的存在,Transformer 模型可能会退化为简单的线性变换模型,从而失去捕捉复杂特征的能力。FFN层保证了模型能够保持其表达能力,有效捕捉到输入数据中的复杂特征
- 知识存储:一个很有趣的类比方法,比如512->2048升维后,相当于在记忆仓库中有2048个潜在的知识槽位(类比一个巨大的哈希表),每个神经元具有多义性可能存储一组稀疏特征,经过relu稀疏激活后(大部分激活为0或者输出接近0),选择了关键的几个知识槽位,而后再使用线性层对这些选出的知识进行加权压缩。相当于fc1学习key,fc2学习value
- 增大参数量:大模型具有涌现现象,当模型规模(参数量、训练数据量、算力)达到一定阈值后,模型会突然表现出一些在小模型上完全没有、甚至无法预期的新能力,而这些能力不是通过线性外推规模就能得到的。这是一种非线性、阈值式的性能跃迁。引入FFN,能够避免参数稀疏问题,RNN、CNN这类结构都具有参数共享的机制,在这种大规模模型上反而成了问题。此外,不考虑embedding层,一个transformer架构的模型里,FFN和Attention参数占据了模型参数的绝大部分,基本上超过了 90%。其中FFN和Attention 参数量比例接近 2:1
Add & Norm
- 在Transformer中,add & Norm主要体现在
output = Norm(x + MHA/Masked-MHA(x))、output = Norm(x + FFN(x))这几个部分 - Add的作用:
- 缓解梯度爆炸/消失,让梯度有一条直接从上层流到下层的通路,避免深层网络训练困难,这也是为什么大模型能够通过transformer堆叠从而实现大规模参数架构训练
- 保留原始信息,如果如果子层
MHA(x)、FFN(x)训练不理想,可以继续依赖x进行训练,这里网络学习的是增量变化,而不是没有残差结构时的持续重建(这里很好的体现了残差的概念),子层也只需要学习对原信息的小幅度修正,结合原信息的传入两者相加便能得到很好的训练效果
- Norm的作用:
- 解决内部协变量偏移:Internal Corvariate Shift,ICS是一个需要关注的问题,随着DNN的不断加深,随着参数的更新每一层的输出与其输入的分布都会产生差异,而随着层数的变大,这样的差异似乎也随着蝴蝶效应而变大。由于
P(Y|Xt)与P(Y|Xt-1)相同,但是P(Xt)和P(Xt-1)却具有一定差异,这使得顶层网络需要不断去适应这样的变化,造成了模型的学习困难(记得曾经一开始学习时按照googlenet原论文手搭网络进行training,acc只有11%多,后面发现没有加bn... 加了若干bn之后就可以正常训练了)- ICS通常会导致以下几个问题:
- 统计机器学习中的一个经典假设是源空间(source domain)和目标空间(target domain)的数据分布是一致的,而产生ICS后,输入不再为独立同分布,网络需要不断去适应分布的变化,导致训练时间增长,训练产生困难(相当于需要不断进行domain transfer,这显然是个麻烦的问题)
- 随着网络层数的增加,通过多层的计算后数据分布的多变不受控制,可能导致很多数据落入梯度饱和区,使得收敛速度变慢
- 传统方法使用白化进行处理,处理后的数据具有特征之间相关性较低、所有特征具有相同的方差的特点,但是具有两个缺点:1、计算量大(pca)2、强行消除特征之间的相关性,网络表征空间的学习被破坏
- 归一化即对某层的输入进行平移+伸缩变化,使其满足标准正态分布,这样在这一层的输入处,所有数据的输入分布得以稳定,满足了独立同分布的特性,也具有去除一些噪声的作用
- ICS通常会导致以下几个问题:
- 解决内部协变量偏移:Internal Corvariate Shift,ICS是一个需要关注的问题,随着DNN的不断加深,随着参数的更新每一层的输出与其输入的分布都会产生差异,而随着层数的变大,这样的差异似乎也随着蝴蝶效应而变大。由于
归一化的分类(个人理解)
一般而言,就会根据具体的任务使用不同的归一化方案,归一化方案的不同代表着我们要在哪一个维度进行归一化,也就代表着要把哪一个维度的信息损失掉一部分信息,从而进行相似化
-
Instance Normalization,IN,常用于风格迁移、图像生成任务,例如使用CycleGAN进行图像风格迁移就是使用的IN。我们都知道一张RGB图像由空间维度和通道维度组成(H * W * C),一般各个通道的分布代表了这张图像的“风格”,换句话说,也就是各个通道的均值与标准差代表了“风格”。那么对于各个通道进行归一化,即消除了这张图像的风格,保留了内容与框架,更容易进行其他风格的迁移
-
Batch Normalizaition,BN,常用于通用的计算机视觉任务(识别、检测、分割、超分辨...)。与IN不一样的,IN不考虑B的原因则是为了抛弃其他图像风格带来的干扰。而BN将batch维度考虑了进来,类似于识别这类任务,需要捕捉整体的特征,因此对于每一个通道考虑(B,H,W)的信息进行归一化,相当于BN同样是在通道C维度进行归一化,却没有完全像IN那样完全去除一张图片的风格特征,而是在对batch中的图像风格进行平均化
-
Layer Normalization,LN,常用于NLP任务。如果输入的为图片(B,C,H,W),对于每一个样本在(C,H,W)上进行归一化,即对每个样本的所有特征进行归一化,完全不考虑其他样本。对于nlp任务而言,(batch_size, max_seq_len, vec_dim)和CV的(N,C,H,W)对应关系为:
max_seq_len ⇒ H*W、vec_dim ⇒ C但是在CV中LayerNorm标准化(C,H,W),而NLP中标准化(vec_dim,),nlp中BN具有以下缺点:- batch size一般较小,mini-batch情况下bn的全局统计信息不准确
- NLP中同一个batch不同句子的某个位置的特征没有可比性:句子1第3个token的语义和句子2第3个token的语义通常不同(词不同、上下文不同)
-
为什么只对vec_dim维度进行归一化:NLP中同一个batch的句子长度不一,不同句子长度差异导致padding,padding部分是无效数据。另外,也是因为同一个seq中,不同的token间存在强相关信息,不适合进行iid假设,会严重影响训练效果
-
layernorm的必要性:Transformer中token表示会不断叠加其他token信息(attetion),这个加权和受上下文token数量和特征值大小影响,不可控,高维向量中,每个维度的小波动可能在叠加后产生较大的整体偏移不同层的累积叠加容易让embedding“跑远”,导致分布不稳定。因此,在transformer这种embedding维度十分大的场景下,LN能够把尺度拉回稳定范围,防止向量漂移太远
-** Group Normalization, GN**,是一种LN与IN折中方案,将通道C分为G组,每一组通道内进行归一化。在BN中统计的是整个batch中同一个通道的均值和方差,即跨样本统计。当batch很小时(尤其 batch=1),统计量非常不稳定,所以BN必须依赖大batch才能保证稳定的统计量和训练效果。而GN不依赖batch,且保留了组间的一定差异,适合用于mini-batch情况下需要保留一定通道特征差异的情况。
-
为什么work? :每一层有很多的卷积核,这些核学习到的特征并不完全是独立的,某些特征具有相同的分布,因此可以被group,当然,在NN中这些分组的条件很难人为进行捕捉,不那么直观
-
个人对于BN、IN、GN共同性的思考:在CNN中,一个通道的所有特征图均由同一个卷积核产生,因为我们希望不同图像,图像不同位置用这个卷积核执行卷积以后的数据分布是稳定的,所以需要在各个通道维度执行归一化(通俗点说,对于一个通道而言,每一个像素P_{bi,hj,wk}都是由相同的卷积核卷积而成,这些像素在分布上可被近似为独立同分布,于是在这个通道维度上进行归一化能够在损失信息较小的情况下削弱ICS),当然,对于H*W是一定要进行归一化的,而对于batch的考虑以及通道分组的考虑就是另外引入的考虑了
-
RMS Normalization(Root Mean Square Layer Normalization):目前很多LLM采用了的用来替代传统的LayerNorm函数
-
对于一个词向量进行LN时候,具有两个特性:
- 平移不变性(Translation invariance):对输入特征减去均值,实现均值为零,消除输入偏置
- 缩放不变性(Scale invariance):对输入除以标准差,实现标准差为一,保证特征尺度一致
-
研究者发现,LN之所以work不是因为其平移不变性而是因为缩放不变性,因此RMSNorm去除了减去均值的平移步骤,只保留了对输入特征进行缩放的操作,使用平方均值对向量进行归一化,这样具有以下好处:
- 省略去中心化计算和平移操作,在高维大批量数据中能节省不少计算时间
- 在实际应用中,RMS Norm和LN效果差不多,但是计算效率增长,训练更快

浙公网安备 33010602011771号