Skip to content

初始化与归一化

本页速览 权重初始化与归一化层是深度网络"训得动"的隐形前提。本文讲清为什么初始化重要、Xavier/He 的推导直觉,对比 BatchNorm/LayerNorm/GroupNorm/InstanceNorm 的适用场景,并解释两者如何互补地驯服梯度。

初始化与归一化

一句话定义:初始化决定网络从哪个"起点"出发,归一化决定前进时"地面"是否好走——两者共同保证梯度信号在深度网络中不会消失或爆炸(根源见反向传播与自动微分),是"深度"能成立的工程前提。

一、为什么初始化重要

对称破缺

如果同一层的权重全初始化为 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_inReLU 系(非饱和激活)针对 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 统计量;推理用运行时统计量的 EMACNN(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.BatchNorm2dnn.LayerNormnn.GroupNormnn.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 灵活性:预训练权重省数据、收敛快,但把模型"锚定"在预训练任务的结构上,跨域迁移可能不如从零训练灵活;另外预训练权重的许可证与隐私问题也要留意。

初始化与归一化是"看不见的地基"——它们不直接提升表达能力,却决定了深层的表达能力能否被优化器找到。配好它们,再配好优化与梯度下降里的调度与过拟合与正则化的防线,一套能稳定收敛的训练流程就齐了。调参细节与诊断见训练配方与调参

延伸阅读

参考资料