权重初始化

2025年3月17日 | 阅读 7 分钟

权重初始化是训练神经网络的一个重要方面,它会影响其收敛速度、稳定性和整体性能。正确初始化神经网络的权重可以在训练过程中实现更快的收敛,并在未见过的数据上实现更好的泛化。

神经网络可以被视为一个具有可学习参数的函数,这些参数通常被称为权重和偏置。现在,当神经网络首次训练时,这些参数(通常是权重)以各种方式初始化,包括使用像 0 和 1 这样的常数值,从某个分布(通常是均匀分布或正态分布)采样的值,以及其他复杂的方案,如 Xavier 初始化。

权重初始化的重要性

神经网络的性能在很大程度上取决于其参数在开始训练时的初始化方式。此外,如果我们每次运行都随机初始化,那么几乎可以肯定结果是不可复现的,甚至表现不佳。另一方面,如果使用常数值初始化,收敛可能需要很长时间。我们还消除了随机性的好处,使神经网络能够通过基于梯度的学习更快地收敛。我们确实需要一种更好的技术来对其进行初始化。

权重初始化挑战

由于神经网络中使用的非线性激活函数(如 sigmoid、tanh 和 ReLU),权重初始化带来了挑战。这些激活函数在特定的范围内表现最佳。例如,sigmoid 函数返回 0 到 1 之间的值,而 tanh 返回 -1 到 1 之间的值。如果初始权重过大或过小,激活可能会饱和,导致梯度消失或收敛缓慢。

另一个问题是保持网络各层激活和梯度的变化一致。随着信号穿过多个层,它可能会增加或减小,从而影响训练的稳定性。正确的权重初始化策略旨在克服这些问题,同时确保神经网络训练的健壮性和效率。

代码

模型设置

我们使用了 MNIST 数据集来可视化和分析初始化器的性能。MNIST 数据库(Modified National Institute of Standards and Technology database)是一个包含大量手写数字的数据集,通常用于训练图像处理算法。此外,该数据库还常用于机器学习的训练和测试。

最终的 Dense 层形状为 (10,),并带有 softmax 激活函数,该函数给出 0 到 9 这 10 个不同类别的概率。所有实验初始化器都将使用相同的模型设计。优化器和损失函数将分别使用 Adam 和 sparse_categorical_crossentropy。模型将训练 20 个 epoch。

各种权重优化方法

1. 零值

在此过程中,与输入相关的所有权重均设置为零。因此,在每次迭代中,相对于损失函数的导数对于每个权重都保持不变。因此,它表现得类似于线性模型。

输出

Weight Initialisation
Weight Initialisation

02. 值一

在此方法中,与输入相关的所有权重都设置为 1,但这仍然比设置为零值好,因为 WiXi 的乘积不为零,就像在此方法中 Wi 不为零一样。

输出

Weight Initialisation
Weight Initialisation

03. 正交

正交初始化在优化深度神经网络方面非常有效。与高斯正态初始化相比,它加快了收敛速度。对于深度神经网络,使用正交初始化有效地收敛到全局最小值的宽度与深度无关。它在执行过程中生成一个随机的正交矩阵。正交初始化器返回一个张量,该张量与其转置相乘会得到单位张量。

参数

  • gain: 应用于正交矩阵的乘法因子。
  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

04. 单位矩阵

单位矩阵初始化器返回一个除对角线外所有元素都为 0 的张量。它仅用于二维矩阵。

参数

  • gain: 应用于单位矩阵的乘法因子。
  • dtype: 输出的类型。

输出

Weight Initialisation
Weight Initialisation

05. 随机正态分布

如前所述,将随机权重值分配给权重比将 1 或 0 分配给权重值更好,因为 1 和 0 初始化器精度非常低。另一方面,如果随机初始化的权重值过高或过低,可能会导致所谓的梯度爆炸和梯度消失问题。

在此过程中,初始化器生成具有正态分布的张量。

参数

  • mean: 一个 Python 标量或标量张量。要生成的随机值的均值。
  • stddev: 一个 Python 标量或标量张量。要生成的随机值的标准差。
  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

06. 随机均匀分布

在此方法中,初始化器生成具有均匀分布的张量。

参数

  • minval: 一个 Python 标量或标量张量。要生成的随机值范围的下界。
  • maxval: 一个 Python 标量或标量张量。要生成的随机值范围的上界。对于浮点类型,默认为 1。
  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

07. Glorot 正态分布

Glorot 正态初始化器有时也被称为 Xavier 正态初始化器。它与 He 初始化器相同,只是用于激活 tanh 函数。它从以零为中心的截断正态分布中采样,其标准差为 sqrt(2 / (fan_in + fan_out)),其中 fan_in 是权重张量中的输入单元数,fan_out 是输出单元数。

参数

  • Seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

08. Glorot 均匀分布

Glorot 均匀初始化器也称为 Xavier 均匀初始化器。它与 He 初始化器相同,只是用于激活 tanh 函数。它从 [-limit, limit] 范围内的均匀分布中采样,其中 limit 为 sqrt(6 / (fan_in + fan_out)),fan_in 是权重张量中的输入单元数,fan_out 是权重张量中的输出单元数。

参数

  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

09. He 正态分布

为了获得更好的结果,我们将随机初始化乘以标准差。它从以零为中心的截断正态分布中采样,其标准差为 sqrt(2 / fan_in),其中 fan_in 是权重张量中的输入单元数。

参数

  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

10. He 均匀分布

此方法从 [-limit, limit] 范围内的均匀分布中采样,其中 limit 为 sqrt(6 / fan_in),fan_in 是权重张量中的输入单元数。

参数

  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

11. LeCun 均匀分布

此方法从 [-limit, limit] 范围内的均匀分布中采样,其中 limit 为 sqrt(3 / fan_in),fan_in 是权重张量中的输入单元数。

参数

  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

12. LeCun 正态分布

此方法从以零为中心的截断正态分布中生成样本,其标准差为 sqrt(1 / fan_in),其中 fan_in 是权重张量中的输入数量。

参数

  • seed: 一个 Python 整数。用于初始化随机生成器。

输出

Weight Initialisation
Weight Initialisation

结论

He、Glorot 和 LeCun 等权重初始化方法优于前面提到的一些方法。尽管随机正态分布和随机均匀分布初始化器准确,但它们不可重复,并导致梯度消失和爆炸问题。一些在最后介绍的新颖策略使用了既不太大也不太小的权重。此外,收敛所需时间也更短。因此,我们可以推断,每个初始化器都有其独特的意义,但避免收敛缓慢的目标对所有初始化器来说都是相同的,只有少数几种成功了。


下一主题密度估计