一、优化的目标
- 优化的目标在于降低训练损失,只关注最小化目标函数上的表现
深度学习难以在大数据领域发挥很大作用的原因是,在巨大的数据基础上训练计算很慢,而优化算法是其中一种办法。
二、损失函数
- 优化的目标是降低损失,那么在深度学习优化,一般首先会预定义一个损失函数,有了损失函数,就开始不断优化算法,使用损失函数最小化。
三、深度学习中遇到的问题
- 前面已经确定了优化的目标,接下就开始优化算法的过程,优化算法首先得知道有哪些问题,解决这些问题,才有可能达到使损失最小化。
- 局部最优
定义:对于目标函数f(x),如果f(x)在x上的值比在x邻近的其他点的值更小,那么f(x)可能是一个局部最小值(local minimum),如果f(x)在x上的值是目标函数在整个定义域上的最小值,那么f(x)是全局最小值(global minimum)
从上图可知,目标函数在A点的梯度接近为0或直接为0,但是A只是局部最优,并非全局最优
- 鞍点
在梯度为0或直接为0的点是局部最优,但是还有一种发生的情况,A发生的可能性是处在鞍点附近
鞍点的定义:是函数上的导数为零,但不是轴上局部极值的点
- 局部最优,鞍点的判断
引入海森矩阵:海森矩阵最早于19世纪由德国数学家Ludwig Otto Hesse提出,并以其名字命名。利用黑塞矩阵可判定多元函数的极值问题
一个多元函数的二阶偏导数构成的方阵
判断:
- 当函数的海森矩阵在梯度为0的位置上特征值全为正式时,该函数得到局部最小值
- 当函数的海森矩阵在梯度为0的位置上特征值全为负时,该函数的到局部最大值
- 当函数的海森矩阵在梯度为0的位置上特征值有正有负的时候,该函数得到鞍点
例子说明:
f(x,y,z)=x2+y2+z2+2x+4y-6z
函数一阶偏导求得x,y,z的点(-1, -2, 3) 表示在三个变量方向上梯度都是为0的,但是这个点不知道是极小值或者极大值或者鞍点
对该函数继续求二阶偏导结果用海森矩阵表示为:
根据判断的条件可知(-1, -2, 3)是极小值点,极小值为=-14
- 梯度消失,梯度爆炸
- 激活函数的选择导致梯度下降问题,
以sigmoid为例:
sigmoid函数求导图像
由上sigmoidd导数可知,sigmoid函数的导数的最大值为0.25 ,通常我们会将权重初始值|W|初始化为为小于1的随机值,因此我们可以得到
随着层数的增多,那么求导结果
越小,这也就导致了梯度消失问题。
在计算梯度时,根据不同情况梯度函数也会以指数级递减,导致训练难度上升,梯度下降算法的步长会变得非常小,需要训练的时间将会非常长
那么如果我们设置初始权重 |W|较大,那么会有
造成梯度太大,也是造成梯度爆炸的原因
四、 鞍点,局部最优优化方法
- 动量梯度下降(Gradient Descent with Momentum)
动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值,使用动量梯度下降,通过累加历史的梯度值来减小抵达最小值路径的波动,加速了收敛,当前后梯度方向一致时,动量梯度能够加速学习,当前后梯度方向不一致时,动量梯度能够抑制震荡。
动量梯度下降法的整个过程为如下图所示,其中β通常设置为0.9:
梯度下降过程对比,如下图所示
- 逐参数适应学习率方法
- Adagrad
- AdaGrad算法会使用一个小批量随机梯度gt按元素平方的累加变量到st,从而从而影响学习率的大小
公式:
α是学习率,ϵ是为了维持数值稳定性而添加的常数,这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率
缺点:
由于st一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降得较快,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解
- RMSprop
RMSProp(Root Mean Square Prop)算法将这些梯度按元素平方做指数加权移动平均
AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。为了解决这一问题,RMSProp算法对AdaGrad算法做了一点小小的修改
公式:
最终自变量每个元素的学习率在迭代过程中就不再一直降低。RMSProp 有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 α,从而加快算法学习速度
- Adam
Adam 优化算法(Adaptive Moment Estimation,自适应矩估计)将 Momentum 和 RMSProp 算法结合在一起
公式:
五、梯度消失,梯度爆炸优化
-
选择合适的激活函数,如ReLU,Leaky ReLU
-
参数初始化策略, 初始化权重的较小的值,缓解梯度爆炸
-
输入的特征进行标准化
如果激活函数的输入X近似设置成均值为 0,标准方差为 1,神经元输出 z 的方差就正则化到1了,虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和爆炸的速度