梯度消失与爆炸
本质原因:梯度反向传播时,由于连乘造成的现象。网络训练的时候,采用的反向传播方式,该方式背后其实是链式求导,计算每层梯度的时候会涉及一些连乘操作,因此如果网络过深,那么如果连乘的因子大部分小于1,最后乘积可能趋于0;另一方面,如果连乘的因子大部分大于1,最后乘积可能趋于无穷。这就是所谓梯度消失与梯度爆炸。
具体原因:
1、使用sigmoid激励函数,sigmoid激励函数容易发生梯度消失现象,是由于他的导数最大为1/4。
2、学习率过大或过小。
3、初始权重过大或过小
防止梯度爆炸:
设置梯度剪切阈值
防止梯度消失:
1、使用ReLU、maxout替代sigmoid
2、batch normalization(加在relu前面)
3、使用LSTM能避免RNN的梯度消失
4、使用残差网络
ReLU
ReLU的优点:
1、防止梯度消失,sigmoid在两端会饱和,梯度消失
2、线性运作,计算量小,收敛速度快,sigmoid等计算复杂,指数运算
3、有利于特征稀疏化,de-active部分为0,减少了参数的相互依存关系,缓解了过拟合问题的发生。
ReLU的缺点:
随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。ReLU还经常被“诟病”的一个问题是输出具有偏移现象,即输出均值恒
大于零。偏移现象和 神经元死亡会共同影响网络的收敛性。
ReLU dying问题(也被称为“神经元死亡”):
1、使用Leaky ReLU或Randomized Leaky ReLU,即f(x)=max(0,x)+a×min(0,x),a是由经验设定的小的非0常数,或随机的。
2、何凯明提出ParametricReLU,即f(x)=max(0,x)+a×min(0,x),a是可训练的参数,效果比1好
3、使用maxout,f(x)= max(wT1x+b1,wT2x+b2),ReLU 和 Leaky ReLU 都是它的一个变形,Maxout 具有 ReLU 的优点(如:线性运作计算简单,不会 saturation),同时又没有 ReLU 的一些缺点 (如:ReLU dying),但是有把参数double的缺点。
Batch normalization
关于Mini-batch:
减少了单次计算量,便于工程实现,单次epoch的迭代次数增加,且批次之间的梯度竞争有利于跳出局部最优解。但这种竞争消耗着效率,对于深层次模型来说,越底层,竞争越容易变成恶性竞争,乱了大局。
关于Batch normalization:
批规范化,使得输出具有均值为0,方差为1的分布。是一种全局调整,对每个批进行线性变换,使梯度具有可比性,弱化恶性竞争。
优点:
1、可以选择比较大的初始学习率。
2、可以不用去理会过拟合中drop out、L2正则项参数的选择问题。采用BN算法后,可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
3、再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;
4、可以把训练数据彻底打乱
TensorFlow使用:http://www.jianshu.com/p/0312e04e4e83?from=timeline