权重初始化
介绍权重初始化的定义、重要性,以及常见的线性层、嵌入层和归一化层的初始化策略,并提供 PyTorch 实现示例
什么是权重初始化
- 正确初始化神经网络的权重是实现稳定高效训练的重要环节
- 对于像 Transformer 这样层数较多的架构,梯度需要跨多层传播,不当初始化会导致梯度消失或爆炸,使训练在一开始就陷入停滞
- 虽然现代优化器和归一化层可以缓解部分问题,但周全的权重初始化仍是实践中的核心组成部分
- 大多数标准初始化方法的目标是保证在激活值和梯度向前 / 向后传播时其方差保持稳定
- 如果方差在网络中呈指数增长,则容易出现梯度爆炸;如果呈指数减小,则出现梯度消失
线性层初始化
-
Transformer 在多头注意力的 Q/K/V 投影、输出投影以及逐位置前馈网络(FFN)中大量使用线性(全连接)层,常见且有效的初始化策略如下
-
Glorot(Xavier)初始化
-
由 Glorot 和 Bengio 提出,旨在保持层间激活值和梯度的方差恒定
-
对于输入维度为 、输出维度为 的线性层,权重 可按以下方式初始化:
-
均匀分布:
-
正态分布:
-
Glorot 初始化对对称激活函数(如 )尤其有效,Transformer 的最初实现中也采用了 Glorot 均匀初始化
-
-
He 初始化
-
由 He 等人提出,特别适合接 ReLU 或其变体的层,因为 ReLU 将约一半激活置零,会降低激活方差
-
常见的 He 初始化(使用正态分布)为:
-
对应的均匀分布版本
-
-
在实践中:
-
对 FFN 层使用 He 初始化较合理(因为 FFN 通常紧接 ReLU / GELU 等非线性)
-
对注意力投影层(Q/K/V 和输出线性层)使用 Glorot 初始化是一个稳健起点
-
许多深度学习框架会根据层的默认激活自动选择 Glorot 或 He 初始化策略
-
嵌入层初始化
-
嵌入层负责将离散的 token ID 映射为稠密向量,与标准线性层有细微区别,常见做法是:
-
其中 是较小的标准差(例如约 0.02),以避免初始嵌入值过大,从而产生后续计算不稳定性,尤其是在添加位置编码时
-
某些实现会共享输入和输出嵌入权重(可能经过转置),这也影响初始化策略的选择
层归一化初始化
-
层归一化(LayerNorm)中包含可训练参数增益 和偏置 。通常采用:
-
-
这样的初始化确保 LayerNorm 在初始阶段仅起到 “归一化作用”,不施加缩放或平移,让网络在训练过程中自行学习适当变换
工程实现
- 主流深度学习库(如 PyTorch、TensorFlow、JAX)为常见层提供了合理的默认初始化,通常与 Glorot 或 He 方法一致
- 在 Hugging Face Transformers 中,权重通常使用由配置参数
initializer_range指定标准差(默认约 0.02)的正态分布初始化,偏置为零
这篇文档有帮助吗?