神经网络参数初始化(MSRA、Xavier)

时间:2024-05-22 20:09:09

转载文章:神经网路权重初始化(讲的比较详细)

再推荐一篇感觉原理讲的很好的文章:https://blog.****.net/u014696921/article/details/53819512


网络权重初始化相关

理想的网络参数初始化使模型训练事半功倍,相反,糟糕的初始化方案不仅会影响网络收敛,甚至会导致梯度弥散或爆炸。参数初始化的理想状态是参数正负各半,期望为0。

 

1、过大或者过小的初始化

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

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

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

 

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

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

当网络达到稳定状态时, 参数(权值)在理想情况下应该保持正负各半(此时期望为0)。因此一种看起来简单的方法,干脆将所有参数都初始化为0, 因为这样可以使得初始化全零时参数的期望与网络稳定时参数期望一致。

但是,参数全是零时网络不同神经元的输出必然相同,相同的输出必然导致梯度更新完全一样,这样会令更新后的参数仍然保持一样的状态。换句话说,如果参数进行了全零的参数化,那么网络神经元将无法训练模型。例如,对于y=WX+by=WX+b,由于参数W需要和X乘积,因此不能初始化为0,而b可以。

 

 

首先介绍一下Xavier等初始化方法比直接用高斯分布进行初始化W的优势所在: 一般的神经网络在前向传播时神经元输出值的方差会不断增大,而使用Xavier等方法理论上可以保证每层神经元输入输出方差一致。

为什么要保证输入和输出的方差一致:如果不一致,则会造成方差越来越大,或是越来越小

 

3、Xavier

初始化方法由Bengio等人在2010年的论文《Understanding the difficulty of training deep feedforward neural networks》中提出。

它为了保证前向传播和反向传播时每一层的方差一致:在正向传播时,每层的**值的方差保持不变;在反向传播时,每层的梯度值的方差保持不变。根据每层的输入个数和输出个数来决定参数随机初始化的分布范围,是一个通过该层的输入和输出参数个数得到的分布范围内的均匀分布。

 

Xavier的有它自身的限制

对于权值的初始化,该方法提出两个准则:各个层**值的方差保持不变(正向传播);各个层的梯度值的方差保持不变(反向传播),这也是这个初始化函数要做的事。在Xavier的推导的过程中,做了以下假设:权值矩阵w是独立同分布的,且其均值为0;每一层的输入a是独立同分布的,且均值也为0;w和a是相互独立的。除了以上,对Xavier限制最大的则是,其是基于tanh作为**函数的。Xavier的初始化有个假设条件,**函数关于0对称,且主要针对于全连接神经网络。适用于tanh和softsign

Xavier可以使用正态分布或者均匀分布来取得初始的权值矩阵的值

 

 

4、MSRA

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

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

Xavier与MSRA的效果对比:

神经网络参数初始化(MSRA、Xavier)

特别当网络增加到33层之后,对比效果更加明显

神经网络参数初始化(MSRA、Xavier)

总结:

正确的初始化方法应该避免指数级地减小或放大输入值的大小,防止梯度“饱和”。 Glorot提出两个准则:各个层**值的方差保持不变(正向传播);各个层的梯度值的方差保持不变(反向传播)

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

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

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

 

pytorch中的网络权重初始化函数总结:

https://blog.****.net/qq_37705280/article/details/105772967