Deep Learning Note: 1-8 随机初始化

  前面在进行逻辑回归的梯度下降时,将各个参数都初始化为 0,但在神经网络中不能这样做。

  例如对于如图 1 所示的网络:

图 1

图 1

  如果将 $W$ 初始化为 0,即:

\begin{equation}
W^{[1]} = \begin{bmatrix}0 & 0 \\ 0 & 0 \end{bmatrix}
W^{[2]} = \begin{bmatrix}0 & 0 \end{bmatrix}
\end{equation}

  此时对于 $a_1^{[1]}$ 和 $a_2^{[1]}$ 两个节点,有 $a_1^{[1]} = a_2^{[1]}$。又由于这两个节点对输出节点的影响相同,进而导致 $dz_1^{[1]} = dz_2^{[1]}$、$dW_1^{[1]} = dW_2^{[1]}$,此时称 $a_1^{[1]}$ 和 $a_2^{[1]}$ 两个节点是对称的(Symmetric),它们计算的实际上是同一个函数。即 $W^{[1]}$ 和 $dW^{[1]}$ 会具有如下的形式:

\begin{equation}
W^{[1]} = \begin{bmatrix}W_1^{1} \\ W_2^{1} \end{bmatrix}
= \begin{bmatrix}s & t \\ s & t \end{bmatrix} \tag{1}
\end{equation}

\begin{equation}
dW^{[1]} = \begin{bmatrix}dW_1^{1} \\ dW_2^{1} \end{bmatrix}
= \begin{bmatrix}u & v \\ u & v \end{bmatrix} \tag{2}
\end{equation}

  即便经过了若干次迭代后,$W^{[1]}$ 经过若干次 $W^{[1]} = W^{[1]} – \alpha dW^{[1]}$ 的更新,这两个节点计算的也仍然是同一个函数,$W^{[1]}$ 和 $dW^{[1]}$ 仍会具有如上面式 (1)、(2) 的形式。可以通过数学归纳法证明,如果将所有的 $W$ 都初始化为 0,由于所有节点初始都是对称的,计算的都是同一个函数,对输出节点的具有相同的影响,则经过 1 次迭代后,两个节点仍是对称的。以此类推,经过若干次次迭代后,两个节点仍是对称的。如果两个节点是对称的,则使用一个节点就可以描述这个模型,没有必要使用两个节点。

  推广开来,对于更复杂的网络,例如有更多的特征和层数,如果将所有的权重 $W$ 都初始化为 0,则同一层下所有的隐藏单元都是对称的,计算的是同一个函数。而我们实际希望的是,不同的隐藏单元能够计算不同的函数。

  解决以上对称问题的方法是,随机地初始化权重 $W$,如在 Python + NumPy 中可以使用:

\begin{equation}
W^{[1]} = np.random.randn((2, 2)) * 0.01
\end{equation}

  其中 np.random.randn((2, 2)) 用于高斯随机初始化一个 $2 \times 2$ 的矩阵。注意这里还乘以一个很小的数字,如上面的 0.01,得到较小的随机初始值,以保证初始学习速率。对于图 1 中网络的第一层,有:

\begin{equation}
z^{[1]} = W^{[1]}x + b^{[1]} \tag{3}
\end{equation}

\begin{equation}
a^{[1]} = g^{[1]}(z^{[1]}) \tag{4}
\end{equation}

  如果 $W^{[1]}$ 较大,则由式 (3) 得到的 $z^{[1]}$ 也较大,对于如 Sigmoid 或 Tanh 等斜率随输入值增加而快速衰减的激活函数,根据前文,如果输入的值很大,则其对应的斜率会很小,梯度下降的速度会很慢,学习也会很慢。使用一个较小的缩放系数令 $W$ 具有较小的初始值,可以保证初始学习速度不会过慢。前面使用的 0.01 适用于较小的网络,对于很深的网络,可能需要根据实际情况选择不同的系数。

  对于偏置参数 $b$,不存在对称问题,不需要破缺对称(Symmetric Breaking),可以初始化为 0,如:

\begin{equation}
b^{[1]} = \begin{bmatrix}0 \\ 0 \end{bmatrix}
\end{equation}