权值初始化

摘要:
假设神经网络中只有一个有2个神经元的隐藏层,现在将偏置参数初始化为:,权值矩阵初始化为一个常数。如果权值的初始值过大,则lossfunction相对于权值参数的梯度值很大,每次利用梯度下降更新参数的时,参数更新的幅度也会很大,这就导致lossfunction的值在其最小值附近震荡。Xavier初始化Xavier初始化,由XavierGlorot在2010年的论文Understandingthedifficultyoftrainingdeepfeedforwardneuralnetworks提出。Xavier的初始化有个假设条件,激活函数关于0对称,且主要针对于全连接神经网络。

设计好神经网络结构以及loss function 后,训练神经网络的步骤如下:

  1. 初始化权值参数
  2. 选择一个合适的梯度下降算法(例如:Adam,RMSprop等)
  3. 重复下面的迭代过程:
    1. 输入的正向传播
    2. 计算loss function 的值
    3. 反向传播,计算loss function 相对于权值参数的梯度值
    4. 根据选择的梯度下降算法,使用梯度值更新每个权值参数

初始化

神经网络的训练过程是一个迭代的过程,俗话说:好的开始就是成功的一半,所以的权值参数的初始化的值对网络最终的训练结果有很大的影响。 过大或者过小的初始值,对网络收敛的结果都会有不好的结果。

所有的参数初始化为0或者相同的常数

最简单的初始化方法就是将权值参数全部初始化为0或者一个常数,但是使用这种方法会导致网络中所有的神经元学习到的是相同的特征

假设神经网络中只有一个有2个神经元的隐藏层,现在将偏置参数初始化为:(bias = 0),权值矩阵初始化为一个常数(alpha)。 网络的输入为((x_1,x_2)),隐藏层使用的激活函数为(ReLU),则隐藏层的每个神经元的输出都是(relu(alpha x_1 + alpha x_2))。 这就导致,对于loss function的值来说,两个神经元的影响是一样的,在反向传播的过程中对应参数的梯度值也是一样,也就说在训练的过程中,两个神经元的参数一直保持一致,其学习到的特征也就一样,相当于整个网络只有一个神经元。

过大或者过小的初始化

如果权值的初始值过大,则会导致梯度爆炸,使得网络不收敛;过小的权值初始值,则会导致梯度消失,会导致网络收敛缓慢或者收敛到局部极小值。

如果权值的初始值过大,则loss function相对于权值参数的梯度值很大,每次利用梯度下降更新参数的时,参数更新的幅度也会很大,这就导致loss function的值在其最小值附近震荡。

而过小的初值值则相反,loss关于权值参数的梯度很小,每次更新参数时,更新的幅度也很小,着就会导致loss的收敛很缓慢,或者在收敛到最小值前在某个局部的极小值收敛了。

Xavier初始化

Xavier初始化,由Xavier Glorot 在2010年的论文 Understanding the difficulty of training deep feedforward neural networks 提出。
为了避免梯度爆炸或者梯度消失,有两个经验性的准则:

  1. 每一层神经元激活值的均值要保持为0
  2. 每一层激活的方差应该保持不变。

在正向传播时,每层的激活值的方差保持不变;在反向传播时,每层的梯度值的方差保持不变。

基于上述的准则,初始的权值参数(W^l)(l)为网络的第(l)层)要符合以下公式

[egin{aligned} W^{[l]} & sim mathcal{N}left(mu=0, sigma^{2}=frac{1}{n^{[l-1]}} ight) \ b^{[l]} &=0 end{aligned} ]

其中(n^{n-1})是第(l-1)层的神经元的个数。 也就是说,初始的权值(w)可以从均值(mu = 0),方差为(sigma^{2}=frac{1}{n ^{l-1}})的正态分布中随机选取。

正向传播的推导过程

推导过程中的三个假设:

  1. 权值矩阵(w)是独立同分布的,且其均值为0
  2. 每一层的输入(a)是独立同分布的,且均值也为0
  3. (w)(a)是相互独立的

(L)层的权值矩阵为(W),偏置为(b),其输入为(a)

[z^l = w^la^{l-1} + b^l ]

[Var(z^l) = Var(sum_{i=0}^nw_{i}^la_i^l) = sum_{i=0}^n Var(w_{i}^la_i^{l-1}) ]

有统计概率的知识可得到:(第一个假设(W),(x)相互独立)

[Var(w_ix_i) = E^2(w_i)Var(w_i) + E^2(x_i)Var(x_i) + Var(w_i)Var(x_i) ]

由第一第二个假设可知:(l)层输入的均值为0,权值参数(W)的均值也为0,即:(E(x_i) = 0,E(w_i) = 0)则有:(Var(w_ix_i) = Var(w_i)Var(x_i)),即

[Var(z^l) = sum_{i=0}^nVar(w_i^l)Var(x_i^{l-1}) ]

设权值矩阵(W)独立同分布的则有(Var(w^l) = Var(w_{11}^l) = cdots = Var(W_{ij}^l)),输入(a^{l-1})也是独立同分布的有:(Var(a^{l-1}) = Var(a_1^{l-1}) = cdots = Var(a_i^{l-1}))
则有

[Var(z^l) = n^{l-1}Var(w^l)Var(a^{l-1}),(n-1)为上一层神经元的个数 ]

这里得出了第(l)层输入到激活函数中的值(z^l)与其输入(a^{l-1})(也就是上一层输出的激活值)的方差之间的关系。但我们假设的是每一层输出的激活值的方差保持不变,也就是说要得到(Var(a^l))(Var(a^{l-1}))之间的关系。

(f)为激活函数,则有

[a^l = f(z^l) ]

Xavier假设的激活函数为(tanh),其函数曲线为
权值初始化第1张

其中间的部分可以近似线性(linear regime),而在训练的过程就要保证激活值是落在这个线性状体的区间内的,不然就会出现梯度饱和的情况。所以,这里可以近似的有

[a^l = tanh(z^l) ]

也就是说:

[Var(a^l) = Var(z^l) = n^{l-1}Var(w^l)Var(a^{l-1}) ]

要让每一层的激活值的方差保持不变,则有(Var(a^l) = Var(a^{l-1})),既有

[Var(w^l) = frac{1}{n^{l-1}} ]

通常输入神经元和输出神经元的个数不一定总是相同的,这里取两者的均值

[forall i, operatorname{Var}left(W^{l+1} ight)=frac{2}{n_{l}+n_{l+1}} ]

限制
对于权值的初始化,Glorot提出两个准则:

  • 各个层激活值的方差保持不变(正向传播)
  • 各个层的梯度值的方差保持不变(反向传播)

在Xavier的推导的过程中,做了以下假设:

  1. 权值矩阵(w)是独立同分布的,且其均值为0
  2. 每一层的输入(a)是独立同分布的,且均值也为0
  3. (w)(a)是相互独立的

但是,对Xavier限制最大的则是,其是基于tanh作为激活函数的。
上述公式的详细推导过程可参见 http://www.deeplearning.ai/ai-notes/initialization/

Xavier的初始化有个假设条件,激活函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign。

均匀分布

通过上面的推导,得出权值矩阵的均值为:0,方差为

[forall i, operatorname{Var}left(W^{l+1} ight)=frac{2}{n_{l}+n_{l+1}} ]

$[a,b] (间的均匀分布的方差为) var = frac{(b-a)^2}{12}(,设)F_{in}(为输入的神经元个数,)F_{out}$为输出的神经元个数

[limit = sqrt{frac{6}{F_{in} + F_{out}}} ]

则权值参数从分布

[W sim U[-limit,limit] ightarrow W sim Uleft[-sqrt{frac{6}{F_{in} + F_{out}}}, + sqrt{frac{6}{F_{in} + F_{out}}} ight] ]

正态分布

基于正态分布的Xavier初始化从均值为0,方差为(sqrt{frac{2}{F_{in} + F_{out}}})的正态分布中随机选取。

[W sim N(0.0,sqrt{frac{2}{F_{in} + F_{out}}}) ]

He初始化(MSRA)

由 Kaiming 在论文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification提出,由于Xavier的假设条件是激活函数是关于0对称的,而常用的ReLU激活函数并不能满足该条件。

只考虑输入的个数,MSRA的初始化是一个均值为0,方差为(sqrt{frac{2}{F_{in}}})的高斯分布

[w sim Gleft[0, sqrt{frac{2}{F_{in }}} ight] ]

正向传播的推导过程

其前半部分的推导和Xavider类似
对于第(l)层,有如下公式 :

[mathbf{y}_{l}=mathbf{W}_{l} mathbf{x}_{l}+mathbf{b}_{l} ]

其中,(x_l)为当前层的输入,也是上一层的激活后的输出值。(y_l)为当前层输入到激活函数的值,(w_l)(b_l)为权值和偏置。其中(x_l)以及(w_l)都是独立同分布的,(和Xavier相同的假设条件),则有:

[operatorname{Var}left[y_{l} ight]=n_{l} operatorname{Var}left[w_{l} x_{l} ight] ]

(w_l)的均值为0,即(E(w_l) = 0),则有:

[egin{align*} operatorname{Var}(y_l) & = n_{l}(E(W_l^2) cdot E(x_l^2) - E^2(w_l) cdot E^2(x_l)) \ &= n_{l}(E(W_l^2) cdot E(x_l^2) - 0 cdot E^2(x_l)) \ & = n_{l}(E(W_l^2) cdot E(x_l^2) - 0 cdot E(x_l^2)) \ & = n_{l}(E(W_l^2) cdot E(x_l^2) - E^2(w_l) cdot E(x_l^2)) \ & = n_{l}(E(W_l^2) - E^2(w_l)) cdot E(x_l^2) \ & = n_{l} operatorname{Var}(w_l) cdot E(x_l^2) end{align*} ]

这里有和Xavier一个很大的不同是,这里没有假设输入的值的均值为0。这是由于,使用ReLU的激活函数,(x_l = max(0,y_{l-1})),每层输出的值不可能均值为0。

上面最终得到

[operatorname{Var}(y_l) = n_{l} operatorname{Var}(w_l) cdot E(x_l^2) ]

初始化时通常设,(w)的均值为0,偏置(b = 0),以及(w)(x)是相互独立的,则有

[egin{align*} operatorname{E}(y_l) &= operatorname{E}(w_lx_l) \ &= operatorname{E}(x_l) cdot operatorname{E}(w_l) \ &= 0 end{align*} ]

也就是说,(y_l)的均值为0。

再假设(w)是关于0对称分布的(均匀分布,高斯分布都符合),则可以得到(y_l)在0附近也是对称分布的。

这样,使用ReLU作为激活函数,则有

[x_l = max(0,y_{l-1}) ]

由于只有当(y_{l-1} > 0)的部分,(x_l)才有值,且(y_l)在0附近也是对称分布的,则可以得到

[egin{align*} operatorname{E}(x_l^2) &=frac{1}{2} operatorname{E}(y_{l-1}^2) \ &= frac{1}{2}({E}(y_{l-1}^2) - E(y_{l-1})),(由于E(y_{l-1}) = 0)\ & = frac{1}{2}operatorname{Var}(y_{l-1}) end{align*} ]

将得到的(operatorname{E}(x_l^2) = frac{1}{2}operatorname{Var}(y_{l-1})),带入到 $operatorname{Var}(y_l) = n_{l} operatorname{Var}(w_l) cdot E(x_l^2) $ 则可以得到

[operatorname{Var}left[y_{l} ight]=frac{1}{2} n_{l} operatorname{Var}left[w_{l} ight] operatorname{Var}left[y_{l-1} ight] ]

将所有层的方差累加到一起有:

[operatorname{Var}left[y_{L} ight]=operatorname{Var}left[y_{1} ight]left(prod_{l=2}^{L} frac{1}{2} n_{l} operatorname{Var}left[w_{l} ight] ight) ]

为了是每一层的方差保持不变,则有:

[frac{1}{2} n_{l} operatorname{Var}left[w_{l} ight]=1, quad forall l ]

也即得到 权值矩阵的方差应该是

[sqrt{2 / n_{l}} ]

和Xavier的方法,也可以使用正态分布或者均匀分布来取得初始的权值矩阵的值。

正态分布

[W sim N(0.0,sqrt{2 / n_{l}}) ]

均匀分布

[W sim U[-sqrt{6 / n_{l}},sqrt{6 / n_{l}}] ]

总结及使用的概率公式

正确的初始化方法应该避免指数级地减小或放大输入值的大小,防止梯度“饱和”。 Glorot提出两个准则:

  • 各个层激活值的方差保持不变(正向传播)
  • 各个层的梯度值的方差保持不变(反向传播)

通常初始的权值矩阵的均值为0.

这这些条件的基础上,Glorot 使用(tanh)作为激活函数,并假设输入值的均值为0,提出了Xavier初始化的方法。

而Kaiming使用ReLU作为激活函数,就无法满足数值的均值为0的条件,因此使用Xavier来初始化ReLU作为激活函数的网络,效果也就不是那么理想。其提出了MSRA的初始化方法,来解决该问题。


推导时使用的概率公式:

[D(x)=Eleft(x^{2} ight)-E^{2}(x) ]
[D(x y)=Eleft(x^{2} y^{2} ight)-E^{2}(x y)=Eleft(x^{2} ight) Eleft(y^{2} ight)-E^{2}(x) E^{2}(y) ]

如果(E(y) = 0),则有:

[D(xy) = D(y)E(x^2) ]

如果(x,y)是相互独立的,则有

[E(xy) = E(x)E(y) ]

本文只推导了正向传播的过程,对于反向传播的推导可参考原始论文

免责声明:文章转载自《权值初始化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu16 编译源码安装MXNet 可变卷积Deformable-ConvNets GPU版CentOS 7 之几个新特性(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python——彩图变线稿

思路: 1、用灰度变化来模拟视觉的明暗程度; 2、把彩图转为灰度数组; 3、求出梯度数组,即灰度变化率数组; 4、预设灰度值10,范围0-100,衰减到10%,这将对灰度变化率按作衰减; 5、令z变化率为1,对x、y、z的作归一化处理; 6、定义一个光源,附视角接近90度,方位角45度; 7、令对角线长度为单位1,分别计算光源在x、y、z轴的投影值; 8、...

HTML5 Canvas 获取网页的像素值。

我之前在网上看过一个插件叫做出JScolor   颜色拾取器  说白了就是通过1*1PX的DOM设置颜色值通过JS来获取当前鼠标点击位置DOM的颜色值。 自从HTML5 画布出来之后。就有更好的方法来获取了,比方郭阿里巴巴ICON矢量库 用的SVG和渐变来进行绘制: 我昨天用Canvas来绘制了一下。由于Canvas有现成的方法getImageDat...

前端js图片上传

前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device...

Spring框架扩展点详解(BeanPostProcessor等)

在日常使用Spring框架的业务开发中,利用框架提供的扩展点完成某些功能的设计是很常见的,了解这些扩展点的原理也对理解框架非常有帮助。这里做一个简单的整理、总结。 1. BeanPostProcessor BeanPostProcessor 接口定义了基本的Bean初始化回调方法,可以实现对应的回调方法来在Spring容器完成Bean的实例化、初始化前后...

jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解

一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤。 二.类加载时机: 1.创建类的实例,也就是new一个对象 2.访问某个类或接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法 4.反射(Class.forName("com...

PHP stdClass类 使用

总结一下: stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法。stdClass类可以被继承,只是这样做没有什么意义。 这是zend_builtin_module的模块初始化函数,在PHP内核进行模块初始化操作时会自动加载这个函数, 这样,stdCla...