梯度上升梯度下降中的backtracking line search及代码

常用backtracking line search方法更新梯度上升/下降中的步长。但是在这两种方法中,表达式是不同的

首先要明确:函数的梯度--最快上升方向。下降方向则是负梯度

看凸优化那本书的相关文字

 

注意这里写的是下降方向。因此可以用负梯度。

那么假设有一个函数f(x),我们记其在x这一点的梯度为g(x),那么其中一个下降方向就是-g(x),梯度下降需要的迭代准则就是

while.     f( x - t *g(x) ) > f(x) - a * t * g(x)^T * g(x)

    t = b* t

end

对于梯度上升算法,我们有

while.     f( x + t *g(x) ) < f(x) + a * t * g(x)^T * g(x)

    t = b* t

end

对于复函数,我们把g(x)^T 换成 g(x)^H

下面给出一个简单的例子,参考了

​​​​​​python - Implementing backtracking line search algorithm for unconstrained optimization problem - Stack Overflow

非常感谢这位无私答疑的国际友人。

梯度下降算法backtracking line search 代码,其中f(x)是目标函数,一个变量x1, x2的二元二次函数,f_gradx1和f_gradx2分别是关于x1和x2的偏导数,合起来就是梯度。

x=200*rand(1,2);

y = f(x);

err = 1.0;
alpha = 0.25;
beta = 0.8;
iter = 0;

%% Gradient
while err > 1e-8  
    iter =iter+ 1;

    % Gradient vector
    gradient1 = f_gradx1(x);
    gradient2 = f_gradx2(x);
    Grad=[gradient1,gradient2];

    % Step size
    step = 1;
    while f(x - step * Grad) > f(x) - alpha * step * Grad*Grad.'
        step = step*beta;
    end

    % Update
    step
    x = x - step * Grad;
    new_y = f(x)
    err =  abs(y-new_y)
    y = new_y
    
end

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值