目录

数值稳定性和模型初始化

参数的初始化对模型的性能也有影响,对于不同的任务可能适合不同的初始化方法

梯度消失和梯度爆炸

梯度消失

/posts/learning/cs/numerical_stability_and_init/sigmoid.png 正如上图,当sigmoid函数的输入很大或是很小时,它的梯度都会消失。 此外,当反向传播通过许多层时,除非我们在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。 当我们的网络有很多层时,除非我们很小心,否则在某一层可能会切断梯度。 事实上,这个问题曾经困扰着深度网络的训练。 因此,更稳定的ReLU系列函数已经成为从业者的默认选择(虽然在神经科学的角度看起来不太合理)。

梯度爆炸

我们设置lr的意义其实就是防止步子太大,跨过了函数的鞍点,而如果梯度太大的话,lr压不下来,就导致模型很难收敛

打破对称性

其目的在于让神经元们有所差异,这样的模型才有泛化能力。

初始化方法

这里直接摘抄原文,我认为不需要过于深究

默认初始化

我们使用正态分布来初始化权重值。如果我们不指定初始化方法, 框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。

Xavier初始化

让我们看看某些没有非线性的全连接层输出(例如,隐藏变量)$o_{i}$的尺度分布。 对于该层$n_\mathrm{in}$输入$x_j$及其相关权重$w_{ij}$,输出由下式给出

$$o_{i} = \sum_{j=1}^{n_\mathrm{in}} w_{ij} x_j.$$

权重$w_{ij}$都是从同一分布中独立抽取的。 此外,让我们假设该分布具有零均值和方差$\sigma^2$。 请注意,这并不意味着分布必须是高斯的,只是均值和方差需要存在。 现在,让我们假设层$x_j$的输入也具有零均值和方差$\gamma^2$, 并且它们独立于$w_{ij}$并且彼此独立。 在这种情况下,我们可以按如下方式计算$o_i$的平均值和方差:

$$ \begin{aligned} E[o_i] & = \sum_{j=1}^{n_\mathrm{in}} E[w_{ij} x_j] \&= \sum_{j=1}^{n_\mathrm{in}} E[w_{ij}] E[x_j] \&= 0, \\ \mathrm{Var}[o_i] & = E[o_i^2] - (E[o_i])^2 \\ & = \sum_{j=1}^{n_\mathrm{in}} E[w^2_{ij} x^2_j] - 0 \\ & = \sum_{j=1}^{n_\mathrm{in}} E[w^2_{ij}] E[x^2_j] \\ & = n_\mathrm{in} \sigma^2 \gamma^2. \end{aligned} $$

保持方差不变的一种方法是设置$n_\mathrm{in} \sigma^2 = 1$。 现在考虑反向传播过程,我们面临着类似的问题,尽管梯度是从更靠近输出的层传播的。 使用与前向传播相同的推断,我们可以看到,除非$n_\mathrm{out} \sigma^2 = 1$, 否则梯度的方差可能会增大,其中$n_\mathrm{out}$是该层的输出的数量。 这使得我们进退两难:我们不可能同时满足这两个条件。 相反,我们只需满足:

$$ \begin{aligned} \frac{1}{2} (n_\mathrm{in} + n_\mathrm{out}) \sigma^2 = 1 \text{ 或等价于 } \sigma = \sqrt{\frac{2}{n_\mathrm{in} + n_\mathrm{out}}}. \end{aligned} $$

这就是现在标准且实用的Xavier初始化的基础, 它以其提出者 :cite:Glorot.Bengio.2010 第一作者的名字命名。 通常,Xavier初始化从均值为零,方差 $\sigma^2 = \frac{2}{n_\mathrm{in} + n_\mathrm{out}}$ 的高斯分布中采样权重。 我们也可以将其改为选择从均匀分布中抽取权重时的方差。 注意均匀分布$U(-a, a)$的方差为$\frac{a^2}{3}$。 将$\frac{a^2}{3}$代入到$\sigma^2$的条件中,将得到初始化值域:

$$U\left(-\sqrt{\frac{6}{n_\mathrm{in} + n_\mathrm{out}}}, \sqrt{\frac{6}{n_\mathrm{in} + n_\mathrm{out}}}\right).$$

尽管在上述数学推理中,“不存在非线性”的假设在神经网络中很容易被违反, 但Xavier初始化方法在实践中被证明是有效的。