基本思想算法描述应用于正定二次函数锯齿现象
梯度下降法在机器学习中是经常用到的一种方法,很多人也把梯度下降法看作是最速下降法,但是这两种方法好像还有一些细微差别,wikipedia中Gradient descent的描述中有这么一句:Gradient descent is also known as steepest descent. However, gradient descent should not be confused with the method of steepest descent for approximating integrals.由于我也没有弄明白梯度下降和最速下降的区别,所以本文中将会用最速下降来统一说明。
在讲解梯度下降算法之前,先讲一下梯度下降的解决的问题是什么。梯度下降解决的是无约束最优化问题,与之相对应的是约束最优化问题。无约束最优化问题的一般形式为:
minf(x)其中f:Rn→R1。这一问题是指在Rn中寻找一点x∗,使得对于∀x∈Rn,都与f(x∗)≤f(x)点x∗就是全局最优解。
梯度下降法是多元函数求极值最早的方法。梯度下降法简单直观,但是收敛速度慢。之所以收敛速度慢是由于梯度下降会出现锯齿现象,将会慢慢讲解。
基本思想
最速下降法通过迭代的方式求函数f(x)的最优解。给定一个初始点,通过迭代找到下一个点,我们希望找到的下一个点能比上一个点有更优的函数值。那么最速下降法最重要的一点就是应该如何迭代,这用到了上一篇博客中的一个小知识:给定点xk,点xk处的负梯度方向为最速下降方向,至少在点xk的临近范围内是这样的。所以我们可以在点xk处选择搜索方向
pk=−∇f(xk)。在选定了搜索方向之后我们就可以沿着搜索方向进行搜索,然后选择点xk+1,其中xk+1=xk−tk∇f(xk),其中tk为沿负梯度方向的搜索距离,我们称为步长因子。我们把上式成为最速下降迭代公式,可以简记为xk+1=1s(xk,−∇f(xk)),由该公式产生的算法称为最速下降法。
在知道迭代公式之后,我们希望得到步长因子tk能够满足f(xk−tk∇f(xk))=minf(xk−t∇f(xk)) ,即我们希望xk+1为搜索方向上函数值“最小”的点。
对于任意给定的函数f(x),最速下降法不一定能找到函数的全局最优点(全局极小点),可能会找找到函数的局部极小点。
算法描述
为了书写简单,记gk=g(xk)=∇f(xk)。
最速下降法
已知:目标函数f(x)以及梯度g(x),H终止准则所需要的终止限ϵ1,ϵ2,ϵ3
1:选择初始点x0;计算f0=f(x0),g0=g(x0);置k=0;
2:作直线搜索xk+1=1s(xk,−gk);计算fk+1=f(xk+1),gk+1=g(xk+1);
3:判断H终止准则是否满足:若满足,则输出xk+1,fk+1否则,置k=k+1,转2。
关于直线搜索和H终止准则我将会在在下一篇博客中做补充说明。直线搜索是为了求解一元函数极小化问题而的迭代方法(在算法描述中使用直线搜索来找最优的tk,从而通过公式xk+1=xk−tk∇f(xk)找到下一个迭代点xk+1,需要知道的是在这里求解tk时,并一定使用迭代法,在一元函数可微或者可导的情况下,也可以直接通过导数方法进行求解),在这里是为了求得每一步的步长因子tk;H终止准则是一种终止条件,常见的终止条件如函数值的变化范围小于阈值ϵ时终止。
应用于正定二次函数
在介绍了最速下降法的基本逻辑之后,我们可以知道最速下降法关键步骤是求解每一步的步长因子tk,而对于正定二次函数
f(x)=12xTQx+bTx+c是可以推出显示迭代公式的。推导过程如下。
设第k个迭代点为
由于最速下降法的连续的两次的搜索方向是垂直的(将在锯齿现象中进行详细讲解),即gTk+1gk=0。便可以得到[Q(xk−tkgk)]Tgk=0,可以推出[gk−tkQgk]Tgk=0,可解得tk=gTkgkgTkQgk,可以得到xk+1=xk−gTkgkgTkQgkgk。上式便是最速下降法应用于正定二次函数时的显示迭代公式。
锯齿现象
在最速下降法中,迭代点向极小点靠近的过程中,走的是曲折的路线:后一次的搜索方向pk+1与前一次的搜索方向pk总是互相垂直的,称之为锯齿现象。如下图所示(在下图中一个圈表示等值线)。
在远离极小点的地方,最速下降法每次有较多的下降;但是在接近极小点的地方,由于锯齿现象的存在,使得每次迭代行进的距离缩短,收敛速度降低。
造成锯齿现象的关键原因是pk+1pk=0(或是gk+1gk=0),下面来解释一下具体原因。造成这种结果的具体原因是在点xk沿pk方向搜索的过程中,我们找到了该方向上的极小点,即xk+1,也就是是说在xk+1处pk方向为该点的切线方向(如果不是切线方向,那么该点就不是极小点,还能找到更小的值),而在xk+1处的搜索方向为负梯度方向,故pk+1pk=0。