资讯动态

万字长文!一文了解归一化:从Transformer归一化到主流大模型归一化的演变!

发布时间:2026/8/27 17:53:06 来源:尧图企业网站定制
引言自Transformer架构被提出来之后人们一直都在对Transformer架构进行更改例如从正余弦位置编码旋转位置编码RoFE、从多头Attention到DeepSeek的MLA、从前馈神经网络到当前的MoE架构等。而归一化Normalization在整体Transformer架构中并没有做太多的改进但它对模型能否顺利训练却有着很关键的作用。本文将带你一文了解归一化Normalization包括其背景、种类、Transformer归一化及源码、大模型常见归一化、大模型归一化位置等。文章安排如下归一化的作用归一化Normalization又叫正则化、规范化、标准化等它是一种数据处理方式「能将数据经过处理后限制在某个固定范围内」来方便后面神经网络对数据的处理。它是神经网络不可以或缺的一环。正常使用的话现在基本只需几行代码就能实现但要用得好还是需要了解它。下面将介绍归一化的主要作用1、数据可比性那么为什么要把数据限制到某个固定的范围呢目标解决数据间的可比性。这里其实有一个从量纲和无量纲的概念。举个例子当我们在做对房价的预测时收集到的数据中如房屋的面积、房间的数量、到地铁站的距离等这些都是量纲其对应的量纲单位分别为平方米、个数、米等。「这些量纲单位的不同导致数据之间不具有可比性」。同时对于不同的量纲数据的数量级大小也是不同的比如房屋到地铁站的距离可以是上千米而房屋的房间数量一般只有几个。经过归一化处理后「不仅可以消除量纲的影响也可将各数据归一化至同一量级从而解决数据间的可比性问题」。2、提高最优求解速度按照上面给出的例子假设通过房子到地铁站的距离x_1、房间数量x_2这两个变量来预测房价。那么预测公式和损失函数分别为「在未归一化时」房子到地铁站的距离的取值在05000之间而房间个数的取值范围仅为010。假设x_11000x_23那么损失函数的公式可以写为可将该损失函数寻求最优解过程可视化为下图图1损失函数的等高线图1左为未归一化时图1右为归一化:图1中左图的红色椭圆代表归一化前的损失函数等高线蓝色线段代表梯度的更新箭头的方向代表梯度更新的方向。「寻求最优解的过程就是梯度更新的过程其更新方向与等高线垂直」。由于和 的量级相差过大损失函数的等高线呈现为一个瘦窄的椭圆。因此如图1左所示瘦窄的椭圆形会使得梯度下降过程呈之字形呈现导致梯度下降速度缓慢。可以看到经过归一化后的数据属于同一量级损失函数的等高线呈现为一个矮胖的椭圆形如图1右所示「求解最优解过程变得更加迅速且平缓因此可以在通过梯度下降进行求解时获得更快的收敛」。3、远离激活函数饱和区神经网络中还有一个重要组件非线性激活函数比如常用的sigmoid。比如上图当输入 6 或者 -6 的时候sigmoid函数的梯度已经变得非常小也就是进入了饱和区。这种情况下训练就变得困难。在没有normalization的情况下分布不断变化后面层的参数变化激烈导致输出值更容易进入到左右两端更容易进入到激活函数的饱和区。「而归一化能把部分输出值拉回到梯度正常的范围内一定程度缓解了梯度消失的问题使训练可以正常进行下去」。4、缓解ICS机器学习里有一个叫独立同分布i.i.d的假设。它指的是每次抽样之间相互独立并且**「每次抽样都服从相同的分布」**。这一假设对于机器学习至关重要因为它确保了训练数据能够代表整体数据分布从而使模型能够从历史数据中学习并对未来数据做出准确预测。i.i.d.假设简化了模型学习过程使得模型训练更快速、更容易。然而并非所有机器学习场景都严格遵循i.i.d.假设。在多层神经网络中由于上层参数的变化导致下层输入分布的变化这违反了i.i.d.假设从而影响了模型的学习效果和训练难度这种现象被称为内部协变量偏移ICS。「为了解决ICS问题一种可能的方法是采用归一化技术如Batch Normalization通过将上一层的输出映射到一个固定的分布上来稳定下一层的输入分布从而降低学习难度」。尽管有研究表明Batch Normalization的作用机制与ICS的关系可能并不大指出ICS问题也可以通过改变初始化策略、调整训练超参数如学习率等方法来优化但相比归一化方法此类方法的效率并不是很高。【PS整理了一份AI大模型全套系统学习资料内容包含AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频有需要的朋友可以直接点击下方卡片免费领取】归一化类型常见的归一化类型可以分为线性归一化和非线性归一化其中线性归一化包含Min-max归一化、mean归一化、Z-score归一化等非线性归一化包含对数归一化、反正切归一化、小数对标标准化。以下是详细介绍线性归一化「Min-max normalization」最小-最大归一化是一种常用的数据预处理技术它将数据缩放到一个固定的范围通常是[0, 1]这有助于改善算法的性能尤其是在涉及距离计算的算法中如K-最近邻KNN、K-均值聚类等。由于直接使用了数据的最大值和最小值Min-max normalization**「对异常值非常敏感」**。如果数据集中包含异常值这些值可能会极大地影响归一化的结果。计算公式如下「Z-score normalization」标准化是数据预处理中常用的一种方法它通过计算每个数据点与均值之间的差异并将其除以标准差「来将原始数据转换为具有零均值和单位方差的新数据集」。这种方法使数据符合标准正态分布具有均值为0和标准差为1的特性。「在数据存在异常值、最大最小值不固定的情况下可以使用标准化」。计算公式如下其中是原始数据点。μ 是原始数据集的均值。σ是原始数据集的标准差。 是归一化后的数据点。「Mean normalization」均值归一化通过减去数据的均值并除以数据的最大值和最小值之差来调整数据的尺度数据被缩放到一个特定的范围内通常是[0, 1]。这种方法的目标是使数据在特征空间中具有统一的尺度从而有助于提高机器学习模型的性能和收敛速度。但是**「数据中不应包含大量的异常值」**因为这些值可能会对最大值和最小值产生较大影响从而影响归一化的效果。计算公式如下非线性归一化「No-line normalization」非线性归一化常见的有对数归一化、反正切函数归一化、小数定标标准化。它们通常被用**「在数据分化程度较大的场景」**有时需要通过一些数学函数对原始值进行映射如对数、反正切等。**「对数归一化」**通过取数据的对数来降低数据的动态范围从而将数据压缩到一个较小的区间内。这种方法对于具有指数增长或极端值的数据特别有用。公式如下**「反正切函数归一化」**使用反正切函数arctan来将数据映射到 [-1, 1] 的范围内。这种方法对于处理具有极端值或非线性分布的数据特别有效因为它可以减少极端值的影响。同时可以保留数据的相对差异并且将数据限制在一个固定的范围内。公式如下「小数定标标准化」Decimal Point Normalization通过移动数据的小数点位置来实现归一化。这种方法适用于数据范围较大且数据值相对稳定的情况。归一化后的数据范围为 ([-1, 1])为使的最小整数。公式为归一化使用总结1、「Min-max归一化和mean归一化适合在最大最小值明确不变的情况下使用」比如图像处理时灰度值限定在 [0, 255] 的范围内就可以用min-max归一化将其处理到[0, 1]之间。在最大最小值不明确时每当有新数据加入都可能会改变最大或最小值导致归一化结果不稳定后续使用效果也不稳定。同时数据需要相对稳定如果有过大或过小的异常值存在min-max归一化和mean归一化的效果也不会很好。如果对处理后的数据范围有严格要求也应使用min-max归一化或mean归一化。2、Z-score归一化也可称为**「标准化」经过处理的数据呈均值为0标准差为1的分布。「在数据存在异常值、最大最小值不固定的情况下可以使用标准化」**。标准化会改变数据的状态分布但不会改变分布的种类。特别地神经网络中经常会使用到z-score归一化针对这一点我们将在后续的文章中进行详细的介绍。3、非线性归一化通常被用**「在数据分化程度较大的场景」**有时需要通过一些数学函数对原始值进行映射如对数、反正切等。归一化和标准化关系上面既有归一化也有标准化那么两者之间有什么关系呢谈到归一化和标准化可能会存在一些概念的混淆我们都知道**「归一化是指normalization标准化是指standardization」但根据wiki上对feature scaling方法的定义standardization其实就是z-score normalization也就是说标准化其实是归一化的一种而一般情况下我们会把z-score归一化称为标准化把min-max归一化简称为归一化。在下文中我们也是用「标准化指代z-score归一化」并使用「归一化指代min-max归一化」**。【有点绕】其实「归一化和标准化在本质上都是一种线性变换」。在4.归一化类型中我们提到了归一化和标准化的公式对于归一化的公式在数据给定的情况下可以令amax(x)-min(x)、bminx则归一化的公式可变形为标准化的公式与变形后的归一化类似其中的和在数据给定的情况下可以看作常数。因此标准化的变形与归一化的类似都可看作对按比例进行缩放再进行个单位的平移。由此可见归一化和标准化的本质都是一种线性变换他们都不会因为对数据的处理而改变数据的原始数值排序。「那么归一化和标准化又有什么区别呢」归一化不会改变数据的状态分布但标准化会改变数据的状态分布归一化会将数据限定在一个具体的范围内如 [0, 1]但标准化不会标准化只会将数据处理为均值为0标准差为1的状态分布。大模型归一化前面主要介绍了一些归一化的基础知识它能够提高模型训练的稳定性因为此目前大模型架构中都加入归一化。如果没有进行归一化的处理那么每一批次的训练数据的分布是不一样的从大的方向上来看神经网络则需要在这多个分布当中找到平衡点从小的方向上来看 由于每层的网络输入数据分布在不断地变化 那么会**「导致每层网络都在找平衡点显然网络就变得难以收敛」**。常见的模型归一化方法有批量归一化Batch NormBN、层归一化Layer NormLN、RMS Norm、Deep Norm。批量归一化(BN)假设输入数据的形状是 其中 是batch size 是特征向量维度。这 个输入特征每个都有不同的含义如我们前面的例子假如第一个元素是房子到地铁站的距离第二个元素是房子的房间数因此做normalization的时候这 个特征分别来做。其中 ϵ 是为了防止分母为0。这个在实际代码中挺重要的忘记加可能会出问题。经过这样的变换之后在 C 个特征维度上就是均值为0方差为1的分布了。不过这还没完每个维度的数值全部归一化之后对于激活函数来说更集中在中间的部分而这部分的非线性特征并不强这样非线性激活层近似了一个线性变换这样就降低了模型的学习能力。如下图且无论输入是什么最终输出都会被强行拉到这样一个“平均”的值也极大抑制了模型的表达能力。「所以为了保证模型的能力也保证非线性能力的获得对每个特征又增加两个可学习的参数」缩放参数 和位移参数 这两个参数都是通过模型学习得到的。这样每个特征值就有机会从“线性区”移动到“非线性区”把被归一化削弱的非线性能力找了回来。并且通过这样一个归一化再重新缩放移动的操作解耦了上层输出分布和下层输入本来下层参数要去适应上层分布变化现在只需要通过每个batchnorm层中的 和 直接学习就行了训练变得简单了。具体算法如下参考https://arxiv.org/pdf/1502.03167批归一化BN通常用于卷积神经网络CNNs在具有大数据集和较大批大小的情况下效果较好。层归一化(LN)上面介绍的批归一化在批次维度上计算统计量其依赖于批次的大小。「而层归一化针对单个样本的特征进行归一化操作与批归一化Batch Normalization不同它沿着特征维度而非批次维度进行统计计算」。它最早由Geoffrey Hinton团队于2016年提出。它对解决深度神经网络训练中的问题具有显著效果。对于一个输入张量层归一化计算每个样本内所有特征的均值和方差然后用这些统计量对特征进行归一化。其最主要的应用就是NLP的模型包括RNN、Transfomrer模型当然也包括当前的大模型架构。下面是BN和LN的对比图相比BN归一化LN归一化的维度似乎解释性没那么强。BN是对同一个特征比如计算房子距离地铁站的距离均值是有意义的而layernorm在不同的特征比如房子距离地铁站的距离、房子房间个数等好像并没有可靠的物理意义。「其具体的计算过程如下」「代码实现如下」import torch import torch.nn as nn # 手动实现层归一化 deflayer_norm_manual(x, gamma, beta, eps1e-5): # x: [batch_size, feature_dim] mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, unbiasedFalse, keepdimTrue) x_norm (x - mean) / torch.sqrt(var eps) return gamma * x_norm beta # 使用PyTorch内置的LayerNorm layer_norm nn.LayerNorm(normalized_shape512) # 特征维度为512 output layer_norm(input_tensor)BN VS. LN归一化为什么目前大多数大模型都采用层归一化呢下面将给出具体的解释。在Transformer中一般输入的形状是 是序列长度每个样本的长度可能不同因此在这个维度需要使用padding一般是zero-padding来把batch内的数据处理成一样长。比如这样一批文本输入:我 爱 中 国 你 好 谢 谢 你为了使模型能够统一处理通过padding将文本变成以下内容我 爱 中 国 你 好 [P] [P] 谢 谢 你 [P]可以发现由于存在padding的存在做BN归一下显然是不合适的比如上面的例子对「[“中”“[P]”“你”]」做BN归一化由于 [P] 的存在实际的batch size只有2并且和 [P] 做归一下也对训练没什么帮助。而且对于文本数据batch内同一个位置上的字是不同的对完全没有关系的字进行归一化也并没有什么意义。也就是说哪怕没有 [P] 的存在比如对第一个token「[“我”“你”“谢”]」做归一化直觉上也不太有物理意义。因此使用LN归一化在 维度上进行归一化同时有 个γ 和β 需要学习。相当于计算每一句输入内每个token所有特征之间的均值和方差来进行归一化。除此之外由于layernorm不需要再batch维度上计算均值和方差所以不存在训练和推理的时候不一样的地方不用保存一个全局的均值和方差供推理的时候使用。而由于LN归一化和batch无关也就不会受到batch size大小的影响。文章《PowerNorm: Rethinking Batch Normalization in Transformers》研究了transformer中BN为啥表现不太好。其研究结果发现BN归一化在NLP任务上IWSLT14batch的均值和方差一直震荡偏离全局的running statistics而在CV任务上震荡更小且训练完成后也没有离群点。总结来说「Transformer中BN表现不太好的原因可能在于CV和NLP数据特性的不同对于NLP数据前向和反向传播中batch统计量及其梯度都不太稳定」。更重要的是实际效果就是LN归一化在NLP任务上的效果比BN归一化好。RMSnorm归一化「RMSnorm是LN归一化(Layer Normalization)的变体」其最早在论文《Root Mean Square Layer Normalization》中提出。为了提高层归一化的训练速度RMSNorm简化了传统Layer Normalization的计算流程移除了均值中心化步骤只保留了均方根缩放操作。其核心思想是通过特征的均方根RMS值来归一化数据减少计算量的同时保持良好的性能。「其具体计算过程如下」其中是一个小常数用于数值稳定性是可学习的缩放参数逐元素乘法是可学习的偏移参数通常在RMSNorm中省略「pytorch代码实现」import torch import torch.nn as nn classRMSNorm(nn.Module): def__init__(self, dim, eps1e-6): 初始化RMSNorm 参数: dim: 特征维度 eps: 数值稳定性常数 super().__init__() self.scale nn.Parameter(torch.ones(dim)) self.eps eps defforward(self, x): 应用RMSNorm 参数: x: 输入张量形状为 [..., dim] # 计算RMS rms torch.sqrt(torch.mean(x ** 2, dim-1, keepdimTrue) self.eps) # 归一化 x_norm x / rms # 应用缩放参数 return self.scale * x_norm「RMSNorm归一化对比LN归一化」「计算简化」RMSNorm移除了均值中心化步骤只关注特征的缩放「计算效率」RMSNorm计算更高效减少了约30%的计算量「参数使用」标准RMSNorm通常只使用缩放参数 不使用偏移参数使用 RMSNorm 的 Transformer 模型相比于之前使用 LayerNorm 训练的模型在训练速度和性能上均具有一定优势。成为了现代大语言模型的标准组件例如ChatGLM、Llama、Qwen、DeepSeek等都使用该方法进行归一化。在实践中当模型规模增大或追求训练/推理速度时RMSNorm往往是比Layer Normalization更优的选择。DeepNorm归一化DeepNorm源于微软2022年的一篇文章《DeepNet: Scaling Transformers to 1,000 Layers》。对比LN归一化DeepNorm归一化增加了深度自适应的缩放机制。它是一种专为超深度神经网络设计的归一化技术「主要用于解决训练极深层网络时出现的梯度消失和爆炸问题」。它是对传统归一化方法的扩展和改进「特别适用于有数百甚至上千层的深度模型」。DeepNorm在 LayerNorm 的基础上在残差连接中对之前的激活值 按照一定比例进行缩放能够更好地支持层数扩展。其计算公式如下其中表示 Transformer 层中的前馈神经网络或注意力模块。其中 是根据模型参数定的常数。这里相比post-norm提升了恒等分支的权重使训练更容易进行。另外还用了一个 参数把 中的参数进行了缩小以此来稳定模型的训练。相关代码如下归一化模块位置归一化模块的位置对于训练稳定性也具有重要影响。如下图所示「归一化模块的位置通常由三种选择」分别是层后归一化post-layer normalizationPostNorm、层前归一化pre-layer normalizationPreNorm和夹心归一化sandwich-layer normalizationSandwichNorm。对于最原始的Transformer架构来说其主要是PostNorm如上图所示。Post-Norm原始 Transformer 模型使用了PostNorm归一化技术「将归一化模块放置于残差计算之后」计算公式如下其中Norm 表示任意一种归一化方法。从原理上PostNorm 具有很多优势。首先Post-Norm 有助于加快神经网络的训练收敛速度防止模型出现梯度爆炸或者梯度消失的问题从而减少训练时间。其次Post-Norm 可以降低神经网络对于超参数如学习率、初始化参数等的敏感性使得神经网络更容易进行调优。**「然而由于输出层附近的梯度可能较大PostNorm 有时会引发训练不稳定的现象。因此在预训练的大语言模型中Post-Norm 很少被单独使用通常是与其他策略相结合应用。」**例如GLM-130B 既采用了 PostNorm 和 DeepNorm。Pre-Norm.与 Post-Norm 不同PreNorm**「将归一化模块应用在每个子层之前」**。其计算公式如下顾名思义PreNorm 在每个子层前添加了一个归一化模块。由于针对每个模块输入的表示进行归一化可以缓解梯度爆炸或者梯度消失问题。此外PreNorm 在最后一个 Transformer 层后还额外添加了一个 LayerNorm。「相比较于 PostNormPreNorm 虽然在性能上略有逊色但是在训练过程中更加稳定」。「因此很多主流的大语言模型都采用了PreNorm」。SandwichNorm在 Pre-Norm 的基础上SandwichNorm「在残差连接之前增加了额外的 LayerNorm主要是为了避免 Transformer 层输出出现数值爆炸的情况」。其具体的实现方式如下本质上Sandwich-Norm 可以看作 Pre-Norm 和 Post-Norm 两种方法的组合理论上具有更好的归一化效果。「但是研究人员发现Sandwich-Norm 有时仍然无法保证大语言模型的稳定训练甚至会引发训练崩溃的问题」。最后的最后感谢你们的阅读和喜欢作为一位在一线互联网行业奋斗多年的老兵我深知在这个瞬息万变的技术领域中持续学习和进步的重要性。为了帮助更多热爱技术、渴望成长的朋友我特别整理了一份涵盖大模型领域的宝贵资料集。这些资料不仅是我多年积累的心血结晶也是我在行业一线实战经验的总结。这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。如果你愿意花时间沉下心来学习相信它们一定能为你提供实质性的帮助。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】大模型知识脑图为了成为更好的 AI大模型 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。经典书籍阅读阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价