Dark Dwarf Blog background

参数初始化

参数初始化

1. Xavier 初始化

a.a. 方差稳定性

在前面的笔记中,我们提到了梯度爆炸与梯度消失的问题:

  • 如果梯度连乘项中的每一个因子都小于 1,那么一长串小于 1 的数字相乘,结果会以指数级速度缩小,迅速趋近于 0。
  • 如果梯度连乘项中的每一个因子都大于 1,那么一长串大于 1 的数字相乘,结果就会以指数级速度增大,变得异常巨大。

导致这些现象的根本原因在于不恰当的信号流。而我们可以用方差来衡量信号的强度

  • 方差接近于 0:意味着所有信号都收敛到了同一个值,信息量几乎为零。这就对应了“信号消失”或“梯度消失”。
  • 方差变得极大:意味着信号值变得异常分散和巨大。这就对应了“信号爆炸”或“梯度爆炸”。

因此,我们希望对参数进行合适的初始化,让方差保持稳定

b.b. Xavier 方法推导

Xavier 初始化方法的核心目标就是:让每一层输出的方差和输入的方差保持一致

Xavier 作了如下的假设:

  1. 激活函数是线性的。
  2. 输入和输出的权重为 0。

并设:

  • 输入 xx 的每个元素的方差 Var(xi)=σx2\text{Var}(x_i) = \sigma^2_x
  • 权重 WW 的每个元素的方差 Var(Wij)=σW2\text{Var}(W_{ij}) = \sigma^2_W

那么可如下推导该层输出的方差:

yj=i=1ninWjixiVar(yj)=i=1ninVar(Wjixi)=i=1ninVar(Wji)Var(xi)Var(yj)=ninVar(Wji)Var(xi)Var(yj)=ninσW2σx2\begin{aligned} y_j &= \sum_{i=1}^{n_{\text{in}}} W_{j i}\, x_i \\[6pt] \operatorname{Var}(y_j) &= \sum_{i=1}^{n_{\text{in}}} \operatorname{Var}\bigl(W_{j i}\, x_i\bigr) \\[4pt] &= \sum_{i=1}^{n_{\text{in}}} \operatorname{Var}(W_{j i})\,\operatorname{Var}(x_i) \\[6pt] \Rightarrow\quad \operatorname{Var}(y_j) &= n_{\text{in}} \cdot \operatorname{Var}(W_{j i}) \cdot \operatorname{Var}(x_i) \\[6pt] \Rightarrow\quad \operatorname{Var}(y_j) &= n_{\text{in}} \cdot \sigma_W^2 \cdot \sigma_x^2 \end{aligned}

均值为 0 的条件用在了下面的式子推导:

E[A2]=Var(A)+(E[A])2=Var(A)\operatorname{E}[A^2] = \operatorname{Var}(A) + (\operatorname{E}[A])^2=\operatorname{Var}(A)

为了保持信号方差稳定,我们仍然希望 Var(y)=Var(x)\text{Var}(y) = \text{Var}(x),于是:

Var(yj)=σx2σW2=1nin\begin{aligned} \operatorname{Var}(y_j) &= \sigma_x^2 \\ \Rightarrow\quad \sigma_W^2 &= \frac{1}{n_{\text{in}}} \end{aligned}

这个公式只考虑了前向传播。在训练时,我们还需要反向传播梯度。为了同时兼顾前向传播(信号)和反向传播(梯度)的稳定性,Glorot 和 Bengio 做了一个折中,同时考虑了输入和输出神经元的数量ninn_{in}noutn_{out}

σW2=2nin+nout\sigma^2_W = \frac{2}{n_{in} + n_{out}}

这即是最终的 Glorot 条件。

c.c. 使用 Xavier 进行初始化

基于上面推导出的理想方差,我们有两种具体的初始化方法:

  1. Xavier 均匀分布 (Xavier Uniform):从一个均匀分布 U[a,a]U[-a, a] 中采样来初始化权:
WU[6nin+nout,6nin+nout]W \sim U\left[-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right]

这里的 6\sqrt{6} 是因为均匀分布 U[a,a]U[-a, a] 的方差是 a23\frac{a^2}{3}

  1. Xavier 正态分布 (Xavier Normal):从一个均值为 0,标准差为 σW\sigma_W 的正态分布中采样:
WN(0,2nin+nout)W \sim N\left(0, \sqrt{\frac{2}{n_{in} + n_{out}}}\right)

d.d. 适用激活函数

tanh(值域 [-1, 1])和 sigmoid(值域 [0, 1],但通常会调整使其中心在 0 附近)这类激活函数,它们在 0 点附近近似线性,并且输出分布相对对称。这使得它们能够较好地满足 Xavier 初始化的假设,从而保持信号在网络中稳定流动。

这里强调对称是为了达到以下目的:当我们给它一个均值为 0 的输入 zz 时,它的输出 aa 也会在 0 的两侧对称分布,因此输出的均值也近似为 0。这样输出也近似符合 Xavier 的条件了

2. KaiMing 初始化

a.a. Xavier 在 Relu 上的问题

Xavier 初始化是为 tanh 等对称函数设计的。当把它用在 ReLU 上时,会出现严重问题:

  1. 非对称激活 (Non-symmetric activation): ReLU 的输出永远是非负的(大于等于0)。这破坏了 Xavier 初始化所依赖的“激活输出均值为0”的核心假设。

  2. 方差减半 (Variance halving): 这是最关键的一点。如果输入数据 xx 是一个均值为0的正态分布,经过 ReLU 函数后,所有负数部分都变成了0。这相当于直接丢掉了一半的信息,其直接后果就是方差会减少大约一半。这意味着,每经过一个 ReLU 层,信号的方差就会减半。在深度网络中,信号会逐层衰减,最终消失,导致梯度消失问题。

b.b. KaiMing 方法

何恺明等人在他们的论文中,专门针对 ReLU 及其变种,推导出了新的初始化方法。推导如下:

Var(ReLU(x))=12Var(x)Var(y)=ninσW2Var(ReLU(x))=ninσW212Var(x)Var(y)=Var(x)ninσW212=1σW2=2nin\begin{aligned} \operatorname{Var}\bigl(\operatorname{ReLU}(x)\bigr) &= \tfrac{1}{2}\,\operatorname{Var}(x) \\[6pt] \operatorname{Var}(y) &= n_{\text{in}}\,\sigma_W^2\,\operatorname{Var}\bigl(\operatorname{ReLU}(x)\bigr) \\ &= n_{\text{in}}\,\sigma_W^2\,\tfrac{1}{2}\,\operatorname{Var}(x) \\[6pt] \Rightarrow\quad \operatorname{Var}(y) &= \operatorname{Var}(x) \\[4pt] \Rightarrow\quad n_{\text{in}}\,\sigma_W^2\,\tfrac{1}{2} &= 1 \\[6pt] \Rightarrow\quad \sigma_W^2 &= \frac{2}{n_{\text{in}}} \end{aligned}

同样地,KaiMing 方法也有下面两种形式:

  • Kaiming 均匀分布 (Kaiming Uniform):WU[6nin,6nin]W \sim U\left[-\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}}\right]

  • Kaiming 正态分布 (Kaiming Normal):WN(0,2nin)W \sim N\left(0, \sqrt{\frac{2}{n_{in}}}\right)

Kaiming 方法 “乘以2” 的操作,正好抵消了 ReLU 激活函数带来的 “除以2” 的方差衰减效应,从而使得信号能够更好地流动。

3.