大模型训练原理(15)|80 层 Transformer 为什么没有把自己“改坏”?Residual 和 RMSNorm 真正守住的是什么
上一课,我们把 Transformer 里那个经常被一笔带过的 MLP 拆开了。
到那里,一个 Token 在 Transformer Block 里已经会做两件事:
Attention(注意力)负责跨 Token 找信息,MLP(多层感知机)负责在 Token 内部继续加工这些信息。
换句话说,一层 Transformer 已经可以完成一轮:
信息交换 → 特征加工。
但问题也正是在这里出现的。
如果一层会修改一次 Representation(表示),那么 32 层就修改 32 次,80 层就修改 80 次。
那最开始的信息呢?
会不会改着改着就没了?
更麻烦的是,训练时最后一层产生的 Gradient(梯度),又怎么穿过几十层,一路找到最前面的参数?
这正是上一课故意留下来的问题,也是课程设计里第十五课要接住的核心:Residual Connection(残差连接)、LayerNorm(层归一化)、RMSNorm(均方根归一化),以及 Pre-Norm / Post-Norm 到底为什么存在。
这一课我不想让你背四个名词。
我想让你最后真正看见一件事:
Transformer 之所以能做深,不是因为每一层都可以随便改,而是因为架构从一开始就在控制“怎么改、改多少、旧信息怎么继续往后走”。
一、先把 Transformer 想象成一份被连续修改 80 次的文档
假设一个 Token 刚进入 Transformer 时,它的 Representation 是:
x0
第一层处理以后:
x1=F1(x0)
第二层:
x2=F2(x1)
第三层:
x3=F3(x2)
一直到第 80 层:
x80=F80(F79(⋯ F1(x0)))
数学上当然没问题。
但从工程直觉看,这个设计其实挺吓人的。
你可以把 (x_0) 想象成一份非常重要的合同。
第一个人拿过来修改,保存。
第二个人只能拿到第一个人改过的版本,再继续修改。
第三个人再改。
第四个人继续。
整整 80 个人。
没有原稿。
没有版本历史。
没有撤销。
后面的人永远只能拿到前面的人已经修改过的版本。
现在问题来了:
如果第 17 个人把一句重要内容改没了,第 18 个人甚至不知道那里以前存在过什么。
神经网络同样如此。
如果每一层都必须:
彻底用新 Representation 覆盖旧 Representation,
深度越大,信息传播就越困难。
而且反向传播时也有同样的问题。
最后的 Loss(损失)需要把“哪里错了”一路传回第一层。
网络越深,这条路越长。
所以深层网络真正困难的从来不只是:
“算得多。”
而是:
前向传播时,信息还能不能走过去;反向传播时,梯度还能不能走回来。
这才是 Residual Connection 出现的真正背景。
二、Residual 最重要的,不是“多了一个加号”
如果没有 Residual,一层网络可以写成:
xl+1=F(xl)
什么意思?
当前这一层接收到:
xl
然后必须输出一个完整的新 Representation:
xl+1
也就是说,这一层承担的是:
Full Rewrite
完整重写。
它必须回答:
“经过我这一层以后,新的 Representation 到底应该长什么样?”
这其实是一个很重的任务。
Residual Connection 换了一个完全不同的思路:
xl+1=xl+F(xl)
表面看:
只是多加了一个 (x_l)。
但真正的变化是:
这一层的工作职责变了。
它不再需要回答:
“新的 Representation 应该是什么?”
它只需要回答:
“原来的 Representation 基本保留,我这一层应该在上面补充什么?”
于是我们甚至可以把:
F(xl)
重新理解成:
Δ xl
那么公式变成:
xl+1=xl+Δ xl
突然就好理解了。
这一层不是重新创造 (x_{l+1})。
而是在已有 (x_l) 上:
做一次增量修改。
这就是 Residual 最值得记住的地方。
Residual 真正改变的不是公式,而是每一层的任务:从“重新创造整个表示”,变成“只学习这一次应该修改什么”。
三、Transformer 的几十层,其实更像“不断改稿”
举一个特别简单的数字例子。
假设某个 Token 当前的 Representation 是:
xl=
[10,\ 20,\ 30]
这一层 Attention 或 MLP 计算以后认为:
当前只需要做一点调整:
Δ xl=
[1,\ -2,\ 0.5]
那么:
xl+1
xl+Δ xl
得到:
[11,\ 18,\ 30.5]
看到区别了吗?
这一层并没有说:
“前面的东西全部作废,我重新生成一份。”
而是在说:
“前面的东西先留下,我只负责把自己学到的新东西补进去。”
于是第一层:
x1=x0+Δ x0
第二层:
x2=x1+Δ x1
第三层:
x3=x2+Δ x2
……
深度突然有了一个非常不一样的理解:
Iterative Refinement
迭代精炼。
模型不是一层层把 Representation 推倒重建。
更像是:
第一层改一遍。
第二层根据修改后的结果继续改。
第三层继续精炼。
第四层再补充新的信息。
所以以后看到:
“80-layer Transformer”
不要只理解成:
“80 个模块摞起来。”
更值得理解的是:
同一条 Representation,在 80 个阶段里被持续加工和精炼。
这就是深度真正有意义的地方。
四、Residual 还有一个特别聪明的性质:这一层暂时不会,也可以少添乱
再看:
xl+1=xl+F(xl)
现在假设某一层暂时没有学到什么有价值的东西。
如果:
F(xl)≈0
那么:
xl+1≈ xl
也就是说,这一层至少存在一种比较简单的状态:
Identity Mapping
恒等映射。
输入什么,基本继续传什么。
这件事非常重要。
如果没有 Residual:
你增加一层网络,就等于新增了一次必须执行的完整 Transformation(变换)。
这一层如果学不好,它照样会改变 Representation。
有了 Residual:
新增的一层至少可以先学到:
“我目前没什么好改的,那就少改一点。”
所以我特别喜欢用一句话理解它:
Residual 不要求每一层都成为天才,它至少允许一层在没学明白的时候,先别把前面的成果毁掉。
当然,这只是理解方式。
真实训练里 (F(x)) 不会永远接近 0,模型也完全可能对 Representation 做很强的改变。
但 Residual 提供了一条非常重要的:
Identity Path
恒等路径。
旧 Representation 有一条相对直接的路可以继续往后走。
而这条路不仅对前向传播重要。
到了反向传播,它还会再救模型一次。
五、为什么一个小小的加号,会让 Gradient 更容易往前传?
这里稍微碰一点数学。
但这一段一定值得看懂。
没有 Residual 时:
xl+1=F(xl)
那么:
∂ xl+1∂ xl
∂ F(xl)∂ xl
如果整个模型特别深,反向传播时 Gradient 需要连续经过很多层。
可以粗略想象成不断乘:
JLJL-1JL-2⋯ J1
这里的 (J) 是 Jacobian(雅可比矩阵)。
不用学雅可比矩阵的完整数学。
你现在只需要知道:
它描述了“这一层的输出对输入变化有多敏感”。
问题在于,这么多东西一路乘下去:
如果整体不断变小,Gradient 就可能越来越弱。
这就是:
Vanishing Gradient
梯度消失。
如果整体越来越大:
就可能出现:
Exploding Gradient
梯度爆炸。
现在加入 Residual:
xl+1=xl+F(xl)
再求导:
∂ xl+1∂ xl
I+
∂ F(xl)∂ xl
看见了吗?
突然多了一个:
I
Identity Matrix。
单位矩阵。
这个 (I) 就来自那条:
xl
直接加到下一层的路径。
这意味着 Gradient 不再只能穿过:
F
那一整套复杂计算。
它还有一个来自 Identity Path 的直接贡献。
如果暂时不谈数学,可以把它理解成:
没有 Residual:
梯度想回去,只能穿过加工厂。
有了 Residual:
加工厂旁边多了一条相对直接的通道。
所以 Residual 的价值有两面。
前向:
让已有 Representation 更容易继续传播。
反向:
让 Gradient 拥有更直接的传播路径。
但注意,我故意没有说:
“Residual 解决了梯度消失。”
这种话太绝对。
Residual 会显著改善深层网络的 Optimization(优化)条件,但训练稳定性还受:
Learning Rate(学习率)、Initialization(初始化)、Optimizer(优化器)、Normalization(归一化)、Precision(数值精度)等很多因素影响。
更严谨的表述应该是:
Residual Connection 为 Representation 和 Gradient 都提供了更直接的跨层传播路径,从而让深层网络更容易被优化。
六、现在终于能理解一个经常出现的词:Residual Stream
以后看现代大模型论文或者源码,你会经常碰到:
Residual Stream
残差流。
如果只是把它理解成:
“模型里那些残差连接。”
其实还没有真正理解。
更好的方式是:
把它想象成 Transformer 内部一直存在的一条:
Representation 主干。
假设当前状态是:
x
Attention 不一定把 (x) 整个替换掉。
它更像在说:
“我刚刚从上下文里找回来一些有价值的信息,把它写进去。”
所以:
x'
x+Attention(⋯)
然后 MLP 接着说:
“我又对这些 Feature 做了一轮加工,再把加工结果补进去。”
于是:
x''
x'+MLP(⋯)
下一层继续。
所以整个 Transformer 里发生的事情可以换一个视角看:
Residual Stream:
保存当前工作状态。
Attention:
读取上下文,生成一次 Update(更新)。
MLP:
加工 Feature,再生成一次 Update。
然后:
这些 Update 一次次写回 Residual Stream。
这和开发里维护一个 State(状态)非常像。
有一个持续存在的状态:
State
各个模块不会每次重新创建整个 State。
它们更像提交一个 Patch(补丁):
State'=State+Patch
这就是 Residual Stream 最有价值的直觉。
Attention 和 MLP 决定“这一轮应该写进去什么”,Residual Stream 决定“前面已经形成的 Representation 还有一条路继续往后走”。
到这里,第十四课和第十五课已经真正接上了。
上一课讲的是:
Attention 和 MLP 分别负责什么计算。
这一课开始回答:
这些计算结果到底怎样在几十层之间持续积累。
七、但这时候又冒出一个问题:一直加,数值不会越来越乱吗?
我们现在有:
xl+1=xl+Fl(xl)
然后下一层:
xl+2=xl+1+Fl+1(xl+1)
再下一层继续。
几十层一直加。
那么新的问题出现了:
Representation 的数值尺度怎么办?
有些 Feature 可能越来越大。
有些非常小。
不同层接收到的输入 Magnitude(幅度)也可能不断变化。
你可以想象一个分析师每天拿到一份业务数据。
星期一:
销售额单位是“元”。
星期二:
突然换成“万元”。
星期三:
又变成“百万美元”。
数据本身都没错。
问题是:
尺度一直变。
你的分析系统每次都得重新适应。
神经网络也一样。
如果 Attention 和 MLP 每一层收到的输入 Numerical Scale(数值尺度)一直乱跑:
优化就会变得更加困难。
于是第二个关键模块出现:
Normalization
归一化。
所以 Residual 和 Normalization 根本不是两个应该分开死记的知识点。
它们是在解决同一条深层信息通路上的两个问题。
Residual 更关心:
信息有没有一条稳定的路径往后走。
Normalization 更关心:
沿着这条路传递的 Representation,数值尺度是不是好处理。
这里可以留下这一课的第二句核心金句:
Residual 保护的是“路”,Normalization 管理的是“路上传递的数值尺度”。
八、Normalization 到底是什么?先把三个误解扔掉
Normalization 不是:
“把所有数值压到 0~1。”
那更像 Min-Max Normalization(最小最大归一化)。
也不是:
Softmax。
Softmax 是把 Logits(未归一化分数)转换成概率分布。
更不是:
“让所有 Token 变得差不多。”
Transformer 里的 Normalization,更应该理解成:
对当前 Representation 的数值统计尺度进行整理。
比如当前 Token 是:
[2,\ 4,\ 6,\ 8]
另一次可能出现:
[200,\ 400,\ 600,\ 800]
它们表现出的相对 Pattern 很相似。
但 Magnitude 差了 100 倍。
如果后面的模块永远都需要同时兼容极端不同的输入尺度:
优化难度自然会增加。
所以 Normalization 做的一件重要事情就是:
先把当前 Representation 整理到一个更容易处理的数值条件下,再交给 Attention 或 MLP。
九、LayerNorm 到底干了什么?别急着背公式
经典的 LayerNorm:
Layer Normalization
层归一化。
假设一个 Token 的 Representation 有 (d) 个 Feature:
x=[x1,x2,⋯,xd]
首先计算 Mean(均值):
μ=
1d
Σi=1dxi
然后计算 Variance(方差):
σ2
1d
Σi=1d
(xi-μ)2
接着:
x̂i
xi-μ
√σ2+ε
最后再加上 Learnable Parameter(可学习参数):
yi=
γix̂i+βi
第一次看公式有点长。
但把它拆开,其实就两个核心动作。
第一件事叫:
Centering
中心化。
也就是:
xi-μ
把当前这一组 Feature 相对于自己的均值重新拉到一个中心附近。
第二件事:
Scaling
尺度调整。
再除以标准差。
所以 LayerNorm 实际上在问:
“你这一组 Feature 整体偏到哪里去了?”
以及:
“你这一组 Feature 的尺度到底有多大?”
然后统一整理。
最后为什么还有:
γ,β
?
因为神经网络并不希望 Normalization 把所有 Representation 永久固定死。
(γ) 和 (β) 允许模型在归一化之后:
继续学习自己需要的 Scale(缩放)和 Shift(偏移)。
十、一个特别容易忽略的点:LayerNorm 是每个 Token 自己整理自己
假设:
X∈ℝN× d
其中:
(N) 是 Sequence Length(序列长度)。
(d) 是 Hidden Size(隐藏维度)。
Transformer 里的 LayerNorm,通常是在当前 Token 自己的 Hidden Dimension 上工作。
也就是说:
Token 1:
看自己的 (d) 个 Feature。
Token 2:
看自己的 (d) 个 Feature。
Token 3:
也是如此。
它不是:
“Token 1 和 Token 2 放在一起求平均。”
因为 Token 与 Token 之间的信息交互,本来就是 Attention 更主要负责的事情。
于是到这里,一个非常清楚的分工出来了:
Attention:
跨 Token 信息路由。
MLP:
Token 内 Feature 加工。
Normalization:
Token 内 Representation 数值尺度整理。
这三个模块一下子就不乱了。
十一、既然已经有 LayerNorm,为什么现代 LLM 又经常出现 RMSNorm?
现在来看:
RMSNorm
Root Mean Square Normalization
均方根归一化。
它的核心首先是计算:
RMS(x)
√
1d
Σi=1dxi2
+ε
然后:
x̂i
xiRMS(x)
再乘 Learnable Scale:
yi=
γix̂i
如果你刚刚真的理解了 LayerNorm,现在应该马上发现一个区别。
RMSNorm 没有:
xi-μ
也就是说:
RMSNorm 不做 LayerNorm 那种显式 Mean Centering(均值中心化)。
它更集中地处理:
Magnitude
当前 Representation 整体有多大。
这个差别不能只靠背定义。
我们直接算一次。
十二、只用两个数字,就能把 LayerNorm 和 RMSNorm 彻底分清楚
假设:
x=[3,4]
先看 RMSNorm。
RMS 是:
√32+422
√12.5
≈3.536
所以归一化以后大约:
[0.849,\ 1.131]
观察一下:
原来两个值都是正数。
归一化以后:
还是两个正数。
它主要是在重新控制整个 Vector(向量)的幅度。
再看 LayerNorm。
Mean:
μ= 3+42
3.5
先减掉 Mean:
[3,4]-3.5
[-0.5,0.5]
再经过标准差调整,大致会得到:
[-1,1]
现在区别是不是特别明显?
同一个:
[3,4]
RMSNorm 更接近:
保持方向关系,调整整体尺度。
LayerNorm 则还额外进行了:
围绕均值的中心化。
所以不要再把 RMSNorm 理解成:
“LayerNorm 换了个名字。”
两者的核心区别应该这样记:
LayerNorm 同时处理 Centering 和 Scaling;RMSNorm 去掉显式 Centering,更集中地控制 Representation 的 Magnitude。
这已经足够你以后看绝大多数大模型配置了。
十三、RMSNorm 为什么会成为现代大模型里的常客?
这里最容易写成一句没营养的话:
“RMSNorm 比 LayerNorm 更先进。”
不建议这么理解。
架构设计从来不是:
新的一定把旧的全方位碾压。
真正应该问的是:
我们为什么需要 Norm?
目的之一,是让进入 Attention 和 MLP 的 Representation 拥有更容易处理的数值尺度。
RMSNorm 在不执行显式 Mean Centering 的情况下,依旧能对 Representation Magnitude 进行规范化,同时结构相对简洁。
所以很多现代 Decoder-only LLM 会使用 RMSNorm。
但到这里必须保持严谨:
不能推出:
“所有模型用 RMSNorm 都一定更好。”
也不能推出:
“只要使用 RMSNorm,训练就不会崩。”
Normalization 只是整个 Optimization System(优化系统)中的一部分。
训练稳定性还会受到:
Optimizer、Learning Rate、Initialization、Precision、Gradient Clip 等大量因素影响。
我们真正应该理解的是设计取舍,而不是制造神话。
十四、现在 Residual 和 Norm 终于可以拼在一起了
如果只有 Residual:
xl+1=xl+F(xl)
信息路径比较直接。
但随着一层层累积:
Representation 的数值尺度又可能越来越难处理。
如果只有 Normalization:
数值条件整理好了。
但如果每层还是:
xl+1=F(xl)
旧 Representation 没有那条更直接的跨层路径。
所以它们实际上互补。
Residual:
主要解决:
Path
传播路径。
Normalization:
主要处理:
Scale
数值尺度。
所以如果这一课你最后只能记一句非常简单的话,我会让你记:
Residual 决定信息怎么穿过深度,Normalization 决定这些信息以怎样的数值状态进入下一次计算。
但事情还没结束。
因为现在还有一个非常现实的问题:
Norm 应该放在哪里?
十五、Post-Norm:先把事情干完,再统一整理
一种经典写法是:
xl+1
Norm(xl+F(xl))
这叫:
Post-Norm
后置归一化。
流程可以理解成:
当前 Representation
↓
进入 Attention / MLP
↓
得到新信息
↓
和原输入进行 Residual Add(残差相加)
↓
Normalization
↓
交给下一层
翻译成人话就是:
先干活。
再把新旧信息合起来。
最后统一整理一下。
很自然。
但现在别只看前向传播。
看那条 Identity Path。
即使 (x_l) 通过 Residual 直接加到了后面:
最终它还是要经过:
Norm
也就是说:
从这一层到下一层,并不是存在一条完全绕开子模块和 Norm 的直接 Identity Path。
这个细节对于深层网络的优化很重要。
于是另一种布局开始变得特别有意思。
十六、Pre-Norm:真正值得看的不是“Norm 在前”,而是那条直通车
Pre-Norm 可以写成:
xl+1
xl+F(Norm(xl))
流程发生了变化。
输入:
xl
分成两条路径。
第一条:
直接往最终的加法走。
第二条:
先经过 Norm。
然后进入:
Attention 或 MLP。
最后产生一个 Update:
再加回:
xl
所以:
xl
本身拥有一条非常直接的路径:
xl
→
xl+1
它不用经过:
Norm。
也不用经过:
(F)。
这就是 Pre-Norm 真正值得理解的地方。
很多人背的是:
Pre-Norm:
Norm 在前。
Post-Norm:
Norm 在后。
这只是位置。
真正重要的是:
Pre-Norm 把复杂计算放在 Residual Branch(残差分支)里,让 Residual Stream 本身保留了一条更加直接的 Identity Path。
看到这里,Residual、Gradient 和 Pre-Norm 就全部连起来了。
它们不是三个知识点。
它们都在围绕一个问题设计:
怎么让深层网络的信息和梯度更容易穿过去。
十七、把 Attention 和 MLP 放回来,一个现代 Transformer Block 终于不再是“几个方块”
假设当前 Residual Stream 是:
xl
先经过 Attention 部分。
可以粗略写成:
hl
xl+
Attention(RMSNorm(xl))
不要急着看公式。
翻译成人话。
第一步:
把当前 Representation:
xl
做一次 RMSNorm。
目的:
整理当前输入的 Scale。
第二步:
交给 Attention。
Attention 去做上一课已经讲过的事情:
从其他 Token 获取当前需要的上下文信息。
第三步:
Attention 得到的结果不把 (x_l) 覆盖掉。
而是:
+
写回 Residual Stream。
所以:
hl
其实可以理解成:
原来的状态 + 这一次从上下文里得到的新信息。
接下来进入 MLP:
xl+1
hl+
MLP(RMSNorm(hl))
还是一样。
先 RMSNorm。
然后 MLP 对当前 Token 内部 Feature 做非线性加工。
得到一个新的 Update。
再:
+
写回当前 Residual Stream。
于是一个 Block,真正的运行逻辑其实是:
当前 Representation
↓
整理尺度
↓
Attention 去找上下文
↓
产生一次增量 Update
↓
写回当前 Representation
↓
整理尺度
↓
MLP 加工内部 Feature
↓
再产生一次增量 Update
↓
再次写回
↓
交给下一层
这时候再回头看 Transformer 架构图:
Attention。
Add。
Norm。
MLP。
Add。
Norm。
它们终于不是几个互不相干的小方块了。
你开始看到的是:
一条持续存在的 Representation 主干,以及围绕它不断运行的计算模块。
十八、现在回头看,第十课到第十五课其实一直只在讲一件事
第十课问:
Token 怎么从上下文找信息?
于是出现:
Attention。
第十一课继续问:
到底怎么找?
于是有:
Q、K、V。
第十二课问:
训练时整句话都进 GPU,为什么不能偷看未来?
于是有:
Causal Mask(因果掩码)。
第十三课问:
为什么一个 Attention Pattern 不够?
于是有:
Multi-Head Attention(多头注意力)。
第十四课问:
信息找回来以后怎么办?
于是进入:
MLP、GELU、SwiGLU。
到了第十五课,我们问的其实是:
这些模块每一层都在改变 Representation,那几十层之后,模型怎么还训练得下去?
于是自然出现:
Residual。
Normalization。
RMSNorm。
Pre-Norm。
你看,这才是一门课程应该有的样子。
不是:
今天背 Attention。
明天背 MLP。
后天背 RMSNorm。
而是:
前一个方案产生新的问题,新的问题逼出下一个结构。
真正学会架构,靠的不是记忆。
而是因果。
十九、为什么说 Transformer 没有简单“失忆”?现在终于能给出准确答案了
文章开头问:
如果 Representation 被改 80 次:
第一层的信息是不是早没了?
现在答案应该已经不是:
“因为有残差连接。”
这太浅。
更加完整的答案是:
Transformer 并不要求每一层:
彻底替换上一层的 Representation。
Residual Connection 让它可以采用:
xl+1=xl+Δ xl
这种 Incremental Update(增量更新)方式。
于是旧 Representation 存在一条更加直接的传播路径。
当前子层只需要学习:
Δ xl
与此同时:
Normalization 控制进入各个计算模块的 Representation Scale。
而采用 Pre-Norm 时:
Residual Stream 又拥有更加直接的 Identity Path。
所以真正答案是:
Residual 把“保存已有信息”和“学习新的变化”拆成了两件事:主干负责继续往前走,子模块负责计算这一次应该增加什么。
这句话,比“防止信息丢失”准确得多。
二十、但别走向另一个极端:Residual 不是“永远保留原始 Embedding”
这里很容易产生一个新的误解。
有人会想:
既然:
xl+1=xl+F(xl)
那最开始的 Embedding,是不是一路原封不动送到了第 80 层?
不是。
第一层:
x1=x0+F1(x0)
第二层处理的已经是:
x1
于是:
x2=x1+F2(x1)
第三层:
x3=x2+F3(x2)
所以 Residual Stream 一直都在改变。
Residual 保护的是:
Path Continuity
传播路径的连续性。
它不是:
Content Immutability
“内容永远不许变化。”
如果 Representation 永远不能改变:
那 Transformer 也不可能逐层形成越来越复杂的语义表示。
所以:
Residual 的作用不是让模型“不改变”,而是让模型可以在“持续改变”的同时,不必每一层都彻底断掉与上一层的联系。
这才是真正准确。
二十一、RMSNorm 也不是“防止模型忘记知识”
同样的道理。
RMSNorm 做的主要不是:
保存 Knowledge(知识)。
它更不是 Memory(记忆系统)。
它处理的是:
Representation 的 Numerical Scale。
所以不要把所有东西都解释成:
“为了不忘记。”
那会越学越乱。
更加清晰的分工是:
Residual Connection:
改善深层的信息与梯度传播路径。
LayerNorm / RMSNorm:
改善各层计算时的数值尺度与优化条件。
Attention:
负责上下文信息路由。
MLP:
负责逐 Token 的非线性特征变换。
一旦这个职责边界建立起来:
Transformer 就开始变得非常清楚。
二十二、这一课真正值得带走的,不是 RMSNorm 公式,而是一套“深度思维”
很多人学 Transformer,只看 Width(宽度)。
Hidden Size 多大。
Intermediate Size 多大。
Head 有多少。
Expert 有多少。
但现代模型还有一个同样重要的维度:
Depth
深度。
深度不是简单地:
“多堆几层。”
因为每增加一层,都会重新提出:
信息怎么走?
梯度怎么走?
不同层之间应该怎么交换 Representation?
当前这种:
Layer1
→
Layer2
→
Layer3
→
⋯
加普通 Residual 的方式,是不是已经是最好的答案?
现在先不要回答。
但把这个问题记住。
因为再往后学习现代 Frontier Model(前沿模型)的时候,你会遇到:
mHC。
AttnRes。
以及其他重新思考跨层 Information Routing(信息路由)的设计。
那时候你会发现:
它们并不是凭空出现的。
研究者继续追问的,其实还是今天这个问题:
如果网络越来越深,我们到底应该怎样让信息穿过“深度”本身?
课程设计里也正是先用第十五课建立普通 Residual Stream,再在后面的现代架构部分重新打开这个问题。
所以今天这一课非常重要。
它不只是教 RMSNorm。
它其实是在给后面的:
Deep Scaling(深度扩展)
打地基。
二十三、这一课最容易讲错的几个地方,我一次说清楚
“Residual 就是为了解决梯度消失。”
不完整。
Gradient Propagation 是重要原因之一,但 Residual 同时改变了每一层学习 Representation Transformation 的方式:
从完整重写,变成增量更新。
“有 Residual,信息就一定不会丢。”
也不对。
Representation 依然会不断被重新编码、增强、削弱甚至覆盖。
Residual 提供的是更直接的传播路径,不是永久只读备份。
“Normalization 就是把数据变成 0~1。”
错误。
LayerNorm、RMSNorm 和 Min-Max Normalization 根本不是一回事。
“RMSNorm 就是新版 LayerNorm。”
太粗糙。
最关键的结构区别是:
LayerNorm 有显式 Mean Centering。
RMSNorm 没有。
“Pre-Norm 就是 Norm 放前面。”
只说了位置。
真正需要理解的是:
x+F(Norm(x))
里面 (x) 本身拥有一条更加直接的 Identity Path。
“用了 Residual + RMSNorm,模型就不会训练崩。”
当然不是。
深度训练稳定性是整个:
Architecture + Initialization + Optimizer + Learning Rate + Precision + Data
共同决定的。
任何单一组件都不应该被神化。
二十四、这一课如果公式全部忘了,我希望你至少还记得这些话
第一句:
深层网络真正难的不是“层多”,而是信息和梯度能不能穿过这么多层。
第二句:
Residual 最重要的不是多了一个加号,而是把“完整重写”变成了“增量修改”。
第三句:
深层 Transformer 更像连续改稿,而不是每一层重新写一份稿子。
第四句:
Residual 不要求每一层都成为天才;某一层暂时没学会,也至少可以少改一点。
第五句:
Attention 和 MLP 负责计算 Update,Residual Stream 负责承载一层层累积起来的 Representation。
第六句:
Residual 管的是“路”,Normalization 管的是“尺度”。
第七句:
LayerNorm 同时处理 Centering 和 Scaling;RMSNorm 更集中地处理 Representation Magnitude。
第八句:
Pre-Norm 最重要的从来不是“Norm 在前面”,而是 Residual Stream 获得了一条更加直接的 Identity Path。
最后一句,也是我认为整篇最值得记住的一句:
Transformer 能堆到几十层,不是因为每一层都足够聪明,而是因为它不要求每一层重新创造世界——每一层只需要回答:在已有 Representation 上,这一次我应该改什么?
如果这句话真正理解了:
Residual。
RMSNorm。
Pre-Norm。
其实就不再是三个需要死记的名词。
它们都是同一个深层网络问题长出来的答案。
二十五、别急着看下一课,先检查自己是不是真的懂了
现在把公式遮住。
你应该能够自己解释:
为什么:
xl+1=F(xl)
和:
xl+1=xl+F(xl)
看起来只差一个 (x_l),但整个深层网络的工作方式却发生了很大变化?
为什么可以把:
F(xl)
理解成:
Δ xl
?
为什么:
F(xl)≈0
时,Residual Block 可以接近 Identity Mapping?
为什么求导以后:
I+
∂ F∂ x
里的 (I) 很重要?
Residual Stream 到底是什么?
为什么说:
Attention 和 MLP 更像是在 Residual Stream 上不断写入 Update?
为什么 Residual 解决了一部分问题以后,又自然引出了 Normalization?
LayerNorm 的 Centering:
到底是在做什么?
RMSNorm 为什么没有:
x-μ
?
Pre-Norm:
x+F(Norm(x))
和 Post-Norm:
Norm(x+F(x))
真正重要的区别,到底是不是只有“前”和“后”两个字?
最后再想一个问题。
如果一个 80 层 Transformer,并不是进行了 80 次彻底重写,而是在不断执行:
xl+1=xl+Δ xl
那么:
Depth
是不是应该被重新理解成:
Iterative Representation Refinement
表示的迭代精炼?
如果这一题你已经能自己讲出来:
第十五课就真的学懂了。
下一课:我们终于可以把前十五课的零件装成一台真正的大模型了
到今天为止:
Tokenizer 告诉我们文字怎么变成 Token。
Embedding 告诉我们 Token 怎么变成 Vector。
Position / RoPE 告诉模型顺序在哪里。
Attention 让 Token 从上下文读取信息。
Q、K、V 决定信息怎样匹配和传递。
Causal Mask 阻止模型偷看未来。
Multi-Head Attention 让模型在不同表示子空间里建立不同的信息路由。
MLP 负责把读取回来的 Feature 继续加工。
Residual 让 Representation 以增量方式一层层更新。
RMSNorm 帮助控制进入计算模块的数值尺度。
现在真正缺的已经不是新的零件了。
而是:
把所有东西串起来。
给模型一句:
“今天天气真”
Tokenizer 到底怎么处理?
Embedding 后面的 Tensor Shape 是什么?
经过一层 Transformer 之后 Shape 会不会变?
几十层以后为什么还能够映射回 Vocabulary?
LM Head 到底是什么?
Logits 又从哪里来?
为什么最后一个 Hidden State,可以变成“不错”“很好”“冷”这些 Token 的概率?
所以下一课,我们不再拆零件。
我们第一次把整台机器从头跑到尾。
大模型训练原理(16)|从一句话到下一个 Token:Decoder-only Transformer 这次终于完整跑通了
更多推荐

所有评论(0)