梯度消亡
一、 梯度消亡
神经网络靠输入端的网络层的系数逐渐不再随着训练而变化,或者变化非常缓慢
随着网络层数增加,这个现象越发明显
梯度消亡的前提:
使用基于梯度的训练方法(如梯度下降法)
使用的激活函数具有输出值范围大大小于输入值范围,例如logistic(逻辑函数)、tanh(双曲正切)
二、 梯度消亡问题分析
梯度下降法是依靠理解系数的微小变化对输出的影响从而来学习网络系数的值
如果一个系数的微小变化对网络的输出没有影响或者影响极小,那么就无法知晓如何优化这个系数,或者优化特别慢,造成训练困难
梯度消亡的原因:
使用梯度下降法训练神经网络,如果激活函数具备将其输出值的范围相对于输入的值大幅度压缩,那么就会出现梯度消亡
例如,双曲正切函数(tanh)将负无穷到正无穷的输入,压缩到-1到1之间,除开在输入为-6,+6之间的值,其他的输入值对应的梯度非常小,接近于0.
从图上可以发现,当我们的值大于3时,梯度接近于1,这时,你输入5或者500或者5000,他们的梯度都不会有明显的变化,反之则一样
我们的神经网络也是如此,如果我们要对0.1进行方向传播求梯度,那么他的梯度会依赖下一层的信息,当我们使用双曲正切函数(tanh)作为激活函数时,因为tanh他的导函数如上面的红线,在输入大于2或者小于-2时,梯度变得非常非常小,然后再通过层层递进,会发现我们的反向求导的梯度会变得十分小,当网络过深时,就会出现梯度消亡现象
三、 梯度消亡解决方法
使用新的激活函数解决tanh出现的问题
在优化时,不像Sigmoid型函数的两端饱和(两端的梯度都接近0),ReLU函数为左饱和函数,且在x> 0 时导数为1,而且导数也好求,在一定程度上能解决梯度消失的问题,加速梯度下降的收敛速度
四、 梯度爆炸
当我们的梯度过小时,通过网络层的递进,会出现梯度消亡,反之,当我的梯度过大时,通过层层递进,会出现梯度越来越大,导致爆炸
解决办法
梯度剪切(Gradient Clipping):其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内
五、 过拟合
在训练数据集上的准确率很高,但是在测试集上的准确率比较低
过拟合的解决方法:
(1) DropOut
(2) L2正则化
(3) L1正则化
(4) MaxNorm
六、 DropOut
dropout是前向传播过程中遍历神经网络每一层的节点,然后通过对该层的神经网络设置一个keep_prob(节点保留概率),即该层的节点有keep_prob的概率被保留,keep_prob的取值范围在0到1之间。通过设置神经网络该层节点的保留概率,使得神经网络不会去偏向于某一个节点(因为该节点有可能被删除),从而使得每一个节点的权重不会过大,有点类似于L2正则化,来减轻神经网络的过拟合。
没加入DropOut的网络结构
加了DropOut的网络结构
Dropout一般只在网络的训练阶段使用,而测试阶段不使用Dropout,也就是说训练时前向传播只使用没有失活的那部分神经元,而测试时使用的是全部的神经元。
在使用DropOut训练时,因为有部分神经元被筛选掉了,所以我们计算出来参数的权值,需要乘以keep_prob(我们设置的保留率),从而在测试时使用的节点权值才是准确的
七、 正则化
在模型训练阶段,为了防止模型的过拟合,我们通常会加入正则来提升模型的泛化能力。其中L1和L2正则的使用最为广泛。这些正则项会促使模型的参数变小,从而让学出来的模型本身变简单,起到防止过拟合的效果。
L1和L2正则化的特点:
L1正则和L2正则都可以用来防止模型的过拟合,但L1相比L2正则,还具有另外一种特性,就是让模型的参数变稀疏。首先,试着理解一下什么叫稀疏。通俗来讲,假如模型有100100个参数,通过L1正则的引入最终学出来的参数里可能9090个以上都是00,这叫作稀疏性。相反,如果使用L2正则则没有这样的特点
(1) L1正则化:
我们已知L1的正则化的数学表达式,那么我的由此得出,他在几何上,是一个菱形,如图下所示
如上图所示,当我们的目标函数加入L1正则时,我们希望W学出来的值,既让f(w)变得更小,也让L1正则的值变得的更小,所以我们的W取值范围就是我们的目标函数与L1正则化的交集,与L1正则的交集,很大可能就是菱形的顶点,因为L1正则是一个很多顶点的菱形,所以他会导致某一些w值变成0,从而让参数便稀疏
L1缺点:
(1) L1正则并不是每个位置都有梯度的,所以对于计算上有一点的复杂,会做一定的处理。
(2) L1的稀疏性
他在选择特征时,是随机的选择一个特征,而不是选择一个最好的特征
(2) L2正则化
我们已知L1的正则化的数学表达式,那么我的由此得出,他在几何上,也是一个平滑的形状,如图下所示
L2正则化得到的w每个元素都比较小,接近0,更加平滑(不等于0)