神经网络权重初始化

在我们真正开始训练网络之前,我们必须要知道如何去初始化神经网络的参数。

陷阱: 都初始化为0。

        首先介绍一下我们不应该做的事情(即初始化为0)。需要注意的是我们并不知道在训练神经网络中每一个权重最后的值,但是如果进行了恰当的数据归一化后,我们可以有理由认为有一半的权重是正的,另一半是负的。令所有权重都初始化为0这个一个听起来还蛮合理的想法也许是一个我们假设中最好的一个假设了。但结果正确是一个错误(的想法),因为如果神经网络计算出来的输出值都一个样,那么反向传播算法计算出来的梯度值一样,并且参数更新值也一样 。更一般地说,如果权重初始化为同一个值,网络就不可能不对称(即是对称的)。

为什么参数的初始值不能设定为全0(不能是全都一样的值)?

一种形象的解释是:

      设想你在爬山,但身处直线形的山谷中,两边是对称的山峰。 由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰;你走了一步之后,情况依然不变。 结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。

原理:

以一个三层网络为例,首先看下结构

                                

它的表达式为:

                              

         如果每个权重都一样,那么在多层网络中,从第二层开始,每一层的输入值都是相同的了也就是a1=a2=a3=....,既然都一样,就相当于一个输入了,代入到后面的算法中得到的答案是相同的。所得到的梯度下降法的偏导相同,不停的迭代,不停的相同,不停的迭代,不停的相同......,最后就得到了相同的值(权重和截距)。

 使用反向传播来训练该模型,而参数W的更新规则是按照下面的公式进行:

                                                       

这将导致,在反向传播的时候,每一层的dW都一样,进而使得每一层的W一样。这样就回到了上面所讲的模型退化问题了。

简而言之就是:

     当每层的W一样时,检测的特征也一样,网络经过前向传播和反向传播后,每层的W值更新后大小还是一致,因此检测的特征也还是一样。每层的W一样,会使得多层的效果和一层的效果是一致的,因为提取的特征是重复的,即出现模型退化问题。所以神经网络参数的初始值不能全相同,初始值全设为0即使一个特例,自然初始化是无效的。

初始化为小的随机数

       既然不能都初始化为0,那么很自然的我们会想到将权重初始化为非常接近0的小数 。将权重初始化为很小的数字是一个普遍的打破网络对称性的解决办法。这个想法是,神经元在一开始都是随机的、独一无二的,所以它们会计算出不同的更新,并将自己整合到整个网络的各个部分。每个神经元的权重向量初始化为一个服从多维高斯分布取样的随机向量,所以神经元在输入空间中指向随机的方向(so the neurons point in random direction in the input space.应该是指输入空间对于随机方向有影响)。其实也可以从均匀分布中来随机选取小数,但是在实际操作中看起来似乎对最后的表现并没有太大的影响。

    警告:并不是数字越小就会表现的越好。比如,如果一个神经网络层的权重非常小,那么在反向传播算法就会计算出很小的梯度(因为梯度gradient是与权重成正比的)。在网络不断的反向传播过程中将极大地减少“梯度信号”,并可能成为深层网络的一个需要注意的问题。   

方差标准化

       上述建议的一个问题是,随机初始化神经元的输出的分布有一个随输入量增加而变化的方差。结果证明,我们可以通过将其权重向量按其输入的平方根(即输入的数量)进行缩放,从而将每个神经元的输出的方差标准化到1。也就是说推荐的启发式方法(heuristic)是将每个神经元的权重向量按下面的方法进行初始化:  w=np.random.randn(n)/sqrt(n) ,

      其中n 表示输入的数量。这保证了网络中所有的神经元最初的输出分布大致相同,并在经验上提高了收敛速度。

 w=np.random.randn(n)/sqrt(n)推导过程大致如下: 

令权重w和输入x的内积表达式为: s=\sum (w_{i}x_{i}),       计算s的方差:

                                             

       第三步,我们我们假设输入值和权重均值为0, 。注意到这不是一般的情况:比如ReLU的单元会有一个正的均值。在最后一步我们假设所有的wi,xi 都是同分布的(即w1,w2... 是同分布,x1,x2,... 是同分布,但是 w和 x不是同分布)。

        从这个推导中我们可以看到如果我们想让s和所有的输入都有相同的方差,那么需要保证在初始化的时候每个权重w的方差是1/n。并且因为(a是一个标量, X是一个随机变量),这就意味着我们可以从单位高斯分布中取样,然后通过a=\sqrt{\frac{1}{n}}   进行缩放来使得权重的方差为1/n。

Xavier( Glorot)初始化

      Glorot等人所写的文章Understanding the difficulty of training deep feedforward neural networks中有类似的分析。在这篇论文中,作者的结论是建议初始化的形式是:

                                                   \sigma =\sqrt{\frac{2}{n_{inputs}+n_{outputs}}}

其中 n_{inputs}n_{outputs} 是权重被初始化层的输入和输出连接数(也称为扇入和扇出)。这是基于一个折中的选择和对反向传播梯度等价分析后具有积极作用的办法.

                                     

该方法有一定限制,其推导过程假设激活函数在零点附近接近线性函数,且激活值关于0对称。 relu函数不满足这些假设。

He 初始化(ReLU及其变体)

适用于ReLU的初始化:

                         

from :https://blog.csdn.net/marsggbo/article/details/77771497

from :https://blog.csdn.net/u012151283/article/details/78230891/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值