引言
本节内容主要是讲解几个关于神经网络参数初始化的几个问题
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(w64∗a4+w65∗a5)=0
如果,我们假设真实的输出值为
y
y
y,损失函数为均方误差损失函数,那么有:
L
o
s
s
=
1
2
(
y
−
a
6
)
2
Loss=\frac{1}{2}(y-a_{6})^{2}
Loss=21(y−a6)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 δ=a−y. 假如 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函数
首先我们先补充以下知识(关于均值和方差):
- ∑ 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=0∑d<wixi>=i=0∑d<wi><xi>=0<(i=0∑dwixi)(i=0∑dwixi)>=i=0∑d<wi2><xi2>=σ2d
- 若 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(b−a)2
- 如果随机变量 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(X∗Y)=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=∑iai⋅wi+bj。因此,我们可以通过控制权重参数初始值的范围,使得神经元的输入落在我们需要的范围内。
在此介绍一种简单的方法:
U
(
−
1
d
,
1
d
)
U(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})
U(−d1,d1) U指的是均匀分布,d值得是神经元输入的个数。
解析如下:
因为
w
i
w_{i}
wi服从
U
(
−
1
d
,
1
d
)
U(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})
U(−d1,d1),则
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)=(d2)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(d∑xiwi)=d∑E(xiwi)=d∑0=0Var(d∑xiwi)=d∑Var(xiwi)=d∑(E(xiwi−E(xiwi))2)=d∑(E(xiwi)2)=d∑(E(xi)2E(wi)2)=d∗Var(wi)=1/3
也就是说,随机的d个输入信号加权和,其中权重来自于
(
−
1
d
,
1
d
)
(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})
(−d1,d1)均匀分布,服从均值=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]
W∼U[−Hk+Hk+16,Hk+Hk+16]
其中
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+n6,m+n6]均匀分布中采样。
(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?
4、神经网络中权重初始化问题
里面讲了自己试验时遇到的关于初始化的问题,并给出了集中不同激活函数对应的参数初始化方式。