深度学习日常学习记录——参数初始化
前言
参数初始化的目的是为模型训练提供合适的起点,直观提升模型收敛速度、增强训练稳定性,一定程度上影响模型性能。好的初始化权重能够更加匹配优化器动态范围。初始权重完全相同会导致同一层网络的神经元保持相同梯度更新,无法体现个体神经元的作用,降低特征提取能力。初始化权重过小容易引导梯度消失,初始化权重过大容易引导梯度爆炸。
参数初始化汇总
| 初始化方法 | 核心思想 | 数学公式/参数分布 | 适用场景 | PyTorch代码示例 |
|---|---|---|---|---|
| 零初始化 (Zero) | 所有参数初始化为零(偏置项常用) | W = 0 W = 0 W=0 | 偏置项初始化 | nn.init.zeros_(tensor) |
| 均匀分布 (Uniform) | 从均匀分布中采样,需手动设定范围 | W ∼ U ( − a , a ) W \sim U(-a, a) W∼U(−a,a) | 浅层网络/简单任务 | nn.init.uniform_(tensor, a=-0.1, b=0.1) |
| 高斯分布 (Normal) | 从正态分布中采样,需设定均值和标准差 | W ∼ N ( μ , σ 2 ) W \sim N(\mu, \sigma^2) W∼N(μ,σ2) | 通用初始化 | nn.init.normal_(tensor, mean=0, std=0.01) |
| Xavier/Glorot | 保持输入/输出方差一致,适用于Sigmoid/Tanh | W ∼ N ( 0 , 2 n _ i n + n _ o u t ) W \sim N\left(0, \sqrt{\frac{2}{n\_{in}+n\_{out}}}\right) W∼N(0,n_in+n_out2) | Sigmoid/Tanh激活网络 | nn.init.xavier_normal_(tensor) |
| He/Kaiming | 修正ReLU的负半轴方差衰减,适用于ReLU家族 | W ∼ N ( 0 , 2 n _ i n ) W \sim N\left(0, \sqrt{\frac{2}{n\_{in}}}\right) W∼N(0,n_in2) | ReLU/LeakyReLU激活网络 | nn.init.kaiming_normal_(tensor, mode='fan_in') |
| 正交初始化 (Orthogonal) | 生成正交矩阵,保持梯度稳定性 | W T W = I W^T W = I WTW=I | RNN/LSTM/Transformer | nn.init.orthogonal_(tensor, gain=1.0) |
| 稀疏初始化 (Sparse) | 随机稀疏化权重(部分非零,其余为零) | 非零元素: W _ i j ∼ N ( 0 , σ 2 ) W\_{ij} \sim N(0, \sigma^2) W_ij∼N(0,σ2) | 稀疏模型/生物启发式网络 | nn.init.sparse_(tensor, sparsity=0.1, std=0.01) |
| 常数初始化 (Constant) | 所有参数初始化为固定常数 | W = c W = c W=c | 残差连接缩放/特殊需求 | nn.init.constant_(tensor, val=0.1) |
| 单位矩阵 (Identity) | 权重初始化为单位矩阵(仅限方阵) | W = I W = I W=I | 线性变换层/浅层网络 | nn.init.eye_(tensor) |
| 截断正态 (Truncated Normal) | 从截断的正态分布采样,避免极端值 | W ∼ N ( μ , σ 2 ) within [ a , b ] W \sim N(\mu, \sigma^2) \text{ within } [a,b] W∼N(μ,σ2) within [a,b] | Transformer/ViT | nn.init.trunc_normal_(tensor, mean=0, std=0.02, a=-2, b=2) |
| 预训练初始化 (Pretrained) | 加载预训练模型的参数 | W = W _ pretrained W = W\_{\text{pretrained}} W=W_pretrained | 迁移学习/微调任务 | model.load_state_dict(torch.load('pretrained.pth')) |
总结
参数初始化对模型训练来说十分重要,现阶段基本都是用预训练参数+参数初始化相结合的方式。
642

被折叠的 条评论
为什么被折叠?



