权重初始化
权重初始化指的是在神经网络开始训练之前预先设定值的过程,那么问题来了
为什么权重需要初始化呢?
如果权重不初始化,全部为0,那么每个神经节点的值均相同,因此在反向传播时,每个权重的梯度为输入该节点的输入x与上一层的梯度乘积,因此相等,则神经网络每个神经节点同等更新,不具有差异性
是否可以用高斯分布来初始化权重?
当然可以,
1)我们首先想到的是用小随机数来初始化权重,如0.01,这样,可以打破0初始值的对称性,但是,小初始值也存在一个问题,在神经网络层数少的情况下没有问题,但是层数一旦比较深,那么梯度传递到最初的几层时会趋近于0,因为w权重的梯度为输入x,与上一层的梯度乘积,不断将梯度乘以很小的数,会使其消失。
2)那么是可以换大随机数初始化呢?比如1,显然不行,之前在sigmoid和tanh激活函数时提到,如果权重过大,会造成梯度饱和的现象,这主要是由于在这两个函数中,值域趋于正负1时,梯度趋近于0
除此之外,简单的用0.01或者1这样的值来随机产生权重还存在这样的问题,即在数据规模不同的情况下,方差数据分布的方差也不同,数据量越大,方差越大,而神经网络本质上就是学习数据的分布情况。因此,在初始化时,我们应该使用1/sqrt(n)来校准,其中n为输入数据的规模。
还可以稀疏初始化
为了打破0初始化的对称性,又不想初始化所有权重,我们可以让每个神经元稀疏的初始化少量数目的权重,通常情况下,我们取10
偏置初始化
除了权重,还有偏置,偏置的通常情况下没有权重初始化那么重要,我们一般用0处理,也有人指出,我们应该用很小的数值初始化,以便于在激活函数为Relu时尽快被激活,但是实验中,这样做的结果并不总是理想的。
Relu的初始化方式
使用1/sqrt(n)来校准,对于tanh函数有效,但是对于Relu并不好,这主要是因为max函数令方差减半因此应该用sqrt(2/n)来校准。
batch normalization
对于以上繁琐的初始化过程,loffe和Szegedy提出了batch normalization的方法,该层是在全连接层和激活函数之间添加,我们可以这样考虑,我们都希望输入是零中心化和归一化数据,但是经过了每层之后,输入的分布会发生变化,这样将会对后续层的学习产生影响,如果在权重之后加入这样的层,使数据分布依旧为零中心化和归一化的,是不是对后续的学习会有帮助呢?但是单纯的将分布拉回来也存在着这样一个问题,前一层好不容易学习出来的分布,被强行拉回,对最后的结果到底有利还是有弊呢,因此这里,在归一化之后,尝试重构原来的分布,而重构的参数gamma和beta是学习得到的,当gamma为输入数据的标准差且beta为均值时,就恢复了之前的分布。所以从某种意义上,也是归一化分布与学习到分布的一种博弈选择。同样,该层也可以在图像处理领域,也可以用于卷积层之后。