Deep Learning Note: 1-8 随机初始化
前面在进行逻辑回归的梯度下降时,将各个参数都初始化为 0,但在神经网络中不能这样做。
例如对于如图 1 所示的网络:
如果将 W 初始化为 0,即:
W[1]=[0000]W[2]=[00]
此时对于 a[1]1 和 a[1]2 两个节点,有 a[1]1=a[1]2。又由于这两个节点对输出节点的影响相同,进而导致 dz[1]1=dz[1]2、dW[1]1=dW[1]2,此时称 a[1]1 和 a[1]2 两个节点是对称的(Symmetric),它们计算的实际上是同一个函数。即 W[1] 和 dW[1] 会具有如下的形式:
W[1]=[W11W12]=[stst]
dW[1]=[dW11dW12]=[uvuv]
即便经过了若干次迭代后,W[1] 经过若干次 W[1]=W[1]–αdW[1] 的更新,这两个节点计算的也仍然是同一个函数,W[1] 和 dW[1] 仍会具有如上面式 (1)、(2) 的形式。可以通过数学归纳法证明,如果将所有的 W 都初始化为 0,由于所有节点初始都是对称的,计算的都是同一个函数,对输出节点的具有相同的影响,则经过 1 次迭代后,两个节点仍是对称的。以此类推,经过若干次次迭代后,两个节点仍是对称的。如果两个节点是对称的,则使用一个节点就可以描述这个模型,没有必要使用两个节点。
推广开来,对于更复杂的网络,例如有更多的特征和层数,如果将所有的权重 W 都初始化为 0,则同一层下所有的隐藏单元都是对称的,计算的是同一个函数。而我们实际希望的是,不同的隐藏单元能够计算不同的函数。
解决以上对称问题的方法是,随机地初始化权重 W,如在 Python + NumPy 中可以使用:
W[1]=np.random.randn((2,2))∗0.01
其中 np.random.randn((2, 2))
用于高斯随机初始化一个 2×2 的矩阵。注意这里还乘以一个很小的数字,如上面的 0.01,得到较小的随机初始值,以保证初始学习速率。对于图 1 中网络的第一层,有:
z[1]=W[1]x+b[1]
a[1]=g[1](z[1])
如果 W[1] 较大,则由式 (3) 得到的 z[1] 也较大,对于如 Sigmoid 或 Tanh 等斜率随输入值增加而快速衰减的激活函数,根据前文,如果输入的值很大,则其对应的斜率会很小,梯度下降的速度会很慢,学习也会很慢。使用一个较小的缩放系数令 W 具有较小的初始值,可以保证初始学习速度不会过慢。前面使用的 0.01 适用于较小的网络,对于很深的网络,可能需要根据实际情况选择不同的系数。
对于偏置参数 b,不存在对称问题,不需要破缺对称(Symmetric Breaking),可以初始化为 0,如:
b[1]=[00]