梯度下降法理解

      梯度下降法又叫最速下降法,英文名为steepest descend method.用来求解表达式最大或者最小值的,属于无约束优化问题。梯度下降法的一种简单形式是:x(k+1)=x(k)-a*g(k),其中a为学习效率,可以是较小的常数,g(k)是x(k)的梯度,直观的说,就是在一个有中心的等值线中,从初始值开始,每次沿着垂直等直线方向移动一个小的距离,最终收敛在中心。

      首先我们应该清楚,一个多元函数的梯度方向是该函数值增大最陡的方向。具体化到1元函数中时,梯度方向首先是沿着曲线的切线的,然后取切线向上增长的方向为梯度方向,2元或者多元函数中,梯度向量为函数值f对每个变量的导数,该向量的方向就是梯度的方向,当然向量的大小也就是梯度的大小。

      现在假设我们要求函数的最值,采用梯度下降法,如图所示:

梯度下降法理解_第1张图片

      梯度下降法的基本思想还是挺简单的,现假设我们要求函数f的最小值,首先得选取一个初始点后,然后下一个点的产生时是沿着梯度直线方向,这里是沿着梯度的反方向(因为求的是最小值,如果是求最大值的话则沿梯度的方向即可)。梯度下降法的迭代公式为:

      

      其中表示的是梯度的负方向, 表示的是在梯度方向上的搜索步长。梯度方向我们可以通过对函数求导得到,步长的确定比较麻烦,太大了的话可能会发散,太小收敛速度又太慢。一般确定步长的方法是由线性搜索算法来确定,即把下一个点的坐标ak+1看做是的函数,然后求满足f(ak+1)的最小值的 即可。步长的确定可以用Wolf-Powell搜索、Amijo搜索办法。

      因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0.而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。

     在matlab中实现梯度下降法例子:

   

梯度下降法函数function [k ender]=steepest(f,x,e),需要三个参数f、x和e,其中f为目标函数,x为初始点,e为终止误差。输出也为两个参数,k表示迭代的次数,ender表示找到的最低点。

steepest.m:

function [k ender]=steepest(f,x,e)
%梯度下降法,f为目标函数(两变量x1和x2),x为初始点,如[3;4]
syms x1 x2 m; %m为学习率
d=-[diff(f,x1);diff(f,x2)];  %分别求x1和x2的偏导数,即下降的方向
flag=1;  %循环标志
k=0; %迭代次数
while(flag)
  d_temp=subs(d,x1,x(1));	  %将起始点代入,求得当次下降x1梯度值
  d_temp=subs(d_temp,x2,x(2)); %将起始点代入,求得当次下降x2梯度值
  nor=norm(d_temp); %范  if(nor>=e)
    x_temp=x+m*d_temp;			%改变初始点x的值
    f_temp=subs(f,x1,x_temp(1));  %将改变后的x1和x2代入目标函数,subs函数:subs(S,OLD,NEW) 表示将符号表达式S中的符号变量OLD替换为新的值NEW
    f_temp=subs(f_temp,x2,x_temp(2));
    h=diff(f_temp,m);  %对m求导,找出最佳学习率
    m_temp=solve(h);   %求方程,得到当次m,solve函数:求解线性方程组解析解或精确解
    x=x+m_temp*d_temp; %更新起始点x
    k=k+1;
  else
    flag=0;
  end
end
ender=double(x);  %终点
end

调用示例1:

syms x1 x2;
f=(x1-2)^2+2*(x2-1)^2;
x=[1;3];
e=10^(-20);
[k ender]=steepest(f,x,e)

结果:

k =

  27


ender =

   2
   1

你可能感兴趣的:(算法)