深度学习之神经网络参数初始化问题

引言

本节内容主要是讲解几个关于神经网络参数初始化的几个问题

1、为什么神经网络参数不能全部初始化为0


答:如果把神经网络的参数都初始化为0,往往会导致网络的学习效果失效,失去了“网络”的意义。因为,当网络的参数初始化为0的时候,不管进行多少轮正向传播以及反向传播,每两层之间的参数将都会是一样的。我们本来是希望不同的节点(神经元)学习到不同的参数的,但是由于参数相同以及输出值都一样,不同的节点根本学习不到不同的特征,这样就失去了网络学习特征的意义了。当然将参数初始化为0一个好处就是省力,有效缩短模型的训练时间。


具体解析过程:
注意该解析过程以比较简单的神经网络为例进行分析
假设神经网络的结构如下:输入层(3个神经元)—》隐藏层(5个神经元)----》输出层(1个神经元),如果我们初始化神经元的所有参数为0
那么我们会得到如下隐藏层的神经单元的值均为0,即 z 4 = 0 ; z 5 = 0 z_{4}=0;z_{5}=0 z4=0;z5=0
在这里插入图片描述
从上面可以知道,此时隐藏层的值是相同的,然后经过激活函数 f 1 f_{1} f1后,得到的 a 4 , a 5 a_{4},a_{5} a4,a5的值仍然是相同的,(注:这里的激活函数可以任选我们常见的Relu函数或者sigmoid函数等),因为:
a 4 = f 1 ( z 4 ) = 0 a 5 = f 1 ( z 5 ) = 0 a_{4}=f_{1}(z_{4})=0\\ a_{5}=f_{1}(z_{5})=0 a4=f1(z4)=0a5=f1(z5)=0
那么最终网络的输出值也将是0,因为:
o 6 = f 2 ( w 64 ∗ a 4 + w 65 ∗ a 5 ) = 0 o_{6}=f_{2}(w_{64}*a_{4}+w_{65}*a_{5})=0 o6=f2(w64a4+w65a5)=0
如果,我们假设真实的输出值为 y y y,损失函数为均方误差损失函数,那么有:
L o s s = 1 2 ( y − a 6 ) 2 Loss=\frac{1}{2}(y-a_{6})^{2} Loss=21(ya6)2

通过BP反向传播可以只知道,节点4,5的梯度改变将会是一样的(因为 a 4 = a 5 = 0 a_{4}=a_{5}=0 a4=a5=0),如下所示:
假设梯度值为: Δ w \Delta{w} Δw
w 64 = 0 + Δ w = Δ w w 65 = 0 + Δ w = Δ w w_{64}=0+\Delta{w}=\Delta{w}\\ w_{65}=0+\Delta{w}=\Delta{w} w64=0+Δw=Δww65=0+Δw=Δw
那么,由上式可以看出,新的参数相同了!!!
同理可以得到输入层与隐藏层之间的参数更新都是一样的,得出更新之后的参数也都是相同的,即更新后 w 41 , w 42 , w 43 , w 51 , w 52 , w 53 w_{41},w_{42},w_{43},w_{51},w_{52},w_{53} w41,w42,w43,w51,w52,w53的值是相同的。这样看来,就是说每一层(主要指的是中间的隐藏层)的节点,其实仅仅相当于是一个节点的作用,因为每个神经单元的作用是一模一样的,那这样就失去了神经网络的意义了,也就是说:如果参数初始化为0,很可能导致模型失效,无法收敛。
如果把 f f f替换成具体的函数,最终也可以推导出这样的结果的。例如如果 f f f为ReLU函数: f ( n e t ) = m a x ( 0 , n e t ) f(net)=max(0,net) f(net)=max(0,net),除了输入层的输出值为x本身不为0,其余的所有曾的输出都为0,BP时所有梯度也都为0,这就意味着所有的非输入神经元都是dead neurous,学习失败。具体的可以参见这里。

1、什么时候神经网络参数可以初始化为0呢


答:当没有隐藏层的时候,为了训练简便,可以将所有的参数初始化为0。(其实,没有了隐藏层也就不能再叫做是一个深度神经网络了。)


具体解析过程:
先看最简单的例子: 用逻辑回归算法识别手写数字MNIST. 逻辑回归模型可以算作为一个Single-Layer Perceptron(SLP单层感知机):

  • 28×28=78428×28=784个输入单元, 激活函数为 i d e n t i t y identity identity
  • 10个输出单元, 激活函数为 s o f t m a x softmax softmax
  • 它由两组参数组成: W W W b b b, 前者是一个 10 × 784 10×784 10×784维的权值矩阵, 后者是长度为 10 10 10 b i a s bias bias 列向量.

现将它们全部初始化为0,分析一下学习过程:

  • 第一次forward过程中, 输出层的所有输出为0.5. 反向时,输出层神经元的敏感度为输出值与目标值的差值: δ = a − y δ=a−y δ=ay. 假如 y i = 1 y_{i}=1 yi=1, 即输入 x x x对应的数字为 i i i, 那么除了第 i i i个神经元的敏感度为 − 0.5 −0.5 0.5, 其它神经元都为 0.5 0.5 0.5. w i j w_{ij} wij的梯度值 Δ w i j = δ i x j Δw_{ij}=δ_{i}x_{j} Δwij=δixj, 由于输入向量 x x x的元素之间的不同, 最终得到的10个梯度值有很大概率是不同且非0的, 所以第一次BP过程可以取得成效并将一些 w w w和所有的 b b b变成非 0 0 0值.
  • 于是, 后面的训练显然也可以顺利进行.
    可以看出, 没有隐层时, 可以将所有的参数初始化为0.

常见的几种权重初始化

简介

注意,权重初始并不简单的随机初始化,而是一项会影响训练性能的关键一步,而且有时候会依赖于选择的激活函数。如果仅仅是将权重随机初始化为一些很小的随机数,它会打破梯度更新对称性。

模型权重的初始化对于网络的训练很重要, 不好的初始化参数会导致梯度传播问题, 降低训练速度; 而好的初始化参数, 能够加速收敛, 并且更可能找到较优解. 如果权重一开始很小,信号到达最后也会很小;如果权重一开始很大,信号到达最后也会很大。不合适的权重初始化会使得隐藏层的输入的方差过大,从而在经过sigmoid这种非线性层时离中心较远(导数接近0),因此过早地出现梯度消失.如使用均值0,标准差为1的正态分布初始化在隐藏层的方差仍会很大. 不初始化为0的原因是若初始化为0,所有的神经元节点开始做的都是同样的计算,最终同层的每个神经元得到相同的参数.

  • 如果激活函数是sigmod函数

首先我们先补充以下知识(关于均值和方差):

  1. ∑ i = 0 d < w i x i > = ∑ i = 0 d < w i > < x i > = 0 < ( ∑ i = 0 d w i x i ) ( ∑ i = 0 d w i x i ) > = ∑ i = 0 d < w i 2 > < x i 2 > = σ 2 d \sum_{i=0}^{d}<w_{i}x_{i}> = \sum_{i=0}^{d}<w_{i}><x_{i}> = 0\\<(\sum_{i=0}^{d}w_{i}x_{i})(\sum_{i=0}^{d}w_{i}x_{i})>=\sum_{i=0}^{d}<w_{i}^{2}><x_{i}^{2}>= \sigma^{2}d i=0d<wixi>=i=0d<wi><xi>=0<(i=0dwixi)(i=0dwixi)>=i=0d<wi2><xi2>=σ2d
  2. x x x服从均匀分布 U ( a , b ) U(a,b) U(a,b),那么 x x x的均值(或期望)为 E ( x ) = ( a + b ) 2 ; E(x)=\frac{(a+b)}{2}; E(x)=2(a+b);方差为 V a r ( x ) = ( b − a ) 2 12 Var(x)=\frac{(b-a)^2}{12} Var(x)=12(ba)2
  3. 如果随机变量 X , Y X,Y X,Y是相互独立的,那么 V a r ( X + Y ) = V a r ( X ) + V a r ( Y ) Var(X+Y) = Var(X)+Var(Y) Var(X+Y)=Var(X)+Var(Y),如果X,Y是相互独立的且均值为0,那么 E ( X ∗ Y ) = E ( X ) ∗ E ( Y ) E(X*Y) = E(X)*E(Y) E(XY)=E(X)E(Y)

(1) 一种比较简单、有效的方法是:权重参数初始化从区间均匀随机取值。

sigmod函数图像为:
在这里插入图片描述
通过图像可以看出,当x的绝对值变大时,函数值越来越平滑,趋于饱和,这个时候函数的倒数趋于0,例如,在x=2时,函数的导数约为1/10,而在x=10时,函数的导数已经变成约为1/22000,也就是说,激活函数的输入是10的时候比2的时候神经网络的学习速率要慢2200倍!

为了让神经网络学习得快一些,我们希望激活函数sigmoid的导数较大。从数值图像上看,大约让sigmoid的输入在[-4,4]之间即可。当然,也不一定要那么精确。我们知道,一个神经元j的输入是由前一层神经元的输出的加权和, x j = ∑ i a i ⋅ w i + b j xj=∑_{i}a_{i}⋅w_{i}+b_{j} xj=iaiwi+bj。因此,我们可以通过控制权重参数初始值的范围,使得神经元的输入落在我们需要的范围内。

在此介绍一种简单的方法: U ( − 1 d , 1 d ) U(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}}) U(d 1,d 1) U指的是均匀分布,d值得是神经元输入的个数。
解析如下:
因为 w i w_{i} wi服从 U ( − 1 d , 1 d ) U(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}}) U(d 1,d 1),则 E ( w i ) = 0 , V a r ( w i ) = ( 2 d ) 2 / 12 = 1 3 d E(w_{i})=0,Var(w_{i})=(\frac{2}{\sqrt{d}})^{2}/{12}=\frac{1}{3d} E(wi)=0,Var(wi)=(d 2)2/12=3d1
如果我们限制 d d d个神经元的输入 x i x_{i} xi均服从均值为0,标准差为1的正太分布,那么我们就会得到z这 d d d个神经元的加权和 ∑ d x i w i \sum_{d}x_{i}w_{i} dxiwi的均值和方差为:
E ( ∑ d x i w i ) = ∑ d E ( x i w i ) = ∑ d 0 = 0 V a r ( ∑ d x i w i ) = ∑ d V a r ( x i w i ) = ∑ d ( E ( x i w i − E ( x i w i ) ) 2 ) = ∑ d ( E ( x i w i ) 2 ) = ∑ d ( E ( x i ) 2 E ( w i ) 2 ) = d ∗ V a r ( w i ) = 1 / 3 E(\sum_{d}x_{i}w_{i})=\sum_{d}{E(x_{i}w_{i})}=\sum_{d}{0}=0\\ Var(\sum_{d}x_{i}w_{i})=\sum_{d}Var(x_{i}w_{i})=\sum_{d}(E(x_{i}w_{i}-E(x_{i}w_{i}))^{2})\\ =\sum_{d}(E(x_{i}w_{i})^{2})=\sum_{d}(E(x_{i})^{2}E(w_{i})^{2})=d*Var(w_{i})=1/3 E(dxiwi)=dE(xiwi)=d0=0Var(dxiwi)=dVar(xiwi)=d(E(xiwiE(xiwi))2)=d(E(xiwi)2)=d(E(xi)2E(wi)2)=dVar(wi)=1/3
也就是说,随机的d个输入信号加权和,其中权重来自于 ( − 1 d , 1 d ) (-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}}) (d 1,d 1)均匀分布,服从均值=0,方差=1/3的正态分布,且与d无关。所以神经元的输入落在区间[-4,4]之外的概率非常小。

(2) XAvier初始化
当激活函数为sigmod、tanh函数时可以选择如下初始化
W ∼ U [ − 6 H k + H k + 1 , 6 H k + H k + 1 ] W \sim U\left[-\frac{\sqrt6}{\sqrt{H_k+H_{k+1}}},\frac{\sqrt6}{\sqrt{H_k+H_{k+1}}}\right] WU[Hk+Hk+1 6 ,Hk+Hk+1 6 ]
其中 H k , H k + 1 H_k,H_{k+1} Hk,Hk+1are the sizes of the layers before and after the weight matrix.即前一层神经元的大小和后一层神经元的大小。

Xavier初始化可以帮助减少梯度弥散问题, 使得信号在神经网络中可以传递得更深。是最为常用的神经网络权重初始化方法。
算法根据输入和输出神经元的数量自动决定初始化的范围: 定义参数所在的层的输入维度为n,输出维度为m,那么参数将从 [ − 6 m + n , 6 m + n ] \left[-\frac{\sqrt6}{\sqrt{m+n}},\frac{\sqrt6}{\sqrt{m+n}}\right] [m+n 6 ,m+n 6 ]均匀分布中采样。

(3)初始化为小的随机数
例如,可以初始化为均值为0,方差为0.01的高斯分布:
W=0.01 * np.random.randn(D,H)然而只适用于小型网络,对于深层次网络,权重小导致反向传播计算中梯度也小,梯度"信号"被削弱.

(4)初始权重的方式为正态分布
上面(3)中的分布的方差随着输入数量的增大而增大,可以通过正则化方差来提高权重收敛速率,初始权重的方式为正态分布:w = np.random.randn(n) / sqrt(n). 这会使得中间结果 z = ∑ i w i x i + b z=∑_{i}w_ix_i+b z=iwixi+b的方差较小,神经元不会饱和,学习速度不会减慢.
论文 Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification by He et al. 中阐述了ReLU神经元的权值初始化方式,方差为2.0/n, 高斯分布权重初始化为:w = np.random.randn(n) * sqrt(2.0/n), 这是使用ReLU的网络所推荐的一种方式.
论文[Bengio and Glorot 2010]: Understanding the difficulty of training deep feedforward neuralnetworks 中推荐使用 V a r ( W ) = 2 n i n + n o u t Var(W)=\frac{2}{n{in}+n_{out}} Var(W)=nin+nout2.

(5) MSRA Filler
当激活函数为Relu函数的时候:
用均值为0,方差为 4 n i n + n o u t \sqrt{\frac{4}{n_{in}+n_{out}}} nin+nout4 的高斯分布.

(6) 偏置bias的初始化

一般初始化为0

参考资料


以下是关于神经网络参数初始化问题的相关推荐资料
1、为什么神经网络参数不能全部初始化为全0?

2、什么时候可以将神经网络的参数初始化为0

3、神经网络weight怎样初始化

4、神经网络中权重初始化问题
里面讲了自己试验时遇到的关于初始化的问题,并给出了集中不同激活函数对应的参数初始化方式。

5、神经网络之参数初始化

6、补充阅读:参数初始化

7、神经网络中权重初始化问题:why and How

8、深度学习中神经网络的几种权重初始化方法

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱科研的徐博士

请各位看官赏赐,小仙女笔芯笔芯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值