常用的优化方法-梯度下降、牛顿法、坐标下降法

    最优化问题在机器学习中有非常重要的地位,很多机器学习算法最后都归结为求解最优化问题。在各种最优化算法中,梯度下降法是最简单、最常见的一种,在深度学习的训练中被广为使用。

    最优化问题是求解函数极值的问题,包括极大值和极小值。微积分为我们求函数的极值提供了一个统一的思路:找函数的导数等于0的点,因为在极值点处,导数必定为0。这样,只要函数的可导的,我们就可以用这个万能的方法解决问题,幸运的是,在实际应用中我们遇到的函数基本上都是可导的。

     在机器学习之类的实际应用中,我们一般将最优化问题统一表述为求解函数的极小值问题,即:

                                                                min_{x}f(x)
      其中x称为优化变量,f称为目标函数。有些时候会对优化变量x有约束,包括等式约束和不等式约束,它们定义了优化变量的可行域,即满足约束条件的点构成的集合。在这里我们先不考虑带约束条件的问题。

导数与梯度

      由于实际应用中一般都是多元函数,因此我们跳过一元函数,直接介绍多元函数的情况。梯度是导数对多元函数的推广,它是多元函数对各个自变量偏导数形成的向量。多元函数的梯度定义为:

                                                               

其中\bigtriangledown称为梯度算子,它作用于一个多元函数,得到一个向量。下面是计算函数梯度的一个例子:

                                          

       可导函数在某一点处取得极值的必要条件是梯度为0,梯度为0的点称为函数的驻点,这是疑似极值点。需要注意的是,梯度为0只是函数取极值的必要条件而不是充分条件,即梯度为0的点可能不是极值点。

       至于是极大值还是极小值,要看二阶导数/Hessian矩阵,Hessian矩阵我们将在后面的文章中介绍,这是由函数的二阶偏导数构成的矩阵。这分为下面几种情况:

如果Hessian矩阵正定,函数有极小值;如果Hessian矩阵负定,函数有极大值;如果Hessian矩阵不定,则需要进一步讨论

       这和一元函数的结果类似,Hessian矩阵可以看做是一元函数的二阶导数对多元函数的推广。一元函数的极值判别法为,假设在某点处导数等于0,则:

如果二阶导数大于0,函数有极小值;如果二阶导数小于0,函数有极大值;如果二阶导数等于0,情况不定

      直接求函数的导数/梯度,然后令导数/梯度为0,解方程,问题不就解决了吗?事实上没这么简单,因为这个方程可能很难解。对于有指数函数,对数函数,三角函数的方程,我们称为超越方程,求解的难度并不比求极值本身小。精确的求解不太可能,因此只能求近似解,这称为数值计算。工程上实现时通常采用的是迭代法,它从一个初始点x_{0}开始,反复使用某种规则从x_{k}移动到下一个点x_{k_{1}},构造这样一个数列,直到收敛到梯度为0的点处。这个过程就像我们处于山上的某一位置,要到山底找水喝,因此我们必须到达最低点处.此时我们没有全局信息,根本就不知道哪里是地势最低的点,只能想办法往山下走,走 一步看一步。刚开始我们在山上的某一点处,每一步,我们都往地势更低的点走,以期望能走到山底。

推导过程

      首先我们来看一元函数的泰勒展开,如果一个一元函数n阶可导,它的泰勒展开公式为:

                            f(x+\Delta x)=f(x)+f^{'}(x)\Delta x+\frac{1}{2}f^{''}(x)(\Delta x)^{2}+.. \frac{1}{n!} f^{(n)}(x)(\Delta x)^{n}...
      如果在某一点处导数值大于0(+),则函数在此处是增函数,加大x的值函数值会增加,减小x的值(-)函数会减小。相反的,如果在某一点处导数值小于0(-),则函数是减函数,增加x的值函数值会减小(+),减小x的值函数会增加。因此我们可以得出一个结论:如果x的变化很小,并且变化值与导数值反号,则函数值下降。对于一元函数,x的变化只有两个方向,要么朝左,要么朝右。

      下面我们把这一结论推广到多元函数的情况。多元函数f(x)在x点处的泰勒展开为:

                                         f(x+\Delta x)=f(x)+(\bigtriangledown f(x))^{T}\Delta x+o(\Delta x)
      这里我们忽略了二次及更高的项。其中,一次项是梯度向量\bigtriangledown f(x)与自变量增量 \Delta x内积 (\bigtriangledown f(x))^{T}\Delta x  ,这等价于一元函数的f^{'}(x)\Delta x。这样,函数的增量与自变量的增量、函数梯度的关系可以表示为:

                                           f(x+\Delta x)-f(x)=(\bigtriangledown f(x))^{T}\Delta x+o(\Delta x)
     只要梯度不为0,△x往梯度的反方向走函数值一定是下降的(异号相乘为负,即f(x+△x)<f(x)),在梯度相反的方向函数值下降的最快。此时有:

                                                         \Delta x=-\alpha \bigtriangledown f(x)

     从初始点x_{0}开始,使用如下迭代公式:

                                                       x_{k+1}=x_{k}-\alpha \bigtriangledown f(x_{k})

      只要没有到达梯度为0的点,则函数值会沿着序列x_{k}递减,最终会收敛到梯度为0的点,这就是梯度下降法。迭代终止的条件是函数的梯度值为0(实际实现时是接近于0),此时认为已经达到极值点。注意我们找到的是梯度为0的点,这不一定就是极值点,后面会说明。梯度下降法只需要计算函数在某些点处的梯度,实现简单,计算量小。

面临的问题

      在实现时,梯度下降法可能会遇到一些问题,典型的是局部极小值和鞍点问题。局部极小值:有些函数可能有多个局部极小值点,下面是一个例子:

                                            
      这张图中的函数有3个局部极值点,分别是A,B和C,但只有A才是全局极小值,梯度下降法可能迭代到B或者C点处就终止。

      鞍点 :指梯度为0,Hessian矩阵既不是正定也不是负定,即不定的点,鞍点处附近存在有正有负的的二阶导,即鞍点的hessian矩阵是不定的,在最优化问题中,只有hessian矩阵不定时才会出现鞍点(半正定也不会)!。下面是鞍点的一个例子,假设有函数:x^{2}-y^{2},显然在(0, 0)这点处不是极值点,但梯度为0,下面是梯度下降法的运行结果:

                                                  
     在这里,梯度下降法遇到了鞍点,认为已经找到了极值点,从而终止迭代过程,而这根本不是极值点。对于怎么逃离局部极小值点和鞍点,有一些解决方案,在这里我们暂时不细讲,以后有机会再专门写文章介绍。对于凸优化问题,不会遇到上面的局部极小值与鞍点问题,即梯度下降法一定能找到全局最优解。

     梯度下降法有大量的变种,它们都只利用之前迭代时的梯度信息来构造每次的更新值,最流行的:动量优化,Nesterov 加速梯度,AdaGrad,RMSProp, Adam 优化.详情参见:快速优化器

黑塞矩阵

     黑塞矩阵(Hessian Matrix,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。黑塞矩阵常用于牛顿法解决优化问题,利用黑塞矩阵可判定多元函数的极值问题。在工程实际问题的优化设计中,所列的目标函数往往很复杂,为了使问题简化,常常将目标函数在某点邻域展开成泰勒多项式来逼近原函数,此时函数在某点泰勒展开式的矩阵形式中会涉及到黑塞矩阵。        

    在数学中, 海森矩阵(Hessian matrix或Hessian)是一个自变量为向量x的实值函数f的二阶偏导数组成的方块矩阵, 此函数如下: ,如果f的所有二阶导数都存在, 那么f的海森矩阵: 

                                      (1)

 将二元函数的泰勒展开式推广到多元函数,则在X(0)点处的泰勒展开的矩阵形式为: 

                                        

                                

黑塞矩阵是由目标函数f在点X处的二阶偏导数组成的n∗n阶对称矩阵。

Hessian矩阵性质:

(1)如果是正定矩阵,则临界点处是一个局部极小值 
(2)如果是负定矩阵,则临界点处是一个局部极大值 
(3)如果是不定矩阵,则临界点处不是极值

判断一个矩阵是否是正定方法 : 

1、顺序主子式:实对称矩阵为正定矩阵的充要条件是的各顺序主子式都大于零。 
2、特征值:矩阵的特征值全大于零,矩阵为正定,矩阵的特征值全非负,矩阵为半正定。矩阵的特征值全小于零,矩阵为负定。否则是不定的。

from:https://blog.csdn.net/u010700066/article/details/81836166

二次规划的全局最优:https://blog.csdn.net/nickkissbaby_/article/details/89419423 

牛顿法

       除了前面说的梯度下降法,牛顿法也是机器学习中用的比较多的一种优化算法。 但对于非线性优化问题, 牛顿法提供了一种求解的办法. 假设任务是优化一个目标函数 f, 求函数 f的极大极小问题, 可以转化为求解函数 f的导数f′=0的问题, 这样求可以把优化问题看成方程求解问题(f′=0).  

    牛顿法的基本思想是利用迭代点处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点(f′=0的点),并不断重复这一过程,直至求得满足精度的近似极小值。它使用函数(x)的泰勒级数的前面几项来寻找方程(x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快,而且能高度逼近最优值。

1、基本牛顿法的原理

    考虑同样的一个无约束最优化问题:

                                                  min_{x\in R^{n}}f(x)     
       基本牛顿法是一种是用导数的算法,它每一步的迭代方向都是沿着当前点函数值下降的方向。我们主要集中讨论在一维的情形,对于一个需要求解的优化函数, 其中具有二阶连续偏导数的性质,求函数的极值的问题可以转化为求导函数。对函数进行泰勒展开到二阶,得到:

                               

牛顿法的每次迭代就是让一阶导为零,当且仅当 Δx无线趋近于0。即:

                                           

求解:

                                                 

得出迭代公式:

                                        

2、基本牛顿法的流程

  1. 给定终止误差值,初始点,令
  2. 计算,若,则停止,输出
  3. 计算,并求解线性方程组得解
  4. ,并转2。

       由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法的搜索路径(二维情况)牛顿法搜索动态示例图(这里我们可以把y看作优化函数的导数,我们要找y的零点,即优化函数的最小值):

                                    

关于牛顿法和梯度下降法的效率对比:

  从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

   从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

                                                  

注:红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。

牛顿法的优缺点总结:

  优点:二阶收敛,收敛速度快;

  缺点:牛顿法是迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算复杂。初始点要足够“靠近”极小点

Hessian矩阵:            

                                  

拟牛顿法(Quasi-Newton Methods)

  拟牛顿法是求解非线性优化问题最有效的方法之一,拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。

具体步骤:

    拟牛顿法的基本思想如下。首先构造目标函数在当前迭代x_{k}的二次模型: 
                                                               

                                                                             
    这里B_{k}是一个对称正定矩阵,于是我们取这个二次模型的最优解作为搜索方向,并且得到新的迭代点:

                                                                 x_{k+1}=x_{k}+a_{k}p_{k}
     其中我们要求步长a_{k}满足Wolfe条件。这样的迭代与牛顿法类似,区别就在于用近似的Hesse矩阵B_{k}  代替真实的Hesse矩阵(牛顿法:p_{k}=-H_{k}^{-1} \bigtriangledown f(x_{k}))。所以拟牛顿法最关键的地方就是每一步迭代中矩阵B_{k} 的更新。现在假设得到一个新的迭代x_{k+1},并得到一个新的二次模型:

                                               
 我们尽可能地利用上一步的信息来选取B_{k}。具体地,我们要求 

                                                               
从而得到
                                                        

这个公式被称为割线方程。常用的拟牛顿法有DFP算法和BFGS算法。

DFP方法

H_k=B_k^{-1},DFP公式为:

                   H_{k+1}=H_k-(H_ky_ky_k^TH_k)/(y_k^T H_k y_k)+(s_ks_k^T)/(y_k^Ts_k)

 DFP方法是秩-2更新的一种,由它产生的矩阵B_k是正定的,而且满足这样的极小性:min ||B-B_k|| s.t. B=B^T, Bs_k=y_k

from:http://www.cnblogs.com/shixiangwan/p/7532830.html

坐标下降法

     坐标上升与坐标下降可以看做是一对,坐标上升是用来求解max最优化问题,坐标下降用于求min最优化问题,但是两者的执行步骤类似,执行原理相同。

例如要求接一个min f(x_{1},x_{2},...x_{n})的问题,其中各个x_i是自变量,如果应用坐标下降法求解,其执行步骤就是:

1.首先给定一个初始点,如 X_0=(x_{1},x_{2},...x_{n})

2.for dim=1:n

固定x_i;(其中i是除dim以外的其他所有维度)

x_{dim}为自变量求取使得f取得最小值的x_{dim}

  end 

3.循环执行步骤2,直到f的值不再变化或变化很小。

其关键点就是每次只变换一个维度x_i,而其他维度都用当前值进行固定,如此循环迭代,最后得到最优解。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 最速下降是一种求解最优化问题的常用方法,其基本思想是在每一步中选择使目标函数下降最快的方向进行搜索。下面是使用MATLAB实现最速下降求解最优化问题的代码: function [x,fval] = steepest_descent(f,x,tol,maxiter) % f: 目标函数 % x: 初始点 % tol: 容差 % maxiter: 最大迭代次数 x = x; % 初始化 fval = f(x); % 计算初始点的目标函数值 iter = ; % 迭代次数 while iter < maxiter % 计算梯度 grad = gradient(f,x); % 计算步长 alpha = fminsearch(@(a) f(x-a*grad),); % 更新x x = x - alpha*grad; % 计算新的目标函数值 new_fval = f(x); % 判断是否满足容差要求 if abs(new_fval-fval) < tol break; end % 更新目标函数值和迭代次数 fval = new_fval; iter = iter + 1; end end 其中,gradient(f,x)是MATLAB内置函数,用于计算目标函数f在点x处的梯度。fminsearch(@(a) f(x-a*grad),)是MATLAB内置函数,用于求解一维函数的最小值,即在方向grad上的最优步长alpha。 ### 回答2: 最速下降是一种求解最优化问题的常用方法,可以用于解决各种数学模型中的优化问题。在matlab中,可以使用fminunc函数来实现最速下降求解最优化问题。下面我将详细介绍如何利用matlab代码实现最速下降求解最优化问题。 首先,我们需要定义一个目标函数,这个函数是我们要进行优化的主要目标。例如,我们可以定义一个简单的目标函数,如下所示: ``` function f = objfun(x) f = x(1)^2 + x(2)^2; end ``` 这个函数的输入参数为x,输出参数为f,函数体中的公式为f = x(1)^2 + x(2)^2,即求解x1的平方与x2的平方和的最小值。 接下来,我们需要确定初始点的位置,以便进行最速下降的迭代计算。这个初始点可以是任何值,通常是通过试验或者经验找到的。例如,我们可以定义一个初始点的坐标为(1, 1),如下所示: ``` x0 = [1, 1]; ``` 接着,我们需要调用fminunc函数来进行最速下降的计算,该函数的语为: ``` [x, fval] = fminunc(fun, x0) ``` 其中,fun为目标函数的句柄,x0为初始点的位置,x为最优点的位置,fval为目标函数在最优点处的取值。 将我们定义的目标函数和初始点输入fminunc函数,得到matlab代码如下: ``` x0 = [1, 1]; fun = @(x)objfun(x); options = optimoptions('fminunc','Display','iter','Algorithm','quasi-newton'); [x,fval,exitflag,output] = fminunc(fun,x0,options); ``` 其中,Display为输出选项,Algorithm为最优化选择。该代码中的最优化选择为拟牛顿法,也可以选择最速下降来实现最速下降求解最优化问题。 最后,我们可以将最速下降求解最优化问题的结果输出到控制台上,以便查看最优点的位置和目标函数在最优点处的取值。 以上就是关于如何使用matlab代码实现最速下降求解最优化问题的详细介绍。需要注意的是,最速下降求解最优化问题具有一定的局限性,对于某些复杂的问题可能求解不出最优解。因此,在实际操作中,需要根据具体问题的复杂程度选择合适的方法来解决。 ### 回答3: 最速下降是一种常见的求解最优化问题的方法,其基本思想是通过不断迭代找到每一步中相对于当前点下降最快的方向,并按照一定步长沿该方向移动,最终达到最优解点。 在使用matlab进行最速下降求解最优化问题时,可以采用以下步骤: 1. 定义目标函数和梯度函数 首先需要定义目标函数和梯度函数,以用于计算每次迭代的下降方向和步长。例如,若目标函数为$f(x,y)$,则可以在matlab中定义如下: function [f,g] = myfun(x) f = (1-x(1))^2 + 100*(x(2)-x(1)^2)^2; g = [-2*(1-x(1))-400*x(1)*(x(2)-x(1)^2); 200*(x(2)-x(1)^2)]; 其中,g为目标函数的梯度向量。 2. 初始化 通过给定初始点$x_0$,可以初始化最速下降迭代过程。例如,可以定义初始点为$(1,1)$: x0 = [1;1]; 3. 迭代过程 在每次迭代中,通过计算目标函数的梯度和每次迭代的下降方向,以及选择一定的步长,来寻找下一个点$x_k$。例如,可以使用以下代码实现: x = x0; for k = 1:100 [f,g] = myfun(x); p = -g; % 计算下降方向 alpha = linesearch(x,p,f,g); % 选择步长 x = x + alpha*p; % 移动到下一个点 end 其中,linesearch(x,p,f,g)为步长选择函数,可以根据不同的步长选择方法进行编写。 4. 输出结果 最后,在迭代结束后,输出最优解点和最优解值。例如,可使用如下代码: fprintf('The minimum point is [%f %f] with value %f.\n', x(1),x(2),f); 综上所述,通过以上步骤,可以利用matlab实现最速下降求解最优化问题。需要注意的是,在实际应用中,还需根据具体情况进行参数调优、收敛判断等处理,以保证算的准确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值