常用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
下面给出一个简单的例子,参考了
非常感谢这位无私答疑的国际友人。
梯度下降算法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