1.7 权重初始化

从优化动力学角度系统分析权重初始化的作用、机制,以及常见的策略与实践细节

什么是权重初始化

  • 正确初始化神经网络的权重是实现稳定高效训练的重要环节

  • 对于像 Transformer 这样层数较多的架构,梯度需要跨多层传播,不当初始化会导致梯度消失或爆炸,使训练在一开始就陷入停滞

  • 虽然现代优化器和归一化层可以缓解部分问题,但周全的权重初始化仍是实践中的核心组成部分

  • 大多数标准初始化方法的目标是保证在激活值和梯度向前 / 向后传播时其方差保持稳定

  • 如果方差在网络中呈指数增长,则容易出现梯度爆炸;如果呈指数减小,则出现梯度消失

线性层初始化

  • Transformer 在多头注意力的 Q/K/V 投影、输出投影以及逐位置前馈网络(FFN)中大量使用线性(全连接)层,常见且有效的初始化策略如下

  • Glorot(Xavier)初始化

    • 由 Glorot 和 Bengio 提出,旨在保持层间激活值和梯度的方差恒定

    • 对于输入维度为 $fan_{in}$、输出维度为 $fan_{out}$ 的线性层,权重 $W$ 可按以下方式初始化:

    • 均匀分布:

      WU[6fanin+fanout, 6fanin+fanout]W \sim U\left[-\sqrt{\frac{6}{fan_{in} + fan_{out}}},\ \sqrt{\frac{6}{fan_{in} + fan_{out}}}\right]
    • 正态分布:

      WN(0, 2fanin+fanout)W \sim \mathcal{N}\left(0,\ \frac{2}{fan_{in} + fan_{out}}\right)
    • Glorot 初始化对对称激活函数(如 $tanh$)尤其有效,Transformer 的最初实现中也采用了 Glorot 均匀初始化

  • He 初始化

    • 由 He 等人提出,特别适合接 ReLU 或其变体的层,因为 ReLU 将约一半激活置零,会降低激活方差

    • 常见的 He 初始化(使用正态分布)为:

      WN(0, 2fanin)W \sim \mathcal{N}\left(0,\ \frac{2}{fan_{in}}\right)
    • 对应的均匀分布版本

      WU[6fanin, 6fanin]W \sim U\left[-\sqrt{\frac{6}{fan_{in}}},\ \sqrt{\frac{6}{fan_{in}}}\right]
  • 在实践中:

    • 对 FFN 层使用 He 初始化较合理(因为 FFN 通常紧接 ReLU / GELU 等非线性)

    • 对注意力投影层(Q/K/V 和输出线性层)使用 Glorot 初始化是一个稳健起点

    • 许多深度学习框架会根据层的默认激活自动选择 Glorot 或 He 初始化策略

嵌入层初始化

  • 嵌入层负责将离散的 token ID 映射为稠密向量,与标准线性层有细微区别,常见做法是:

    EN(0, σ2)E \sim \mathcal{N}(0,\ \sigma^2)
  • 其中 $\sigma$ 是较小的标准差(例如约 0.02),以避免初始嵌入值过大,从而产生后续计算不稳定性,尤其是在添加位置编码时

  • 某些实现会共享输入和输出嵌入权重(可能经过转置),这也影响初始化策略的选择

层归一化初始化

  • 层归一化(LayerNorm)中包含可训练参数增益 $\gamma$ 和偏置 $\beta$。通常采用:

    • $\gamma = 1$

    • $\beta = 0$

  • 这样的初始化确保 LayerNorm 在初始阶段仅起到“归一化作用”,不施加缩放或平移,让网络在训练过程中自行学习适当变换

工程实现

  • 主流深度学习库(如 PyTorch、TensorFlow、JAX)为常见层提供了合理的默认初始化,通常与 Glorot 或 He 方法一致

  • 在 Hugging Face Transformers 中,权重通常使用由配置参数 initializer_range 指定标准差(默认约 0.02)的正态分布初始化,偏置为零

Last updated

Was this helpful?