深度神经网络的参数初始化方法
深度神经网络训练效果高度依赖参数初始值。系统阐述了随机初始化与预训练初始化两大策略,重点分析了对称权重现象及其解决方案。详细讲解了基于固定方差的方法局限性,以及 Xavier 和 He 初始化如何通过方差缩放保持信号传播稳定性。结合 ReLU、Sigmoid 等激活函数特性,提供了最佳实践建议。此外,探讨了预训练在迁移学习中的作用及自监督学习的应用场景,并辅以代码示例,帮助开发者构建更稳定高效的模型。

深度神经网络训练效果高度依赖参数初始值。系统阐述了随机初始化与预训练初始化两大策略,重点分析了对称权重现象及其解决方案。详细讲解了基于固定方差的方法局限性,以及 Xavier 和 He 初始化如何通过方差缩放保持信号传播稳定性。结合 ReLU、Sigmoid 等激活函数特性,提供了最佳实践建议。此外,探讨了预训练在迁移学习中的作用及自监督学习的应用场景,并辅以代码示例,帮助开发者构建更稳定高效的模型。

在深度学习模型训练中,参数初始化是决定模型能否成功收敛的关键步骤之一。不恰当的初始值可能导致梯度消失、梯度爆炸或对称权重问题,使得网络无法有效学习特征。本文基于《深度学习入门:基于 Python 的实现》及神经网络与深度学习(NNDL)等经典资料,系统梳理深度神经网络的参数初始化策略,涵盖随机初始化、方差缩放方法及预训练初始化,并提供实践建议。
在线性模型中,将所有参数初始化为 0 通常是可以接受的。但在神经网络中,如果所有权重 $W$ 和偏置 $b$ 都初始化为 0,会导致严重的对称权重现象:
为了打破这种对称性,必须对每个参数进行随机初始化(Random Initialization),确保不同神经元之间的差异。
早期的随机初始化方法通常使用均匀分布或高斯分布,并设定固定的方差(如标准正态分布 $N(0, 1)$)。然而,这种方法存在明显缺陷:
因此,简单的固定方差无法满足深层网络的需求,需要根据网络结构自适应调整。
为缓解梯度消失或爆炸问题,核心思想是尽可能保持每一层神经元的输入和输出的方差一致。根据神经元的连接数量(fan-in),自适应地调整初始化分布的方差,这类方法称为方差缩放(Variance Scaling)。
Xavier 初始化(也称 Glorot 初始化)假设激活函数为恒等函数或线性区间较大的函数(如 Sigmoid、Tanh)。其目标是保持前向传播时信号的方差不变,同时保持反向传播时梯度的方差不变。
公式定义: 设第 $l$ 层的输入维度为 $n_l$,输出维度为 $n_{l+1}$。权重 $W$ 从以下分布中采样:
$$ W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_l + n_{l+1}}}, \frac{\sqrt{6}}{\sqrt{n_l + n_{l+1}}}\right] $$
或者使用高斯分布: $$ W \sim N\left(0, \frac{2}{n_l + n_{l+1}}\right) $$
特点:
随着 ReLU 及其变体(Leaky ReLU, PReLU)的广泛应用,Xavier 初始化不再是最优选择。因为 ReLU 在负值区域输出为 0,这改变了方差的统计特性。He 初始化专门针对 ReLU 设计。
原理: ReLU 将负半轴截断,导致方差减半。为了补偿这一损失,需要将方差扩大 2 倍。
公式定义: $$ W \sim N\left(0, \frac{2}{n_l}\right) $$ 其中 $n_l$ 是输入连接的个数(fan-in)。
对比总结:
| 激活函数 | 推荐初始化方法 | 原因 |
|---|---|---|
| Sigmoid / Tanh | Xavier | 激活函数在 0 附近线性,需平衡前后方差 |
| ReLU / Leaky ReLU | He | 负值截断导致方差减半,需放大系数 |
在实际开发中,推荐使用主流深度学习框架提供的初始化接口。以下是 PyTorch 中的常见用法:
import torch
import torch.nn as nn
# 定义一个简单的全连接层
linear_layer = nn.Linear(in_features=784, out_features=512)
# 使用 He 初始化 (默认用于 ReLU 后的层)
# 注意:PyTorch 的 Linear 层默认使用 kaiming_uniform_ (He 的一种变体)
torch.nn.init.kaiming_uniform_(linear_layer.weight, a=0)
# 显式使用 Xavier 初始化
# torch.nn.init.xavier_uniform_(linear_layer.weight)
# 查看权重分布
print(f"Weight Mean: {linear_layer.weight.mean():.4f}")
print(f"Weight Std: {linear_layer.weight.std():.4f}")
不同的参数初始值会收敛到不同的局部最优解。尽管这些局部最优解在训练集上的损失可能接近,但泛化能力差异巨大。一个好的初始值能引导网络收敛到泛化能力更强的解。
预训练通常被视为一种正则化手段。通过在大规模数据集上预先训练模型,使其学习到通用的特征表示,然后再在目标任务上进行微调(Fine-Tuning)。
激活函数匹配:
kaiming_normal_ 或 kaiming_uniform_)。xavier_normal_ 或 xavier_uniform_)。避免手动猜测:
不要随意设定权重的标准差(如 std=0.01),应依赖框架提供的初始化器,它们已针对常见激活函数进行了理论推导。
结合 Batch Normalization: 如果使用了 Batch Normalization 层,权重的初始化要求会降低,因为 BN 会将输入标准化。此时可以使用较宽的初始化范围,甚至简单的 Xavier 即可。
检查梯度流: 在训练初期,监控第一层的梯度范数。如果梯度迅速变为 0 或无穷大,说明初始化可能存在问题,需尝试更换初始化方法。
参数初始化是深度学习模型构建的基础环节。理解对称权重问题、掌握 Xavier 与 He 初始化的数学原理,并根据激活函数选择合适的初始化策略,能够显著提升模型的收敛速度和最终性能。对于复杂任务,结合预训练和迁移学习则是进一步提升泛化能力的有效途径。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online