外观
初始化与归一化
一句话定义:初始化决定网络从哪个"起点"出发,归一化决定前进时"地面"是否好走——两者共同保证梯度信号在深度网络中不会消失或爆炸(根源见反向传播与自动微分),是"深度"能成立的工程前提。
一、为什么初始化重要
对称破缺
如果同一层的权重全初始化为 0,那么所有神经元在每一步的前向输出相同、反向梯度也相同——它们永远无法分化,网络退化成"一个神经元"(对称性从未被打破)。所以初始化必须随机,让每个神经元拿到不同的初始特征。
梯度缩放:方差守恒
更深层的原因是方差。前向传播中:
z = W·x(假设零均值、独立),则 Var(z) ≈ n_in · Var(w) · Var(x)如果 Var(w) 太大,激活值逐层放大 → 前向爆炸;反向同理,梯度逐层放大/缩小。为了让信号在前向与反向都"方差守恒",需要 Var(w) ≈ 1/n_in(前向看输入维)与 ≈ 1/n_out(反向看输出维)兼顾。
一句话记住
初始化的本质是方差控制:让每一层的输入输出方差都保持在 O(1),从而让前向不爆炸、反向不消失。
二、Xavier 与 He 初始化
两条最经典的初始化规则,由"方差守恒"直接推出:
| 方法 | 分布 | 适用激活 | 关键思想 |
|---|---|---|---|
| Xavier/Glorot(2010) | 均匀或高斯,Var=2/(n_in+n_out) | Sigmoid/Tanh(饱和激活) | 同时均衡前向与反向方差 |
| He/Kaiming(2015) | 高斯/均匀,Var=2/n_in | ReLU 系(非饱和激活) | 针对 ReLU 只保留一半负信号,方差需补回 2 倍 |
为什么 He 对 ReLU 有效而 Xavier 不行?ReLU 会把负半轴清零,信息流平均只剩一半,方差折半;He 的 2/n_in 正好把这个因子补回来,保证 ReLU 网络中前向方差守恒。这是"初始化必须与激活函数匹配"的经典案例,也是神经网络基础里"激活、初始化、归一化三者配套"说法的来源。
PyTorch 用法:
python
import torch.nn as nn
def init_weights(m):
if isinstance(m, nn.Linear):
nn.init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')
if m.bias is not None:
nn.init.zeros_(m.bias)
elif isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')
model.apply(init_weights)后续的残差连接(ResNet 2015)与归一化层进一步放宽了对初始化的苛刻要求——残差让恒等通路上的梯度"抄近道",见CNN 与计算机视觉。
三、预训练初始化 vs 随机初始化
现代深度学习的第二个重大转变:不再从随机初始化开始。
- 随机初始化:从零学起,需要海量数据,收敛慢。
- 预训练初始化:先用大语料/大图集上训练好的权重初始化(如 ImageNet 预训练的 ResNet、维基语料预训练的 BERT),再在目标任务上微调。
预训练权重提供的不是"接近最优的参数",而是一个好的特征提取起点——模型一开始就"看得懂"边缘、纹理、语法结构。这套"预训练-微调"范式是表征学习与预训练的核心内容。
别在微调时破坏预训练权重
微调用小学习率(比随机初始化小 10~100 倍),并且常常分层:浅层(学到的通用特征)用小 LR 或冻结,深层(任务相关)用正常 LR。直接套用从零训练的大学习率,预训练权重会被一步冲毁。
四、归一化层对比表
归一化层解决同一问题的不同版本:让每个层的输入保持在可控的均值/方差范围,消除内部协变量偏移,把梯度流稳定在"好走"的区域。四种主流归一化按"在哪一组数据上算统计量"区分:
| 方法 | 归一化维度 | 训练/推理差异 | 适用场景 |
|---|---|---|---|
| BatchNorm(BN, 2015) | 按通道、跨 batch 样本归一化 | 训练用 batch 统计量;推理用运行时统计量的 EMA | CNN(batch 大且稳定时效果好) |
| LayerNorm(LN, 2016) | 按单个样本、跨通道/特征归一化 | 训练推理一致,无统计量问题 | Transformer、RNN(batch 小/长度可变) |
| GroupNorm(GN, 2018) | 按单个样本、把通道分组归一化 | 训练推理一致 | 小 batch 的 CNN(目标检测) |
| InstanceNorm(IN, 2016) | 按单个样本、单通道归一化 | 训练推理一致 | 风格迁移、图像生成 |
选择的核心逻辑是"统计量在哪里算、是否依赖 batch":
- BN 依赖 batch 统计量:batch 越小噪声越大,
batch_size < 16时明显劣化;分布式训练里 batch 大时效果很好。注意 BN 的推理行为与训练不同(用滑动平均),多卡/部署时容易踩坑。 - LN 与 batch 无关:每个样本独立归一化,天然适配变长序列(Transformer 用 LN 而不是 BN),这也是 Transformer 选 LN 的结构性原因(见Transformer 架构)。
PyTorch 对应 nn.BatchNorm2d、nn.LayerNorm、nn.GroupNorm、nn.InstanceNorm2d。
五、归一化与初始化的互补关系
两者不是二选一,而是配合使用:
- 初始化:在"第一层"就保证方差合理,防止初始阶段就爆炸/消失。
- 归一化:在"每一层"动态重标定,即使后续参数漂移,输入分布也保持稳定。
有了归一化层后,初始化的容错范围大大放宽——归一化把"要精确控制每层方差"的负担从初始化转嫁到了运行时统计量上。现代经验是:归一化比初始化更关键。换而言之:初始化选错,模型可能根本训不动;而只要用了正确的归一化,初始化选择宽容得多(当然 Xavier/He 仍是标准默认)。这条互补关系还延伸到优化:归一化同时缓解了学习率敏感度,见优化与梯度下降。
有趣事实
BN 还自带轻微的正则化效果(训练中的 batch 统计量噪声相当于注入扰动),但不要把 BN 当正则器用——它首先是为稳定训练而生的,真正的正则化手段见过拟合与正则化。
六、embedding 与位置编码的初始化
- Embedding(词向量/图像块嵌入):默认
N(0, 1)小随机初始化即可,但注意 embedding 的方差会影响训练早期信号——Transformer 里常见做法是把 embedding 权重乘以√d_model或应用 LayerNorm 后归一化,以配合后续 attention 的缩放。 - 位置编码:绝对位置编码(正弦-余弦或可学习)也需注意尺度。可学习位置编码用标准差约
0.02的初始化(GPT 系列惯例)避免与 token embedding 量级失衡。位置编码的三种类型(绝对/相对/RoPE)见注意力机制。
七、常见坑
- BN 与 batch size:用 BN 时显存只够小 batch → 换成 GN 或 LN,别硬扛。
- 推理时 BN 行为变化:
model.eval()与model.train()下 BN 统计量来源不同,评估前忘了切eval(),指标神秘波动——见调试与诊断。 - 冻结 BN 在微调中:如果冻结了前面的层,BN 的统计量(running stats)应一并冻结(
requires_grad=False+momentum=0),否则统计量漂移。 - 归一化顺序:Transformer 中 Pre-LN(归一化在子层前)比 Post-LN 训练更稳,是大模型标配。顺序错了影响显著。
- 初始化分布类型:均匀分布与高斯分布的选择影响很小,关键是方差要按 Xavier/He 的公式设对;PyTorch 默认初始化(kaiming_uniform 等)通常已经合理,别乱覆盖。
八、权衡与取舍
权衡与取舍
BN 的 batch 依赖 vs LN 的样本独立:BN 在大 batch、CNN 上又快又好;LN 牺牲了跨样本统计(batch 噪声带来的正则),换来了与 batch 无关的稳定性。选型口诀:CNN 大 batch 用 BN,序列/小 batch/变长用 LN,小 batch 的 CNN 用 GN。
归一化的收益 vs 计算/复杂度:归一化层增加计算(虽然很小)与推理状态(BN 的 running stats);在部署剪枝、量化时,BN 的 fold 与 LN 的简化都需要专门处理(见MLOps 与模型部署)。
预训练初始化的收益 vs 灵活性:预训练权重省数据、收敛快,但把模型"锚定"在预训练任务的结构上,跨域迁移可能不如从零训练灵活;另外预训练权重的许可证与隐私问题也要留意。
初始化与归一化是"看不见的地基"——它们不直接提升表达能力,却决定了深层的表达能力能否被优化器找到。配好它们,再配好优化与梯度下降里的调度与过拟合与正则化的防线,一套能稳定收敛的训练流程就齐了。调参细节与诊断见训练配方与调参。
延伸阅读
- 反向传播与自动微分——梯度消失/爆炸的数学根源
- 神经网络基础——激活函数的选择配套
- 深度学习总体架构解剖——归一化在整体架构中的位置
- 损失函数与输出层——损失与输出层匹配的另一半
- Transformer 架构——LN 为什么是 Transformer 的选择
- 调试与诊断——初始化/归一化异常的症状识别
参考资料
- Glorot, Bengio. Understanding the difficulty of training deep feedforward neural networks (2010, Xavier)
- He et al. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification (2015, He 初始化)
- Ioffe, Szegedy. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (2015)
- Ba, Kiros, Hinton. Layer Normalization (2016)
- Wu, He. Group Normalization (2018)
- Ulyanov, Vedaldi, Lempitsky. Instance Normalization: The Missing Ingredient for Fast Stylization (2016)