Module 1 · Transformer
Lesson 10
Block 零件 2/3
LayerNorm
残差的搭档。作用只有一个:在数据进下一步之前,把每个向量的数值"重新校准"到一个稳定、标准的范围,让训练不乱飘。
① Why — 数值会"漂"
向量流过一层又一层,每层都做加法、乘法、加 delta……数值的尺度会失控:乘法让某些维度指数级越变越大、某些越变越小,层与层之间尺度差好几个数量级。
这会让训练很难受:
- 尺度爆炸/消失 → 梯度跟着爆炸或消失 → 学习率难选、训练不稳(而且训练中权重在变,尺度还不可预测)。
- 某个维度数值特别大 → 主导了后续计算,淹没其它维度的信息。
我们想要:每进下一步之前,先把向量的数值拉回一个统一、温和的范围。这就是 LayerNorm。(呼应缩放点积课的 ÷√d——都是"别让数值失控",LayerNorm 是更通用的那把尺子。)
② What — 把一个向量标准化
对一个词向量(d_model 个数)做三步:
- 算这一个向量自己的均值 μ 和标准差 σ(对它的 d_model 个分量统计)。
- 标准化:每个分量减 μ、除以 σ → 这个向量变成 均值 0、标准差 1(数值被拉到统一尺度)。
- 缩放 + 平移:再乘一个可学习的 γ、加一个可学习的 β → 让模型能按需调整"标准化的力度"。
x̂ᵢ = (xᵢ − μ) / √(σ² + ε) → yᵢ = γᵢ · x̂ᵢ + βᵢ
ε 是个极小数,只为避免 σ=0 时除以零。γ、β 各有 d_model 个,是学出来的参数。
把一个向量的各分量减均值、除标准差 → 数值居中、尺度统一。每个词向量各自独立做一遍。
③ 关键点
- "Layer"的含义:对每个词向量单独做——只在它自己的 d_model 个分量之间统计均值/标准差,不跨其它词、不跨其它样本。所以处理一个词不依赖别的词,变长序列、逐字生成都不受影响。
- γ、β 让归一化"可调":强行把每个向量都压成"均值0标准差1"可能太死板;γ(缩放)和 β(平移)是学出来的,让模型能把尺度调回它需要的样子。相当于"先标准化,再让模型自己决定要不要放大/偏移"。
- 稳训练:数值被约束在温和范围 → 梯度稳定 → 可以用更大学习率、训得更快更稳。
④ 在 Transformer 里:Add & Norm
它和残差是搭档,每个子层配一组,合称 "Add & Norm":
x = LayerNorm( x + 多头注意力(x) )
x = LayerNorm( x + FFN(x) )
Add = 残差把 x 加回来;Norm = LayerNorm 把结果校准。两者一起:既有梯度高速路,又有数值稳定。
🅿️ 小注(不展开):LayerNorm 放"残差相加之后"(Post-LN)还是"子层之前"(Pre-LN)有两种流派,现代大模型多用 Pre-LN(更稳)。细节以后需要时再说,今天记住"残差 + 归一化搭档"即可。
💬 深入问答(来自讨论)
Q:可以理解为"控制每个词向量的长度在一个区间"吗?
方向对(都是"控尺度"),但两点要拧准:
- 控制的是数值分布,不是直接固定长度。 LayerNorm 让向量均值0、标准差1,而非把模长设成定值。副产品:标准化后模长 ≈ √d_model 附近,所以"长度落在某范围"是近似的副作用,不是直接目标。
- 还做了"居中"。 "控长度"只体现除以标准差(缩放)那半;LayerNorm 还减均值(居中到0)。完整是"居中 + 统一尺度"两步。
升级说法:把"控制长度"改成"标准化数值分布(均值0标准差1)+ 居中",就精确了。
Q:γ、β 不是写死的,那怎么学?不会又数值失控吗?
怎么学:和其它参数一样由梯度下降学(各 d_model 个)。初始 γ=1, β=0——即一开始 LayerNorm 就是"纯标准化,不缩放不平移"(γ·x̂+β = x̂),从干净起点再慢慢调。
为什么不失控(可控 vs 失控的区别):
- γ/β 是被梯度实时监督的参数,不是被动漂移的激活值。调过头导致误差上升,下一步梯度就拉回来——有反馈闭环。
- 下一层入口的 LayerNorm 会再次归一化,所以某层的放大不会跨层累积。而"失控"恰恰是无人管的激活值层层叠加放大。
- 通常还有权重衰减/正则轻微抑制参数过大(Module 4 细讲)。
一句话:LayerNorm 不是"禁止数值变大",而是把尺度变成一个被学习、被每层重置的可控量,而非无人看管地乱漂。
Q:"均值0标准差1"和"γ/β 学出来"矛盾吗?
不矛盾,是两个时间点:减均值除标准差那一刻,输出确定是均值0标准差1(纯数学,不学);随后乘 γ 加 β,尺度被调走(γ/β 是学出来的)。所以最终输出不一定还是 0/1(初始 γ=1、β=0 时才正好保持)。
Q:数值失控是"忽高忽低"吗?给个具体例子。
不是"来回波动"——用词纠正:一次前向内趋势是单调的(爆炸或消失)。具体例子:一个向量里两个分量 A、B 都从 2 出发,某层里 A 每层被 ×1.4、B 被 ×0.6:
真正的问题是三点(都不是"抖动"):① 尺度指数爆炸/消失;② 维度间极度不均(A=1675 淹没 B);③ 跨训练步不可预测(权重每步在变,乘数 1.4 下步可能变 1.6…,第 30 层尺度在训练步之间乱跳)。LayerNorm 每层把尺度重置成均值0标准差1 → 消除"尺度"这个变量,每层都在标准环境里工作。
✅ 快速检查(用自己的话答)
- LayerNorm 对一个向量做了什么?(两步:标准化 + 什么)标准化后这个向量的均值和标准差大约是多少?
- 为什么需要它?数值"漂移"会给训练带来什么麻烦?
- "Layer" 的意思是它对谁单独做统计?(一个词向量内部 / 跨所有词 / 跨所有样本)
答完这 3 题,下一课 FFN(前馈网络)——Block 的最后一个零件,然后就能拼出完整 Transformer Block 了。