最优化方法
优化方法是深度学习中一个比较重要的话题,其实他的知识来自于最优化理论,如果想详细关注这个话题建议读一下最优化理论这本书,注意本书仅供参考,请误商业使用。本文将介绍常用的最优化方法,梯度下降法,牛顿法,拟牛顿法和共轭梯度法。
梯度下降法
梯度下降法是我们接触最多的方法,在目标函数是凸函数的时候能得到全局最优解。
对于一个函数f(x),它的梯度f′(x)是f(x)的梯度,对于足够小的α,会存在如下表达式。
f(x−αsign(f′(x)))<f(x)(1.1)
所以按照梯度的方向移动是可以找到f(x)的最小值的,并且也是找到最小值最快的方向,短短几句话就描述了梯度下降法的梗概。其实梯度下降法,越是下降到极值的部分,我们希望α越小,前进越慢,否则就越过最优点啦。
批量梯度下降
而所谓的批量梯度下降呢,就是用全部数据进行这样的梯度下降,这样无疑是能找到全局最优解的,但是考虑计算资源的情况下就很难找到场景使用啦。
随机梯度下降
顾名思义就是从原始数据中随机抽取一部分数据,进行梯度的计算,但是这样就会带来一个问题,就是往往这种梯度下降法计算结果相对不稳定,容易震荡,不过整体上还是往最优解拟合的。算是一个折中的办法。
动量法
为了解决梯度下降时快时慢的问题,我们在介绍一种动量法,为了表示动量这一概念,我们引入一个变量V,V是之前梯度的累加然后加上一定的衰减。
Vn+1=rVn+α∇J(θ)(1.2)
θn+1=θ−Vn+1(1.3)
其中Vn表示之前所有的步骤所累积的动量和。
牛顿法,拟牛顿法和共轭梯度法
我们可以看出,梯度下降是基于一阶导数来进行优化的,而牛顿法是基于二阶导数优化的,通常收敛速度更快。该算法通过一阶二阶导数信息来推测整个函数的形状,进而快速求的全局最小值。
不过牛顿法在迭代过程中总是要求目标函数的HESSIAN矩阵,计算比较复杂,当HESSIAN矩阵不可逆的时候就存在盲点,而且即使能够计算复杂度也是n2,计算量太大。
拟牛顿法通过正定矩阵来近似一个HESSIAN矩阵,不需要二阶导数,简化了计算的复杂度。
共轭梯度法是通过迭代下降共轭方向来避免计算HESSIAN矩阵求逆的计算,速度上介于牛顿法和拟牛顿法之间。
Adagrad算法
上面提到的算法都有一个共同的点不知道大家有没有发现,共同点就是都谁用了学习率这一个概念,但是学习率又是事先指定的超参数,对于所有的参数都适用,但是有些数据因为数据量小,可能某一个学习率是不能满足它的变化的,而Adagrad算法就是针对这个问题提出来的。
nt=nt−1+gt2(1.4)
θ=−nt+ϵη(1.5)
其中gt是当前梯度,η是当前学习率,ϵ表示一个比较小的数字,用来保证分母非零,该算法的含义是每个参数随着更新的总距离增多,而减小学习率。
前期gt较小的时候,正则项较大,能够放大梯度,后期gt变大的时候,正则项较小,能够约束梯度,适合处理稀疏梯度。
Adagrad算法存在的问题是:
- 其学习率单调递减,训练后期学习率很小
- 需要手工设置一个全局的学习率。
但是Adagrad算法同样需要设计一个全局的学习率η,如果过大会让正则项比较敏感。如果解决这个问题需要使用Adadelta。
Adadelta算法
Adadelta算法就是为了解决Adagrad算法以上几个问题,同样学习率是自适应的,Adagrad算法是累加所有梯度的平方,而Adadelta算法是累加固定的大小项,并且存储这些计算的平均值。
nt=v∗nt−1+(1+v)∗gt2(1.6)
θ=nt+ϵη∗gt(1.7)
Adadelta算法不依赖全局的学习率,训练的初中期加速效果理想,但是训练后期容易反复在局部最小值附近波动。