nn.Linear层该用Kaiming还是Xavier?看激活函数:ReLU及其变体选Kaiming,Sigmoid/Tanh选Xavier;PyTorch默认Kaiming仅适配ReLU类,混用会导致梯度弥散。

权重初始化不当是梯度弥散最直接的诱因之一,不是模型结构问题,而是反向传播链式求导时数值塌缩的必然结果——必须按激活函数类型选初始化方法,不能混用。
nn.Linear层该用Kaiming还是Xavier?看激活函数
PyTorch默认对nn.Linear使用Kaiming初始化,这仅对nn.ReLU及其变体(如nn.LeakyReLU)安全。一旦你用了nn.Sigmoid或nn.Tanh,Kaiming会让前几层梯度迅速趋近于0。
- 用
nn.ReLU或nn.LeakyReLU:保持默认即可,或显式调用nn.init.kaiming_normal_(layer.weight, nonlinearity='leaky_relu') - 用
nn.Sigmoid或nn.Tanh:必须改用Xavier,例如nn.init.xavier_uniform_(layer.weight, gain=nn.init.calculate_gain('tanh')) - 手动初始化要放在
model.apply()或__init__末尾,不能在forward里反复调用
BatchNorm位置错位会放大梯度异常
nn.BatchNorm1d和nn.BatchNorm2d不是“加了就稳”,它们必须插在激活函数之后、下一层线性变换之前;更关键的是,不能加在输出层前(尤其分类头),否则归一化会干扰logits分布,间接加剧梯度不稳定。
- CNN中标准顺序:
Conv2d → ReLU → BatchNorm2d,不是Conv2d → BatchNorm2d → ReLU - RNN/LSTM中避免用
BatchNorm2d,应优先用nn.LayerNorm(对序列维度归一化) - 训练时务必确认
model.training == True,否则BatchNorm不更新running_mean/running_var,等效于冻结归一化参数
怎么快速验证初始化是否生效?
别只盯着loss曲线——梯度弥散发生时,loss可能缓慢下降但验证集指标卡死,真正要检查的是各层权重梯度的L2范数。
立即学习“Python免费学习笔记(深入)”;
- 在训练循环中加监控:
torch.norm(layer.weight.grad),若某层梯度持续低于1e-6,大概率已弥散 - 用
torch.autograd.grad提取特定loss对某参数的梯度,比依赖param.grad更可控 - 初始化后立即打印
layer.weight.std().item():Kaiming应接近sqrt(2 / fan_in),Xavier应接近sqrt(1 / fan_in)
最容易被忽略的是:RNN类模型中LayerNorm的normalized_shape参数必须匹配输入的特征维度,写错会导致归一化失效,初始化再合理也白搭。


















