大模型基础 | 归一化的作用
Transformer中归一化介绍
归一化(Normalization)是一种数据处理技术,旨在将数据调整到标准范围或分布,以确保模型训练的效率和性能。
归一化的作用
我们通过一个直观的图片来了解归一化的作用,如下图所示
中心点数学含义
首先我们先了解一下中心点的数学含义在二维等高线图中,中心点是等高线最密集收敛的地方,表示其梯度为零(∇L = 0),二阶导数为正(Hessian矩阵正定),这正是优化算法(如梯度下降)要寻找的最优解。
比较直观的理解
想象你站在一个碗的底部(中心点),无论你往哪个方向走,都会“上坡”,损失都会变大。
因此,中心点就是**“无处可逃”的最低点**,也就是最优解。
归一化作用
假设上面这个图W1和W2,分别表示你在训练一个预测房价的线性回归模型输入特征有两个:
| 特征 | 含义 | 取值范围举例 |
|---|---|---|
| W1 | 房屋面积(平方米) | 50 ~ 500 平方米 |
| W2 | 房间数 | 1 ~ 5 |
❎ 未归一化
- W1(面积)数值大(几十到几百) ,对损失函数影响大,梯度更新剧烈。
- W2(房龄)数值小(1~5) ,对损失函数影响小,梯度更新缓慢。
导致我们在优化时,模型在 W1方向震荡大,在 W2方向更新慢,形成左图那种椭圆形的等高线。在做梯度下降时,优化的方向不是朝着中心点去,收敛慢,甚至难以收敛。
✅ 归一化后
- 把面积缩放到 0~1 或标准化为均值0方差1。
- 房龄也做同样处理。
两个特征尺度统一,梯度更新更平衡,等高线变圆,优化路径更直接,收敛更快更稳定(右图)。
梯度下降
在讲归一化在模型训练的另一个作用时,我们先说一下什么是梯度下降。
我们同样用预测房价来举例子
想象一下,我们用一个非常简单的公式来预测房价,这个公式只考虑两个因素:房子面积和房间数。
预测房价 = w1 * 面积 + w2 * 房间数 + b
这里:
w1 和 w2 是“权重”。我们可以把它们理解成“重要性”。比如,w1 可能等于 1000,意味着每平方米对房价的贡献是1000元;w2 可能等于 50000,意味着每多一个卧室,房价增加5万元。
b 是“偏差”,可以理解成一个基础起步价,比如城市的基本地价是20万元。
机器学习的任务就是通过大量的房屋数据,找到最准确的 w1, w2 和 b 的值。
梯度(Gradient)是什么?
在这个例子里,“梯度”就是指误差相对于每个权重(w1, w2)的变化率。
通俗理解:想象你蒙着眼睛在山坡上(这座山叫“误差山”),你的目标是走到山谷的最低点(误差最小的地方)。你每走一步,都会用脚感觉一下哪个方向是下坡最陡的。这个“下坡最陡的方向和陡峭程度”就是梯度。梯度会告诉你:“嘿,往这个方向调整你的权重 w1,误差会下降得最快!”
比如预测房价公式为
ŷ = w1 *x1(面积) + w2 * x2(卧室数量) + b
ŷ (y-hat):表示模型预测的房价
x1:面积(单位:平方米)
x2:卧室数量(个)
w1, w2:我们需要寻找的权重
b:偏差(基础价格)
损失函数
我们需要一个标准来衡量预测值 ŷ 和真实房价 y 之间的差距。最常用的损失函数是均方误差 (MSE)。对于单个数据点,损失 L 为:
L=(1/2)∗(y^−y)2L = (1/2) * (ŷ - y)^2L=(1/2)∗(y^−y)2
为什么有个 1/2? 是为了后续求导时,可以和平方项的2约掉,让公式更简洁。这对优化结果没有影响。
损失函数的目标为找到一组 w1, w2, b,使得损失LLL 的值最小。
梯度计算方法
上面描述了梯度计算掌握前置知识点,接下来就真正介绍一下梯度是怎么计算的
梯度就是损失函数 L 分别对每个参数(w1, w2, b)的偏导数。
其公式分别为 ∂L/∂w1∂L/∂w1∂L/∂w1 ∂L/∂w2∂L/∂w2∂L/∂w2
这里需要用到微积分中的链式法则。
我们目标是求 ∂L/∂w1 和 ∂L/∂w2。
1. 首先,计算损失 L 对于预测值 ŷ 的梯度:L = (1/2) * (ŷ - y)^2∂L/∂ŷ = (1/2) * 2 * (ŷ - y) = (ŷ - y)
2. 接下来,计算预测值 ŷ 对于权重 w1 的梯度:ŷ = w1*x1 + w2*x2 + b∂ŷ/∂w1 = x1 (因为 w2*x2 和 b 对 w1 求导都是0)∂ŷ/∂w2 = x2∂ŷ/∂b = 1
3. 最后,运用链式法则,组合起来:∂L/∂w1 = (∂L/∂ŷ) * (∂ŷ/∂w1) = (ŷ - y) * x1∂L/∂w2 = (∂L/∂ŷ) * (∂ŷ/∂w2) = (ŷ - y) * x2∂L/∂b = (∂L/∂ŷ) * (∂ŷ/∂b) = (ŷ - y) * 1 = (ŷ - y)
梯度计算公式最终推导:
对于任何一个数据点 (x1, x2, y):
∂L/∂w1 = (预测值 ŷ - 真实值 y) * 对应的特征值 x1∂L/∂w2 = (预测值 ŷ - 真实值 y) * 对应的特征值 x2∂L/∂b = (预测值 ŷ - 真实值 y)
举个例子:
假设我们有一套房子的数据:
- 真实房价
y = 300(万元) - 面积
x1 = 100(平方米) - 卧室
x2 = 2(个)
假设我们模型当前的参数是随机初始化的:
w1 = 2.0w2 = 50.0b = 10.0
计算过程:
- 计算预测值 ŷ:
ŷ = 2.0*100 + 50.0*2 + 10.0 = 200 + 100 + 10 = 310万元 - 计算预测误差:
(ŷ - y) = 310 - 300 = 10万元(我们高估了10万元) - 计算梯度:
∂L/∂w1 = (10) * 100 = 1000∂L/∂w2 = (10) * 2 = 20∂L/∂b = (10) * 1 = 10
可根据公式∂L/∂w1∂L/∂w1∂L/∂w1 和 ∂L/∂w2∂L/∂w2∂L/∂w2 计算梯度可得到,∂L/∂w1∂L/∂w1∂L/∂w1的幅度1000相对于∂L/∂w2∂L/∂w2∂L/∂w2的幅度这个很大的值,说明 w1 对这次误差的影响非常大,这里w1和w2取值范围的不相同,我们可以引出梯度消失的问题。
❎ 数据未归一化会加剧梯度消失
现在,我们结合您的问题,重点看不做归一化如何引发或加剧梯度消失。
假设我们的房价预测特征差异巨大:
x1(面积):取值范围是[50, 200](平方米)x2(卧室数量):取值范围是[1, 5](个)
1. 梯度值直接依赖于输入特征值
回忆一下权重w1的梯度计算公式:∂L/∂w1 = (ŷ - y) * x1
请注意,x1直接乘在了误差项上!- 对于
x1(面积):它的值大约是100左右。 - 对于
x2(卧室):它的值大约是3左右。
这意味着,即使对于相同的预测误差(ŷ - y),不同特征对应的权重梯度天生就在不同的数量级上: ∂L/∂w1≈ 误差 * 100∂L/∂w2≈ 误差 * 3
w1的梯度会远远大于w2的梯度。这会导致模型非常不稳定,对于大数值特征权重的更新会非常猛烈,而对于小数值特征权重的更新会非常缓慢。这种缓慢的更新,在深层网络中累积起来,表现出的现象就是一种由数据分布引起的梯度消失——某些特征的梯度因为输入值太小而“消失”了。
❎ 导致激活函数进入饱和区(从而引发真正的梯度消失)
这是更关键的一点。未归一化的数据,经过第一层线性计算后,会得到非常大或非常小的值。z = w1*x1 + w2*x2 + b
由于x1的值很大,z的值很容易就会变成一个非常大的数(正或负)。
现在,如果激活函数是Sigmoid或Tanh:
- 当输入
z是一个很大的正数或负数时,函数会进入“饱和区”。 - 在饱和区,函数的导数几乎为0。
这里我们说明一下sigmoid的含义,我们可根据下图可看到,当z的值无穷小或者无穷大时,sigmoid(z)求导出来的值就比较小几乎为0,这里求导值就是斜率,同时我们可以看出来在z为零附近,即sigmoid(z)的斜率最大。
连锁反应发生了:
- 未归一化的大数据 → 输入到神经元的值
z非常大 z非常大 → 激活函数(如Sigmoid)输出饱和(接近1或0)- 激活函数饱和 → 其导数接近0
- 导数接近0 → 反向传播经过该神经元时,梯度被乘以一个近乎0的数
- 梯度消失!
解决梯度尺度差异巨大问题
问题回顾:未归一化时,面积(x1≈100)的梯度远大于卧室数(x2≈3)的梯度,导致模型更新不稳定。
归一化的作用:
我们对每个特征进行独立归一化:
面积从 [50, 200] 被缩放至 [0, 1]卧室数从 [1, 5] 被缩放至 [0, 1]
现在,所有特征值都在相同的尺度(0到1之间)。
再看梯度公式:∂L/∂w1 = (ŷ - y) * x1_norm∂L/∂w2 = (ŷ - y) * x2_norm
由于 x1_norm 和 x2_norm 现在都是0到1之间的小数,∂L/∂w1 和 ∂L/∂w2 的值的数量级变得相同。
结果:
- 稳定训练:所有权重的更新步长变得相对均衡,模型不会因为某个特征的数值大而“偏爱”它。
- 统一学习率:我们可以为所有权重设置一个相同的学习率
α,而不必担心某些权重更新太快(爆炸)而另一些更新太慢(消失)。
更多推荐


所有评论(0)