从神经元到 Pre/Post-Norm:LayerNorm 的完整逻辑链
引言
LayerNorm 的公式只有四行,但围绕它有一连串容易混淆的问题:它为什么叫 “Layer”?和 BatchNorm 到底差在哪?语音特征 [B, F, T] 上该归一化 F 还是 T?Pre-Norm 和 Post-Norm 又有什么区别?为什么 Post-Norm 需要 Warmup 而 Pre-Norm 不需要?
这些问题看似分散,其实是一条逻辑链:从”神经元和 layer 是什么”出发,到”LayerNorm 归一化的是谁”,再到”LayerNorm 放在残差连接的哪里”,最后到”这个位置如何决定梯度流和训练稳定性”。 本文按这条链一步步展开。
第一部分:神经元与 Layer —— 归一化对象的定义
要理解 LayerNorm,先要搞清楚它归一化的”对象”是什么。
1.1 神经元:最小的计算单元
一个神经元做三件事:
- 接收一组输入 $x_1, \dots, x_n$
- 加权求和:$z = \sum_i w_i x_i + b$
- 过激活函数:$a = \sigma(z)$
输出一个标量 $a$。
1.2 Layer:一组并排的神经元
把 $m$ 个神经元并排放在同一深度,接收同一组输入,各自有独立权重,就组成一个 layer:
$$ a_j = \sigma\left(\sum_i w_{ji} x_i + b_j\right), \quad j = 1, \dots, m $$
输出是一个向量 $\mathbf{a} = [a_1, \dots, a_m]$。写成矩阵就是 $\mathbf{a} = \sigma(W\mathbf{x} + \mathbf{b})$,其中 $W$ 的每一行对应一个神经元,输出向量的第 j 维就是第 j 个神经元的激活值。
关键对应:一个神经元 → 输出一个标量;一个 layer → 输出一个向量,向量每个元素对应一个神经元。
1.3 这就是 LayerNorm 里 “Layer” 的含义
对一个样本,取它在某一层的输出向量 $\mathbf{a} \in \mathbb{R}^m$(m 个神经元),在这 m 个神经元的激活值上算均值方差:
$$ \mu = \frac{1}{m}\sum_{j=1}^{m} a_j, \quad \sigma^2 = \frac{1}{m}\sum_{j=1}^{m}(a_j - \mu)^2 $$
所以”LayerNorm 在一个 layer 内归一化”的准确意思是:
对一个样本,把它在这一层所有神经元的激活值放进同一组,算均值方差,再拉成零均值单位方差。
“跨特征归一化”和”跨神经元归一化”在这里是同一件事——因为特征维的每个元素就对应一个神经元。
1.4 一个具体例子
某层有 3 个神经元,某样本输入 $\mathbf{x} = [1, 2]$,权重矩阵(忽略 bias 和激活):
1 | x1 x2 |
三个神经元的输出:n1 = 1,n2 = 2,n3 = 3。这一层输出向量是 [1, 2, 3],三个元素分别对应 n1、n2、n3。LayerNorm 就是对这个 [1, 2, 3] 算均值(=2)、方差,然后归一化。
“在 layer 内归一化” = “在这 3 个神经元的输出上归一化”,完全等价。
1.5 一个容易混淆的地方
现代框架里 “layer” 一词被用宽了:nn.Linear 是一个 layer(严格意义),一个 Transformer block 也被叫 “a layer”,但它内部包含 Attention、FFN、多个 LayerNorm 等子层。LayerNorm 论文里的 “layer” 是前一种(某一层的激活向量)。在 Transformer 里,LayerNorm(d_model) 归一化的就是某个子层输出的那个 d_model 维向量——这个向量的每一维对应一个”特征/神经元”。
第二部分:LayerNorm 到底怎么算
有了”归一化对象”的定义,公式就顺理成章了。
对输入向量 $x \in \mathbb{R}^d$:
$$ \mu = \frac{1}{d}\sum_{i=1}^{d} x_i $$
$$ \sigma^2 = \frac{1}{d}\sum_{i=1}^{d}(x_i - \mu)^2 $$
$$ \text{LayerNorm}(x) = \gamma \odot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta $$
其中 $\gamma, \beta$ 是可学习的缩放和偏移参数,$\epsilon$ 是防止除零的小常数。
计算步骤只有四步:
- 求均值
- 求方差
- 减均值、除标准差
- 用 $\gamma, \beta$ 做仿射变换
LayerNorm 的本质就一句:把一组数拉到均值 0、方差 1。 关键不是”怎么拉”,而是”你把哪些数放进同一组”。
2.1 语音场景 [B, F, T] 下的几种用法
设输入为 [B, F, T],B 是 batch,F 是频率 bin,T 是时间帧。
F 当特征维(每个 (b,t) 跨频率归一化):
$$ \mu_{b,t} = \frac{1}{F}\sum_{f=1}^{F} x_{b,f,t}, \quad \sigma^2_{b,t} = \frac{1}{F}\sum_{f=1}^{F}(x_{b,f,t}-\mu_{b,t})^2 $$
统计量共 B×T 组,每组 F 个样本,$\gamma, \beta$ 形状为 [F]。这是 Transformer/Conformer 语音前端的标准做法。
T 当特征维(每个 (b,f) 跨时间归一化):
$$ \mu_{b,f} = \frac{1}{T}\sum_{t=1}^{T} x_{b,f,t}, \quad \sigma^2_{b,f} = \frac{1}{T}\sum_{t=1}^{T}(x_{b,f,t}-\mu_{b,f})^2 $$
统计量共 B×F 组,每组 T 个样本,$\gamma, \beta$ 形状为 [T]。传统语音特征里的 CMVN 本质就是这种。
PyTorch 实现要点(nn.LayerNorm 归一化最后若干维):
1 | # 输入 [B, F, T] |
第三部分:为什么叫 LayerNorm?和 BatchNorm 有什么区别?
3.1 命名来源
LayerNorm 出自 Ba et al. 2016 的论文 Layer Normalization。名字里的 Layer 指的是神经网络的层,核心思想是:对单个样本、在某一层的所有神经元(特征)上做归一化。
对比 BatchNorm 的 “Batch”——归一化范围是”一个 batch 内、同一个特征上的所有样本”。
名字本身就是对归一化轴的声明:
- BatchNorm:跨 batch 聚合统计量
- LayerNorm:跨 layer 内的特征聚合统计量
3.2 公式对比
设输入为 [N, C](N 个样本,C 个特征)。
BatchNorm:对每个特征 c,跨 N 个样本算均值方差:
$$ \mu_c = \frac{1}{N}\sum_{n=1}^{N} x_{n,c}, \quad \sigma^2_c = \frac{1}{N}\sum_{n=1}^{N}(x_{n,c}-\mu_c)^2 $$
- 统计量共 C 组,每组 N 个样本
- 归一化轴:N(batch 维)
- 训练时用 batch 统计量,同时维护 running mean/var;推理时用 running 统计量
LayerNorm:对每个样本 n,跨 C 个特征算均值方差:
$$ \mu_n = \frac{1}{C}\sum_{c=1}^{C} x_{n,c}, \quad \sigma^2_n = \frac{1}{C}\sum_{c=1}^{C}(x_{n,c}-\mu_n)^2 $$
- 统计量共 N 组,每组 C 个特征
- 归一化轴:C(特征维)
- 训练和推理行为完全一致,不需要 running 统计量
3.3 对比表
| BatchNorm | LayerNorm | |
|---|---|---|
| 归一化轴 | batch 维(对每个特征跨样本) | 特征维(对每个样本跨特征) |
| 统计量来源 | 整个 batch | 单个样本 |
| 依赖 batch 大小 | 是,小 batch 不稳定 | 否 |
| 训练/推理行为 | 不同(推理用 running stats) | 一致 |
| 典型场景 | CNN 图像(特征空间固定) | RNN / Transformer(变长序列) |
| 对变长输入 | 麻烦(序列长度不一,统计量难对齐) | 天然适配(逐样本独立) |
3.4 直觉上的关键差异
- BatchNorm 的假设:同一个特征在不同样本间的分布应该被拉齐。这要求 batch 足够大、样本独立同分布。图像任务里成立,所以 BN 在 CNN 里很强。
- LayerNorm 的假设:同一个样本内部的特征分布应该被拉齐。不依赖 batch,所以适合 batch 小、序列变长、推理要逐帧/逐 token 的场景——这正是 Transformer 和语音模型的需求。
3.5 这两个可以互换吗?
一般不能随意互换,原因有四:
- 统计量语义完全不同:BN 减的是”跨样本的均值”,LN 减的是”样本内跨特征的均值”。即使形状凑得上,被减掉的东西不一样。
- 训练/推理行为不同:BN 推理时用 running 统计量,LN 训练推理一致。
- 对 batch 大小的敏感度不同:BN 在小 batch 下方差估计噪声大;LN 完全不受 batch 大小影响。
- 适用结构不同:CNN 图像分类中 BN 通常优于 LN;Transformer/RNN/语音中 LN 是标配,BN 在变长序列上很难用。
有没有”碰巧等价”的情况?有。比如 batch size = 1 且布局恰好让 BN 的归一化轴和 LN 的特征轴重合时,两者数值上可能一致。但这是特例,工程上不应依赖这种巧合。
3.6 LayerNorm 一般都是 norm 最后一个维度吗?
在 PyTorch 里,nn.LayerNorm(normalized_shape) 确实是对最后若干个维度做归一化。 这是 API 设计,不是 LayerNorm 的数学定义。
1 | nn.LayerNorm(D) # 归一化最后一维,输入 [..., D] |
为什么常见实现都 norm 最后一维?因为主流布局把特征维放在最后:Transformer 是 [B, T, D],语音 Transformer 通常整理成 [B, T, F]。所以”norm 最后一维”是**”特征维放最后”这一惯例的自然结果**,不是 LayerNorm 的内在要求。
LayerNorm 的数学定义只要求:对每个样本,在一组你指定的特征上算均值方差。这组特征可以是任意维度组合。语音 [B, F, T] 下若想 norm F,要么转置,要么手写。
第四部分:F 当特征 vs T 当特征 —— 语音场景的延伸
既然”把哪些数放进同一组”是核心,语音 [B, F, T] 下 F 和 T 的选择就值得单独说清楚。
4.1 手算一个 2×3 的例子
假设 B=1,F=2,T=3:
1 | t1 t2 t3 |
做法 A:F 当特征(沿竖线,每列算)
t1 列 [1, 3]:均值 2,归一化后 [-1, 1]。
t2 列 [2, 4]:均值 3,归一化后 [-1, 1]。
t3 列 [3, 5]:均值 4,归一化后 [-1, 1]。
结果三列完全一样:
1 | t1 t2 t3 |
每帧都是”f2 比 f1 大 2”,这个形状没变;t1 整体小、t3 整体大,这个整体电平被减掉了。
做法 B:T 当特征(沿横线,每行算)
f1 行 [1, 2, 3]:均值 2,归一化后 ≈ [-1.22, 0, 1.22]。
f2 行 [3, 4, 5]:均值 4,归一化后同样 ≈ [-1.22, 0, 1.22]。
结果两行完全一样:
1 | t1 t2 t3 |
两行都是”随时间线性上升”,这个走势没变;f2 整体比 f1 高 2,这个频带整体高低被减掉了。
4.2 抹平了什么,保留了什么
归一化前有两个问题:
- 问题 A:t3 时刻是不是比 t1 时刻整体更响?
- 问题 B:f2 频带是不是比 f1 频带整体更强?
| 问题 A(时刻间整体强弱) | 问题 B(频带间整体强弱) | 保留的是 | |
|---|---|---|---|
| F 归一化 | 不能问了(每帧被拉到同一水平) | 还能问 | 每帧内部的频谱形状 |
| T 归一化 | 还能问 | 不能问了(每个频带被拉到同一水平) | 每个频带内部的时间走势 |
一句话:
F 归一化抹掉”时刻之间的整体电平差”,保留”同一帧内频率之间的相对结构”。
T 归一化抹掉”频带之间的整体电平差”,保留”同一频带内时间上的走势”。
4.3 为什么这个区别对下游任务重要
语音识别关心”这一帧是什么音素”。 音素主要由频谱形状(共振峰位置)决定,而不是这一帧录得多响。
- F 归一化:去掉帧级电平差异,保留频谱形状 → 适合 ASR / Transformer 前端。
- T 归一化:每个频带各自按时间标准化,当前帧的频谱形状会依赖该频带整段的历史统计,绝对频谱被扭曲 → 不利于音素判别。
去除麦克风/通道的频带偏差,关心”每个频带整体偏了多少”。 这正是 T 归一化擅长的(CMVN 就是每个频带跨时间减均值除方差)。
4.4 两个工程上的硬区别
- 逐帧独立 vs 依赖整段:F 归一化每帧独立算,天然适配变长、流式、因果;T 归一化需要看完一段时间统计,非因果,结果随句长变化。
- 统计量稳定性:F 归一化每组有 F 个样本(通常 80~512),稳定;T 归一化每组只有 T 个样本,短语音时噪声大。
4.5 实践建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| Transformer / Conformer 语音前端 | F 当特征维 | 与 [B, T, F] 的 token 结构一致,逐帧独立 |
| 去除麦克风/通道频带偏差 | T 归一化 或 CMVN | 每个频带跨时间减均值除方差 |
| 两者都需要 | 先 T 方向 CMVN,再模型内 F 方向 LayerNorm | 各司其职 |
更详细的语音侧讨论(含”能量 vs 音量”的澄清)见另一篇:LayerNorm 在语音特征 [B, F, T] 上该归一化哪个维度。
第五部分:Pre-Norm 与 Post-Norm —— LayerNorm 放在哪里
到这里,我们已经清楚了 LayerNorm “归一化谁”。接下来的问题是:在残差网络里,LayerNorm 应该放在残差连接的什么位置? 这就是 Pre-Norm 和 Post-Norm 的分野。
5.1 结构上的根本差异
- Post-Norm(原始 Transformer 使用):
$$ x_{l+1} = \text{LayerNorm}\big(x_l + \text{Sublayer}(x_l)\big) $$
LayerNorm 在残差相加之后,作用于残差主干路径上。
- Pre-Norm(现代大模型的主流):
$$ x_{l+1} = x_l + \text{Sublayer}\big(\text{LayerNorm}(x_l)\big) $$
LayerNorm 在残差分支内部,只对送入子层(如 Attention、FFN)的输入做归一化,残差主干路径保持干净。
核心区别就一句:LayerNorm 是在残差连接的”外部”还是”内部”。
5.2 核心权衡:稳定性 vs. 性能
Post-Norm:性能上限更高,但深层训练不稳定
Post-Norm 的性能优势来源于它对残差主干路径本身进行了归一化。这种持续的”尺度控制”被认为能带来更强的变换动态和表示能力,因此在**较浅的网络(如 6 层以下)**中,Post-Norm 通常能取得比 Pre-Norm 更好的最终性能。
然而,它的代价是破坏了梯度的”高速公路”。在反向传播时,梯度必须穿过每一层的 LayerNorm 雅可比矩阵,这会导致梯度在深层网络中指数级地复合与缩放,引发严重的训练不稳定。因此,Post-Norm 模型通常需要精心的学习率预热(Warmup) 才能避免早期训练发散。
Pre-Norm:训练稳定性极佳,但可能牺牲深层效率
Pre-Norm 将残差主干路径完整地保留为一条恒等映射(Identity Path)。这意味着梯度可以沿着这条”高速公路”无损地从最后一层回传到第一层,从根本上避免了梯度消失。这使得 Pre-Norm 在深层模型中训练非常稳定,甚至无需学习率预热。
但这种稳定性的代价是,模型失去了对残差流尺度的直接控制。一些研究发现,这可能导致 Pre-Norm 模型存在”层利用率不足”的问题:即使剪枝掉相当一部分深层,性能下降也可能很有限,暗示其有效深度可能被限制。
5.3 总结对比
| 特性 | Post-Norm | Pre-Norm |
|---|---|---|
| LayerNorm 位置 | 残差相加之后(外部) | 残差相加之前(内部) |
| 残差主干路径 | 被归一化,尺度受控 | 保持恒等,干净无损 |
| 梯度流 | 需穿过每层 LayerNorm,易不稳定 | 有直接的”梯度高速公路” |
| 训练稳定性 | 较差,深层易发散 | 极佳,对深度不敏感 |
| Warmup 需求 | 通常必需 | 通常不需要 |
| 性能优势区间 | 浅层网络性能通常更好 | 深层网络中稳定性的优势压倒一切 |
| 主要风险 | 梯度消失/爆炸,训练失败 | 残差流尺度失控,潜在层利用率不足 |
5.4 如何选择?
- 选择 Pre-Norm:训练深层 Transformer(如 12 层以上)或大语言模型时,Pre-Norm 几乎是默认的安全选择。它的稳定性让你无需在 Warmup 和学习率上耗费过多精力。
- 选择 Post-Norm:模型较浅(如 6 层以内),并且有精力进行精细的超参数调优(尤其是 Warmup)时,Post-Norm 有潜力带来更好的最终性能。
研究界也一直在尝试融合两者优点,如 SpanNorm、SiameseNorm、B2T Connection 等变体,试图在保持 Pre-Norm 训练稳定性的同时,找回 Post-Norm 的性能优势。这从侧面印证了,Pre-Norm 和 Post-Norm 之间的权衡,是 Transformer 架构设计中一个根本性的、尚未被完美解决的挑战。
第六部分:训练细节深入 —— 梯度流、稳定性、Warmup
第五部分的对比表里,有三行值得单独展开:
梯度流:需穿过每层 LayerNorm,易不稳定 vs. 有直接的”梯度高速公路”
训练稳定性:较差,深层易发散 vs. 极佳,对深度不敏感
Warmup 需求:通常必需 vs. 通常不需要
这三个现象是同一个数学事实在不同层面的体现。核心原因在于,残差主干路径(Residual Stream)是否被 LayerNorm “污染”。
6.1 梯度流:干净的”高速公路” vs 处处设卡的”省道”
反向传播时,梯度需要从损失函数一路回传到最底层的参数。残差连接的设计初衷,就是为了给梯度提供一条畅通的”高速公路”。
Pre-Norm 的梯度”高速公路”
Pre-Norm 的结构是 $x_{l+1} = x_l + \text{Sublayer}(\text{LayerNorm}(x_l))$。残差流 $x_l$ 被原封不动地加到下一层,LayerNorm 只作用于要送入子层的那条”分支”上。
对 $x_l$ 求导:
$$ \frac{\partial x_{l+1}}{\partial x_l} = I + \frac{\partial \text{Sublayer}(\text{LayerNorm}(x_l))}{\partial x_l} $$
这里的 $I$ 是单位矩阵。这意味着,无论子层的梯度多么小甚至消失,梯度中始终有一条直接通路以 1:1 的比例无损地传回上一层。当这个结构在 $L$ 层网络中展开时,梯度中会包含一条所有乘子都为 1 的路径,从而在理论上保证了梯度不会随深度消失。这就是”梯度高速公路”的数学本质。
Post-Norm 的梯度”层层设卡”
Post-Norm 的结构是 $x_{l+1} = \text{LayerNorm}(x_l + \text{Sublayer}(x_l))$。残差相加后的结果立刻被 LayerNorm 再次处理。这意味着,残差流这条”高速公路”本身在每一个 block 出口都设了一个”收费站”。
此时,反向传播的梯度必须穿过每一层的 LayerNorm 雅可比矩阵。这个雅可比矩阵会重新缩放梯度,其效果是不确定的:可能放大,也可能缩小。在深层网络中,这种反复的、不确定的缩放会复合累积,导致梯度模长要么指数级爆炸,要么指数级衰减。
| 特性 | Pre-Norm | Post-Norm |
|---|---|---|
| 残差主干路径 | 恒等映射,未经归一化污染 | 被 LayerNorm 反复重新归一化 |
| 梯度回传路径 | 存在一条乘子为 1 的直接通路 | 必须逐层穿过 LayerNorm 的雅可比矩阵 |
| 梯度稳定性 | 高,深度不敏感 | 低,梯度易爆炸或消失 |
6.2 训练稳定性:为什么 Post-Norm 会”崩”?
Post-Norm 的不稳定,在训练初期(初始化附近)就埋下了种子,并可能在训练中演变为”表征坍塌”。
初始化期的梯度爆炸
根据 Xiong 等人(2020)的理论分析,在 Post-Norm Transformer 的初始化阶段,靠近输出层的参数,其期望梯度幅度本身就很大,并且随着深度增加而增长。这意味着,如果一开始就用正常大小的学习率去更新这些参数,会引发巨大的参数更新,直接导致训练发散或 Loss 爆炸。
训练中后期的表征坍塌
随着训练进行,模型可能进入一种”高相似度”状态(不同 token 的表征趋于一致)。此时,送入 LayerNorm 的残差流范数会变大,这会使得归一化的反向传播因子变得具有**”收缩性”(contractive),导致梯度在向浅层回传时呈几何级数衰减**。这使得模型丧失了修复这种坍塌的能力,深层网络实际上”死掉了”。
Pre-Norm 因为保护了干净的梯度高速公路,从初始化开始梯度就是良态(well-scaled) 的,从根本上避免了上述早期爆炸和后期无法修复的坍塌问题。
6.3 Warmup:一种”无奈的保险” vs. “不再需要”
Warmup 是一种训练技巧:在训练最初的几千步里,让学习率从一个极小的值(如 0)线性增长到设定的基准值。
Post-Norm 为什么通常”必需” Warmup?
正是因为上面提到的初始化期梯度爆炸问题。Post-Norm 在训练一开始,输出层附近就存在巨大的梯度。如果此时直接使用大学习率,模型会立刻崩溃。
Warmup 的作用就是”缓启动“:在模型最脆弱、梯度最狂暴的初始阶段,用极小的学习率限制参数更新的步长,等模型稍微”适应”后,再逐渐加大学习率。可以说,Warmup 是针对 Post-Norm 梯度缺陷的一种”必需的保险措施”,它虽然有效,但减慢了优化速度,并引入了额外的超参数需要调优。
Pre-Norm 为什么通常”不需要” Warmup?
因为 Pre-Norm 的梯度在初始化时就是良态的,不存在需要”缓启动”来躲避的梯度爆炸。既然没有早期的不稳定,自然也就不需要 Warmup 这个”保险”了。实验也证明,Pre-Norm Transformer 去掉 Warmup 后,能达到与使用 Warmup 的基线相当的结果,同时显著减少训练时间和超参数调优的负担。
6.4 三个方面的环环相扣
- 梯度流的结构缺陷(残差路径被污染)是根源。
- 这个根源导致 Post-Norm 在训练稳定性上存在先天不足(初始化梯度爆炸、后期可能坍塌)。
- 为了在这种不稳定下完成训练,Warmup 成为一种被迫的、必需的工程补偿手段。
而 Pre-Norm 通过一个简单的结构置换,保住了残差连接的恒等本质,从而同时解决了这三个层面的问题——这也是它成为现代大模型默认选择的原因。
第七部分:总结 —— 一条完整的逻辑链
回顾整篇文章,所有问题都围绕一个核心概念展开:“你把哪些数放进同一组”。
神经元与 Layer:神经元输出标量,layer 输出向量,向量每一维对应一个神经元。”在 layer 内归一化” = “对一个样本在这一层所有神经元的激活值归一化” = “跨特征维归一化”。
LayerNorm 与 BatchNorm:BN 对同一个神经元跨样本归一化,LN 对同一个样本跨神经元归一化。名字里的 Batch 和 Layer 就是对归一化轴的声明。两者针对不同的数据布局和统计假设,一般不能互换。PyTorch 的
LayerNorm归一化最后若干维,是”特征维放最后”惯例的产物,不是数学定义。语音
[B, F, T]下 F vs T:F 归一化抹掉”时刻之间的整体电平差”,保留”同一帧内的频谱形状”;T 归一化抹掉”频带之间的整体电平差”,保留”同一频带内的时间走势”。Transformer 语音模型选 F,因为每帧是一个 token,要忽略帧级电平、保留频谱形状。Pre-Norm 与 Post-Norm:LayerNorm 放在残差连接的内部还是外部。Post-Norm 归一化残差主干路径,性能上限更高但深层不稳定;Pre-Norm 保护残差主干为恒等映射,稳定性极佳但可能牺牲深层效率。
梯度流、稳定性、Warmup:Pre-Norm 的残差主干是恒等映射,梯度有乘子为 1 的直接通路(高速公路);Post-Norm 每层都要穿过 LayerNorm 雅可比矩阵,梯度易爆炸或衰减(层层设卡)。初始化期梯度爆炸导致 Post-Norm 训练不稳定,因而被迫依赖 Warmup 缓启动;Pre-Norm 梯度良态,不需要 Warmup。
一句话收束:
从”神经元组成 layer”到”LayerNorm 归一化 layer 内的神经元”,从”归一化哪个轴”到”归一化放在残差哪里”,从”梯度能否走高速公路”到”是否需要 Warmup”——这是一条由归一化轴的选择贯穿始终的逻辑链。理解了”哪些数被放进同一组”,LayerNorm 的所有变体和工程现象就都不再抽象了。
