深度学习(随机初始化权重)

为什么要随机初始化权重

对于logistic回归,可将权重初始化为0,但如果将神经网络的各参数数组全初始化为0,再使用梯度下降算法,那会完全无效。

那上述神经网络模型来进行说明

首先有两个输入特征,即n^{[0]}=2

有两个隐藏单元,即n^{[1]}=2

因此,和隐层相关的矩阵w^{[1]}是(2,2)的,将其初始化为\begin{bmatrix} 0 & 0\\ 0& 0 \end{bmatrix}

将偏置项b初始化为0,即\begin{bmatrix} 0\\ 0 \end{bmatrix}

以上将b初始化为0是可行的,

但是,把W初始化全0,就存在有问题

其所存在的主要问题为,无论给该网络输入任何样本,输入所得到的a1,a2均为相同的

即所得到两个激活函数是完全一样的

因为两个隐藏单元都在做完全一样的计算

当做反向传播的时候,出于对称性dz1,dz2所得到的结果也是相同的

这两个隐藏单元会以同样方式初始化, 

技术上,假如说输出的权重也是一样的,所以w2就等于0,即w^{[2]}=\begin{bmatrix} 0 & 0 \end{bmatrix}

如果以上述这样的方式进行初始化,所得到的两个隐藏单元完全一样,这就是所谓的完全对称

意味着节点计算完全一样的函数

可通过数学归纳法进行证明,经过多次迭代后,两个隐藏单元仍然在计算完全相同的函数

因此在这儿种情况下,多个隐藏单元没有意义,因为计算的都是同样的东西

对于更大的神经网络,或者输入有三个特征,或者隐藏单元的数目非常多

如图:

可以用类似的昂啊证明如果把所有权重都初始化为0,那么所有的隐藏单元都是对称的,不管跑多久梯度下降它们都在计算一样完全一样的函数,所以没有什么用,因为需要不同的隐藏单元计算不同的函数

解决方案

因此针对此问题的解决方案就是随机初始化所有参数 

W^[1]=np.random.randn((2,2))

这可以产生参数为(2,2)的高斯分布随机变量

然后再乘以一个很小的数字,例如0.01,就可以将权重初始化为很小的随机数

对于参数b而言,b完全没有这个对称性问题,没有破坏性对称问题

所以可以将b初始化为0

b^[1]=np.zeros((2,2))

类似地对于w2,也可以同w1进行随机初始化,b2也可以初始化为0

tips:为什么是0.01,而不用100或1000之类的数字

通常我们喜欢将权重矩阵初始化为很小很小的随机值

因为,如果用的额是tanh或者sigmoid激活函数,或者在输出层有一个sigmoid函数,如果权重太大,当计算激活函数值时

根据公式z^{[1]}=w^{[1]}x+b^{[1]}

然后a^{[1]}=g^{[1]}(z^{[1]}),是应用于z^[1]的额激活函数

所以如果w很大,z就会很大,或者z值会很大或很小,在这种情况下,结合tanh和sigmoid函数图像可得到,最后的值可能落在其平缓部分,梯度的效率非常小,梯度下降法会很慢,学习就会很慢。

所以,如果w一开始很大,就会在训练时就落在z很大的区域,导致tanh或sigmoid激活函数接近饱和,从而减慢学习速度。

但如果神经网络当中没有任何sigmoid或tanh激活函数,可能问题没有那么大 

但是如果在做二分类时,如果输出单元是sigmoid函数,那么初始参数就不要太大,0.01就较为合理,或者任意其他小数字,对于初始化w2也是同样的道理

实际上,有时也有比0.01更好用的常数

当训练一个单隐层神经网络时,是一个相对较浅的神经网络,没有太多隐藏层,设为0.01也还是可以,但是在训练一个很深的神经网络时,可能会尝试0.01以外的常数。

但不管怎样,初始化参数一般都会很小。

  • 33
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值