最速下降法杂记

本文参考书籍最优化方法,部分参考漫步最优化三十二——最速下降法

最速下降法作为求解无约束最优化问题的入门算法,其思想是很多其他优化算法的基础。之前我一直对梯度下降法和最速下降法之间的关系和差异理解不清楚,只知道他们都是一阶方法,都沿负梯度方向迭代降低目标函数值,查了很多资料和网上的教程,发现讲得较为繁琐。经过系统学习和思考后我认为,最速下降法是梯度下降法的一种,该算法与一般梯度下降的区别在于,每次迭代过程中都要求目标函数值下降到搜索方向下的最小值

最速下降法算法步骤

  1. 给定目标函数: m i n f ( x ) minf(\boldsymbol x) minf(x),给定算法终止条件,通常是给定某误差 ε > 0 \varepsilon > 0 ε>0
  2. 取初始点 x 0 \boldsymbol x_{0} x0,令 k = k= k= 0。
  3. 计算 g k = g ( x k ) = ▽ f ( x k ) \boldsymbol g_{k} = \boldsymbol g(\boldsymbol x_{k}) =\bigtriangledown f(\boldsymbol x_{k}) gk=g(xk)=f(xk)
  4. ∥ g k ∥ ≤ ε \left\|\boldsymbol g_{k}\right\| \leq \varepsilon gkε,则 x ∗ = x k \boldsymbol x^*=\boldsymbol x_{k} x=xk,算法终止;否则,令搜索方向 p k = − g k \boldsymbol p_{k}=-\boldsymbol g_{k} pk=gk,由一维精确搜索或近似搜索求步长 a k a_{k} ak,使得:
    f ( x k + a k p k ) = m i n f ( x k + a p k ) f(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})=minf(\boldsymbol x_{k}+a\boldsymbol p_{k}) f(xk+akpk)=minf(xk+apk)
    其中要求 a > 0 a>0 a>0
  5. x k + 1 = x k + a k p k \boldsymbol x_{k+1}=\boldsymbol x_{k}+a_{k}\boldsymbol p_{k} xk+1=xk+akpk k = k + 1 k=k+1 k=k+1,转第2步。

为何最速下降法相邻两次迭代的搜索方向是正交的
这个结论每一个讲最速下降法的书和教程都会告诉你,多数没有给出严格证明(可能觉得太简单了…)。我的理解是这样:
首先从数学直观的角度,根据最速下降法的算法原理,第 k k k次迭代中,步长 a k a_{k} ak使得目标函数值在当前搜索方向上达到了最小值,如果第 k k k次迭代中的搜索方向 p k \boldsymbol p_{k} pk与第 k + 1 k+1 k+1次迭代的搜索方向 p k + 1 \boldsymbol p_{k+1} pk+1不正交的话,会发生什么呢?那样 p k + 1 \boldsymbol p_{k+1} pk+1 p k \boldsymbol p_{k} pk方向上有分量,则在 x k + 1 \boldsymbol x_{k+1} xk+1的邻域中,存在点使得目标函数值还能沿 p k \boldsymbol p_{k} pk方向继续下降,这与步长 a k a_{k} ak使得目标函数值在当前搜索方向上达到了最小值矛盾,因此两次迭代的搜索方向理应正交,没毛病。但如何证明呢?严格证明应该是这样的:
首先看一维搜索: f ( x k + a k p k ) = m i n f ( x k + a p k ) f(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})=minf(\boldsymbol x_{k}+a\boldsymbol p_{k}) f(xk+akpk)=minf(xk+apk),我们不妨假设已经找到了这个步长 a k a_{k} ak,使得 f ( x k + a p k ) f(\boldsymbol x_{k}+a\boldsymbol p_{k}) f(xk+apk)最小(这里把 x k \boldsymbol x_{k} xk p k \boldsymbol p_{k} pk视为常向量),那么由局部极小值点一阶必要条件可知,一定有:
d f ( x k + a k p k ) d a k = 0 \frac{df(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})}{da_{k}}=0 dakdf(xk+akpk)=0
因此由复合函数求导法则计算可知:
d f ( x k + a k p k ) d a k = d f ( x k + a k p k ) d ( x k + a k p k ) d ( x k + a k p k ) d a k = g ( x k + a k p k ) p k = g ( x k + 1 ) p k = ( − p k + 1 ) . p k = 0 \begin{aligned} &\frac{df(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})}{da_{k}}&\\=&\frac{df(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})}{d(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})}\frac{d(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})}{da_{k}}\\=& \boldsymbol g(\boldsymbol x_{k}+a_{k}\boldsymbol p_{k})\boldsymbol p_{k}\\=&\boldsymbol g(\boldsymbol x_{k+1})\boldsymbol p_{k}\\=&(-\boldsymbol p_{k+1}).\boldsymbol p_{k}\\=&0 \end{aligned} =====dakdf(xk+akpk)d(xk+akpk)df(xk+akpk)dakd(xk+akpk)g(xk+akpk)pkg(xk+1)pk(pk+1).pk0故最速下降法相邻两次搜索方向正交。
所以最速下降法的搜索方向是“迂回下降”的,随着梯度值的降低,收敛速度越来越慢,当目标函数值特别接近局部最优解时,搜索可能会每次动一点点,然后不断的迂回。。。想象那种近在眼前远在天边的感觉QAQ。

对机器学习和深度学习中学习率以及算法收敛速度的一些理解
不难看出,最速下降法关键的步骤就是一维搜索求解步长 a k a_{k} ak,也就是机器学习中所称的学习率,其余步骤同机器学习中的梯度下降系列算法一致。这也使我对机器学习和深度学习中,常用的随机梯度下降(SGD),小批量梯度下降(BGD)等算法中学习率(步长)为何是一个超参(Hyperparameter),需要实验调整来确定有一定的猜想:大概是因为对于神经网络计算而言,损失函数极其复杂,很难使用一维搜索求解出这个最合适的学习率(其实这个学习率也不一定是最合适的,后面会讲)。给定(凭经验,炼丹。。。)一个很小的学习率,尽管它在这一次迭代中并不一定使得目标函数值下降最快,但总归是下降的,方便实用。另一方面,梯度下降是盲目的,某次迭代中,搜索方向仅仅考虑了起始点的梯度,这个梯度却不一定是起始点和终点之间其他点的梯度方向,因此从整体上考虑负梯度方向不一定是下降最快的方向,那么基于这个搜索方向确定的最优步长也未必使得算法整体收敛得最快。从这个角度来看,“最速下降法”还真是名不副实。
所以总的来说,想算法收敛速度快,最速下降法不是一个‘“最速”的方法,由一维精确搜索确定的步长也不见得能从整体上最使目标函数降得最快。想要得到收敛速度更快的方法,一般问题而言,就要考虑二阶方法(Newtown法及其衍生算法等),当然对于神经网络而言,计算Hessian矩阵的代价不敢想象。。。因此才使用了对一般梯度下降算法(一阶方法)的改进,如动量法(Momentum),Adam算法等。

你可能感兴趣的:(机器学习和深度学习)