优化算法
1. 相关概念
-
优化
改变x以最大化、最小化某个函数f(x)的任务
-
目标函数、准则、代价函数、损失函数、误差函数
最大化、最小化的函数
-
用*上标表示最大化最小化函数的x的值
\[x^{*}=argminf(x) \]
2. 梯度下降
2.1 直观理解
沿着函数的下坡方向(导数反方向),直到最小
2.2 相关概念
-
极大值点、极小值点、鞍点
-
局部最小值点、全局最小值点
最理想的情况是找到全局最小值点,但可能比较难,特别是在多维情况下,因此找到近似局部最小值点也是可以接受的
-
梯度
是一个向量,多维函数 f 对所有参数 xi 的偏导数构成的一个向量,记为\(\nabla_xf(x)\),梯度方向是函数值增加最快的方向,梯度方向反方向是函数值下降最快的方向,梯度下降算法参数更新的方向即为梯度方向的反方向
2.3 数学证明
梯度方向是函数值增大方向,梯度反方向是函数值下降方向,沿梯度反方向对参数迭代更新,以最小化损失函数
证明如下
式1,2,3,5
说明了要使得函数值减小需要满足的条件,式6
说明负梯度方向更新参数函数值下降最快
梯度下降算法描述如下
eps为接近0的正数,N为最大迭代次数,防止出现死循环
学习率\(\alpha\)要设置为接近于0的正数,原因如下,结合式3
进行理解
3. 梯度下降法的改进
改进方向主要有学习率衰减和梯度方向优化,对应的优化算法如下图所示
3.1 动量法
借用物理学动量得概念,直观理解是依靠惯性保持迭代时的前进方向,用历史梯度信息对当前梯度进行修正,消除病态条件问题上的来回震荡
参数更新公式为
对动量项展开得
考虑动量的优点
- 收敛更快
- 有机会逃脱局部最小值(因为动量可能推动它脱离局部极小值)
3.2 梯度截断
gradient clipping,是为了解决梯度爆炸问题,当梯度大于一定的阈值时,就将其截断,在训练原始RNN时采取了此方法,参考RNN - dctwan - 博客园 (cnblogs.com)
按值截断
按模截断
3.3 AdaGrad
Adaptive Gradient Descent,自适应学习率梯度下降,学习率在不断发生变化, 且对于每个参数的学习率是不同的。学习率衰减的思想是:训练刚开始时学习率大一些,以保持收敛速度,在收敛到最优点附近时,要小一些避免震荡
对稀疏特征的理解, 稀疏特征的平均梯度通常很小,所以这些特征的训练速度要慢得多。Adagrad 解决这个问题的思路是: 你已经更新的特征越多,你将来更新的就越少,这样就有机会让其它特征(例如稀疏特征)赶上来。更新这个特征的程度即在这个维度中移动了多少,这个概念由梯度平方的累积和表达
参数更新公式为
-
优点
更好地避开鞍点,Adagrad 将采取直线路径,而梯度下降(或相关的动量)采取的方法是“让我先滑下陡峭的斜坡,然后才可能担心较慢的方向”。
-
缺点
收敛非常慢,随着参数更新的进行,分母越来越大,逐渐趋向于0
3.4 RMSProp
Root Mean Square Propagation,通过添加衰减因子来解决AdaGrad收敛太慢(学习率趋向于0)的问题
为了看到衰减的效果,在这个对比中,AdaGrad (白色)最初与 RMSProp (绿色)差不多,正如调整学习率和衰减率的预期。 但是 AdaGrad 的梯度平方和累计得非常快,以至于它们很快变得非常巨大(从动画中方块的大小可以看出)。买路费负担沉重,最终 AdaGrad 几乎停止了。 另一方面,由于衰变率的原因,RMSProp 一直将方块保持在一个可控的大小。 这使得 RMSProp 比 AdaGrad 更快。
3.5 Adam
综合考虑了动量和自适应学习率
总结如下
4.二阶优化算法:牛顿法、拟牛顿法
5.约束优化
后续待学习
参考:
- 梯度下降的可视化解释(Momentum,AdaGrad,RMSProp,Adam)
- 《机器学习的数学》——雷明
- 花书