本文旨在讨论为什么许多深度神经网络在初始化参数时不全都初始化为0。
首先讨论线性模型 y=wTx+b 在目标函数为 J=12∥y−(wTx+b)∥22时的参数初始化问题。
假设 x 是 n×1 维的向量,输出 y 是一个标量,则很明显 w 应该是 n×1 维的向量,在输入样本进行训练时,为了降低损失函数,要对权重参数求偏导并结合学习率来迭代更新权重参数:
∂J∂w=∥y−(wTx+b)∥2⋅x (标量对向量的求导使用的是分母布局)
若将 n×1维的 w 各分量初始化为0时,观察各 w 分量的梯度,基于一般性的考虑,输入 x 在各维度分量取值会不同,因此对于 w 各分量其梯度也会不同,因此线性模型 y=wTx+b 的参数均初始化为0时是可以的。
讨论以下逻辑回归模型 y=f(wTx+b) ,结合以下要讲的内容可以等价为单核神经元(只有一个隐藏单元),f 一般为sigmoid函数,即 f(x)=11+e−x,相比线性模型,逻辑回归模型从输入到输出的映射关系已由线性变成了非线性,由链式法则可求得此时的目标函数对参数的偏导为:
∂J∂w=∂J∂f(wTx+b)⋅∂f(wTx+b)∂(wTx+b)⋅∂(wTx+b)∂w=∥y−(wTx+b)∥2⋅∂f(wTx+b)∂(wTx+b)⋅x
相比原先的线性模型,在激活函数为sigmoid函数的情况下,其参数在迭代更新时的梯度大小由于乘上了一个 [0,1] 区间内的系数变得更小,训练过程的收敛速度变慢,但也因此能够获得更逼近期望模型的参数解。
逻辑回归模型的取值范围被 f 映射到了 [0,1] 区间内,使得原先的线性模型获得了表示概率的能力。通过设置一个阈值,我们就可以使用逻辑回归模型来做二分类任务了。
再来讨论单输入多隐含层单输出的神经网络层 y=f(wTx) 在目标函数为 J=12∥f(wTx)∥ 时的参数初始化的问题。
此时的 仍与之前一致,为 n×1 维的向量,然而不同的是,此时的输出为 y=f(∑di=1wT⋅i⋅x),相应的 w变成了一个 n×d 维的权重矩阵,换作线性代数的角度则可理解为之前的单个隐藏单元只能获得了一组基的单个组合表示,而这里通过隐藏层我们可以得到一组基的 d 个组合表示,而激活值 z 则为这 个组合表示的累加,激活值再通过激活函数我们可以得到最后的输出 y 。由于此时的输入 x 是与权重矩阵的列向量做内积操作,根据目标函数对第 i 列权重 w⋅i(i=1,2,...,d) 的偏导:
∂J∂w⋅i=∂J∂∥y−f(wT⋅ix)∥2⋅∂∥y−f(wT⋅ix)∥2∂∑di=1wT⋅ix⋅∂∑di=1wT⋅ix∂wT⋅ix⋅∂wT⋅ix∂w⋅i=∥y−f(wT⋅ix)∥2⋅∂f(wT⋅ix)∂∑di=1wT⋅ix⋅x
由此可见,若将 d 列的权重向量全部初始化为同一个向量,则在前向传播时输出单元得到的输出将等价于其中一列向量的 d 倍,在反向传播时各列权重的梯度也一样,因此无论怎么训练在同一组输入的情况下具有 n×d 个参数的网络层只具有一个隐藏单元的非线性表达能力(也就是一个逻辑回归模型的非线性表达能力),因此为了更好的利用激活函数的非线性表达能力,在对单输入单输出的神经网络模型参数初始化时,将权重矩阵内的各行初始化为同一个值一般不可取。
再进一步,当输出单元有 m 个,即输出 y 是一个 m×1 维向量时,第 j 个神经元的输出应为 yj=f(∑di=1wT⋅ijx),相应的 w 变成一个 n×d×m 维的权重张量,这一步的意义可理解为获得单个神经元的 m 倍非线性表达能力。
此时的目标函数为 J=12∑mj=1∥yj−f(∑di=1wT⋅ijx)∥22,根据链式法则,我们只能对权重张量内第 j 维权重矩阵的第 i 列权重向量求偏导(实在不知道如何表示张量的索引),可得:
∂J∂w⋅ij=∂J∂∥yj−f(∑di=1wT⋅ijx)∥2⋅∂∥yj−f(∑di=1wT⋅ijx)∥2∂f(∑di=1wT⋅ijx)⋅∂f(∑di=1wT⋅ijx)∂∑di=1wT⋅ijx⋅∂∑di=1wT⋅ijx∂wT⋅ijx⋅∂wT⋅ijx∂wT⋅ij=∥yj−f(∑i=1dwT⋅ijx)∥2⋅∂f(∑di=1wT⋅ijx)∂∑di=1wT⋅ijx⋅x
因此,对于 w 这样一个 n×d×m 维的权重张量,若将2维以上(张量的“维”,类似于矩阵的2维)的所有参数初始化为同一个值,则其性能将等价于一个单输入单输出的神经网络层,若将1维以上的所有参数初始化为同一个值,则其性能将等价于一个线性模型。
总结来说,对于正常的输入为 k 个神经元输出为 m 个神经元的网络全连接层,其权重张量维度为 n×k×d×m 的情况下,我们总是希望第(p,:,:,:)维权重张量中的各元素初始化为不同的值,也就是说不光是0,我们不希望权重参数全都初始化为任意某一值,而对于权重张量中的第(:,q,s,t)维参数而言初始化为不同值没有必要性。