针对无约束最优化问题,梯度下降法是常用的最优化方法之一,其法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。
梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。
目标函数:
根据上式,我们更新第k+1次的值
梯度下降法的搜索迭代示意图如下图所示:
梯度下降法的缺点 - 靠近极小值时收敛速度减慢,如下图所示 - 直线搜索时可能会产生一些问题 - 可能会“之字形”地下降
从上图可以看出,梯度下降法在接近最优解的区域收敛速度明显变慢,利用梯度下降法求解需要很多次的迭代。 在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
比如对一个线性回归(Linear Logistics)模型,假设下面的h(x)是要拟合的函数,
批量梯度下降法(Batch Gradient Descent,BGD)
(1)每个
(2)从上面公式可以注意到,每迭代一步,就要用到m中所有数据,如果m很大,那么可想而知这种方法的迭代速度会相当的慢。所以,这就引入了另外一种方法——随机梯度下降。
随机梯度下降法
(1)每个
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况,那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
总结
批量梯度下降---最小化batch训练样本的损失函数,即求解的参数是使得风险函数最小,解较优,但是对于大规模样本问题效率低下。
随机梯度下降---最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
改进方法
在梯度下降的基础上, 增加了动量(Momentum)的技术,就是为了加快学习过程,特别是对于高曲率、小但一致的梯度,或者噪声比较大的梯度能够很好的加快学习过程。其主要思想是积累了之前梯度指数级衰减的移动平均(前面的指数加权平均),下面用一个图来对比下,SGD和动量的区别:
Nesterov Momentum是对Momentum的改进,区别在于计算更新梯度的时候,Momentum是点
而Nesterov Momentum是
具体算法差异:
输入:学习率,动量参数,初始参数值, 初始动量
输出:最终值参数
while stopping criterion not met:
Sample a batch of m examples,correspongding label
Apply interim update:
Compute gradient(at interm point):
Computer velocity update:
Apply update:
注意: Nesterov Momentum同Momentum相比多个"apply interim update:
通常,我们在每一次更新参数时,对于所有的参数使用相同的学习率。而AdaGrad算法的思想是:每一次更新参数时(一次迭代),不同的参数使用不同的学习率。AdaGrad 的公式为
其中
优点: 对于梯度较大的参数,相对较大,则较小。而相对于梯度较小的参数,则效果相反。这样就可以使得参数在平缓的地方下降的稍微快些,不至于在原位徘徊。
缺点: 由于是累加梯度的平方,到后面的值会比较大,导致梯度,导致梯度消失
为了克服Adagrad的缺点进行的改进 - 将累积梯度改为衰减梯度和,对历史梯度信息乘以衰减项
其也是为了解决Adagrad中梯度消失的问题,与Adadelta相比,仅仅采用了对
Adam实际上是把momentum和RMSprop结合起来的一种算法,分为一阶和二阶动量
具体更新算法:
whilenot converged:(first moment estimate)(second moment estimate)(更新参数)
return
总的来说,RMSprop是Adagrad的扩展形式,用于处理在Adagrad中急速递减的学习率。RMSprop与Adadelta相同,所不同的是Adadelta在更新规则中使用参数的均方根进行更新。
最后,Adam是将偏差校正和动量加入到RMSprop中。在这样的情况下,RMSprop、Adadelta和Adam是很相似的算法并且在相似的环境中性能都不错。Kingma等人[9]指出在优化后期由于梯度变得越来越稀疏,偏差校正能够帮助Adam微弱地胜过RMSprop。综合看来,Adam可能是最佳的选择
目标函数:
其中
要想取得上式子最小值,将其导数为0,即
牛顿法也可用于方程求解,具体讲函数一阶展开:
令其为0
该方法严格称为:Guass-Newton method(高斯牛顿法)
牛顿法的优缺点总结: - 优点:二阶收敛,收敛速度快; - 缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
DFP算法
先初始化一个正定对称矩阵,可以证明,迭代过程中每个矩阵都是正定的
利用公式更新
一维搜索:求使得
更新
计算,若,则停止计算,得到近似解;否则,继续更新迭代
BFGS算法
初始化正定对称矩阵, 可以证明,迭代过程中每个矩阵都是正定的
利用公式
一维搜索:求使得
更新
计算,若,则停止计算,得到近似解;否则,继续更新迭代
注意: 上面计算
通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。
虽然梯度下降法的每一步都是朝着局部最优的方向的,但它在不同的迭代轮数中会选择非常近似的方向,说明这个方向的误差并没通过一次更新方向和步长更新完,在这个方向上还存在误差,因此参数更新的轨迹是锯齿状。
共轭梯度法是共轭方向法的一种,它在最速下降法的基础上对它进行了改良,初始点的下降方向仍是负梯度方向,但后面的迭代方向不再是该点的负梯度方向了,后面的迭代方向是该点的负梯度方向和前一次迭代方向形成的凸锥中的一个方向,这样有效地避免了“锯齿”现象。
由于每次将一个方向优化到了极小,后面的优化过程将不再影响之前优化方向上的极小值,所以理论上对N维问题求极小只用对N个方向都求出极小就行了。
下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:
注:绿色为梯度下降法,红色代表共轭梯度法
算法过程
由上我们知道,共轭梯度同梯度下降一样,也是只利用一阶导数信息,只是后续迭代中 优化的方向和步长有所不同 典型的共轭梯度下降是为了解决为解二次规划和线性方程组问题设计的。即待优化问题定义为
其中x为待求解,A为半正定矩阵,b为已知变量。
第一次优化方向为初始梯度方向
每一次优化方向与之前的优化方向正交,采样Gram-Schmidt方法进行向量正交化,更新优化梯度方向:
对
其正则项目是绝对值,需要使用到subgradient,本质也是使用梯度下降法求解,但分区间操作:
令偏导数为0得到
其中,
可直接通过求导得到即:
看出第二部分和简单的线性回归类似。ridge回归可等价于首先以一个因子
Ref:
1. https://www.cnblogs.com/shixiangwan/p/7532830.html
2. https://blog.csdn.net/songbinxu/article/details/79677948
3. https://blog.csdn.net/weixin_37895339/article/details/84640137
4. https://blog.csdn.net/u012328159/article/details/80311892
5. https://ruder.io/optimizing-gradient-descent/index.html
6. https://blog.csdn.net/google19890102/article/details/69942970
7. https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-ridge-lasso-regression-python/
欢迎关注公众号: