LayerNorm
LayerNorm(层归一化),多用于NLP
![[Pasted image 20260507183851.png]]
LayerNorm做了什么
对于一个样本的几个特征,也许他们的特征值分布太分散。比如一个人的年收入是10000000,但是他的身高体重是180cm和70kg。那么这个数据传递给下一个网络时,年收入的权重就会远远盖过身高体重等。让模型的训练只由某个特征主导。
所以我们需要让一个样本的特征值在数值范围上接近,对单个样本的所有特征进行归一化,也就是使其均值为0、方差为1。
LayNorm解决了什么
一般来说我们认为它解决了两个问题
- -内部协变量偏移
名词听起来很抽象,首先你需要知道模型的训练过程。
前向传播 → 计算损失 → 反向传播 → 计算梯度 → 更新所有层的参数(W1,W2,W3…)
1 | # 假设一个3层网络 |
我们知道模型训练过程中是参数是会不断更新的,以此来变化下一层的输入。那么如果有一个数值过于大,大的纬度就会主导梯度,其他维度被忽略。并且更新时由于过大过小,模型需要猛踩刹车或者猛踩油门,也就是w的变化会忽大忽小而不能做出有效调整。
- 梯度消失与梯度爆炸
前面提到,数据范围分散会导致更新时输出值过大过小,分别会导致梯度爆炸与消失- 梯度爆炸:数值范围层层放大(例如每层放大10倍),传递到输出层时已达天文数字。反向传播时,这些巨大数值相乘,导致梯度超过
float 32表示范围,变成inf(无穷大)。模型瞬间崩坏,Loss 直接变成NaN。这就是你说的“超范围”。 - 梯度消失:数值范围层层缩小(例如每层缩小到 0.1 倍),传递到输出层时已接近 0。反向传播时,多次乘以小于 1 的数,梯度变成
0。模型再也学不到任何东西,Loss 永远不降。
- 梯度爆炸:数值范围层层放大(例如每层放大10倍),传递到输出层时已达天文数字。反向传播时,这些巨大数值相乘,导致梯度超过
LayerNorm的具体实现
前文提到,我们需要对一个样本的每个特征进行归一化,也就是方差为1均值为0
公式:
![[Pasted image 20260507191827.png]]
例如一个样本如下:原始数据:[25, 500000, 8000]
μ≈169341.67
σ≈233,760
归一化后的值=x−μ/σ
经过 LayerNorm 处理后:[-0.724, 1.415, -0.690]
(公式里的 γ 和 β 是两个可学习的参数。网络训练时可以调整它们。
比如,假设网络学习到 γ=2,β=0.5γ=2,β=0.5,那么最终输出就是:
- −0.724×2+0.5=−0.948−0.724×2+0.5=−0.948
- 1.415×2+0.5=3.331.415×2+0.5=3.33
- −0.690×2+0.5=−0.88−0.690×2+0.5=−0.88
这样网络就有了灵活性:如果原始分布是最好的,它可以把 γ=1,β=0γ=1,β=0 学回来;如果另一种分布更好,它可以调整。)
这样下来你得到了什么?
- 范围接近了:原来的 25 和 500000 相差 2 万倍,现在 -0.724 和 1.415 相差只有 2 倍左右。收入高的特征不再“欺负”其他特征了。
- 以0为中心:数据现在有正有负,大致分布在 -1 到 +1 之间。
- 分布标准:这组新数据的均值是 0,标准差是 1。你可以快速验证一下:(−0.724+1.415−0.690)/3≈0(−0.724+1.415−0.690)/3≈0(均值0),离散程度也标准化了。
LayerNorm在Transformer里的运用
![[Pasted image 20260507193403.png|345]]
这是Transformer的解码器架构
[[Add]] & Norm层
它实际上由两个独立的操作组成:残差连接(Add) 和 层归一化(Layer Normalization, Norm)。这两个操作协同工作,极大地提升了 Transformer 的训练稳定性、收敛速度和最终性能。
Norm 操作接收来自 Add 的输出(原始输入 + 子层变换)。这个组合信号的分布可能会剧烈变化,尤其是在训练初期。LN 将其“拉回”到一个相对稳定(均值为0,方差为1)的分布,极大地减少了训练的不稳定性,显著加快了收敛速度。γ 和 β 让模型能自适应地调整这个分布。
2.2 与[[BatchNorm]]的对比
| 特性 | BatchNorm | LayerNorm |
|---|---|---|
| 统计量计算 | 沿批次维度(N)计算 | 沿特征维度(C/H)计算 |
| 依赖关系 | 依赖批量大小 | 与批量大小无关 |
| 适用场景 | CNN | RNN、Transformer |