训练神经网络时,随机初始化权重非常重要。对于Logistic回归,可以将权重初始化为零,但如果将神经网络的各参数全部初始化为0,再使用梯度下降法,这样将会完全无效。

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络

如图所示,这是一个简单的两层神经网络(输入层是第0层),如果将所有的w矩阵和b向量都初始为全0

则矩阵

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_02

  是

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_深度学习_03

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_初始化_04


bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络_05

   

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络_06


bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_07

将偏置项b初始化为0实际上是可行的,但把W初始化成全零就成问题了,它的问题在于给神经网络输入任何的样本,隐藏层的两个单元都是相同的值,由于每个激活单元的计算公式如下,([i]表示第i层,w表示权重矩阵,x表示训练样本,b表示偏置项向量,a表示激活后的值)

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络_08

由于w[1]是全0矩阵(维度是2x2),所以

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_09

然后在相同的激活函数作用后,得

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络_10

所以这两个隐藏单元其实在进行相同的计算,它们在做一样的事情。

又因为w[2]也是全0的矩阵(维度是1x2),所以

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_11

现在的Loss function(损失函数)为

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_12

那么对a求导

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络_13

为了便于说明问题,这里假设输出层的激活函数是sigmoid函数,即

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_14

g(z)代表激活函数作用在z之后的值,所以g(z)=a,所以

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_15

那么由链式求导法则知

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_16

所以

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_17

由于

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_初始化_18

,所以

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_19

,根据前面的推导,可知dw[2]的两个分量也是相同的,那么梯度下降更新一次

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_深度学习_20

,所以

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_21

又因为

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_22

,那么da的两个分量也是相同的,

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_权重_23

所以dz[1]的两个分量是相同的

再向前计算一次导数

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_神经网络_24

bp神经网络 python 初始化权重和偏置 神经网络权重初始化为0_初始化_25

u,v只是变量记号,结果表明每个单元的节点的权重是一样的,即权重矩阵的每一行是相同的。

一直这样迭代下去,神经网络的每一次正向和反向传播,隐藏层的每个激活单元其实都在计算同样的东西,其实也就是一个"对称网络",这种网络无法学习到什么有趣的东西,因为每个隐藏层的激活单元都在计算同样的东西,那么隐藏层其实相当于只有一个单元,所以这个神经网络其实可以简化为logistic回归,因此神经网络的W参数矩阵不能随机初始化为0。