深度神经网络训练的时候,采用的是反向传播方式,该方式使用链式求导,计算每层梯度的时候会涉及一些连乘操做,所以若是网络过深。
那么若是连乘的因子大部分小于1,最后乘积的结果可能趋于0,也就是梯度消失,后面的网络层的参数不发生变化.
那么若是连乘的因子大部分大于1,最后乘积可能趋于无穷,这就是梯度爆炸html
sigmoid容易发生,更换激活函数为 ReLU便可。
权重初始化用高斯初始化网络
1 设置梯度剪切阈值,若是超过了该阈值,直接将梯度置为该值。dom
2 使用ReLU,maxout等替代sigmoid
区别:机器学习
sigmoid导数最大为1/4
a的数值变化范围很小,若x数值仅在[-4,4]窄范围内会出现梯度消失,若大于4则梯度爆炸。
对于sigmoid更容易出现梯度消失。函数
解决了梯度消失与加速收敛(数据自己在0均值处)和internal covariate shift(内部神经元分布的改变) 数据分布不一致问题。
传统的深度神经网络在训练是,每一层的输入的分布都在改变,所以训练困难,只能选择用一个很小的学习速率,可是每一层用了BN后,能够有效的解决这个问题,学习速率能够增大不少倍.学习
初始化的时候,咱们的参数通常都是0均值的,所以开始的拟合y=Wx+b,基本过原点附近,如图b红色虚线。所以,网络须要通过屡次学习才能逐步达到如紫色实线的拟合,即收敛的比较慢。若是咱们对输入数据先做减均值操做,如图c,显然能够加快学习。更进一步的,咱们对数据再进行去相关操做,使得数据更加容易区分,这样又会加快训练,如图d。 经过把梯度映射到一个值大但次优的变化位置来阻止梯度太小变化。
spa
使用BN训练时,一个样本只与minibatch中其余样本有相互关系;对于同一个训练样本,网络的输出会发生变化。这些效果有助于提高网络泛化能力,像dropout同样防止网络过拟合,同时BN的使用,能够减小或者去掉dropout相似的策略。.net
BN(Batch Normalization)层的做用orm
PS:
Batch Norm会忽略图像像素(或者特征)之间的绝对差别(由于均值归零,方差归一),而只考虑相对差别,因此在不须要绝对差别的任务中(好比分类),有锦上添花的效果。而对于图像超分辨率这种须要利用绝对差别的任务,Batch Norm只会添乱。htm