梯度下降算法
梯度下降算法的基本思想简介:
梯度下降算法(欧式范数的最速下降法)。梯度下降法的基本思想可以类比为一个下山的过程。
假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了。
梯度下降算法思想的具体步骤:
- 选定初始点 x 1 x^1 x1和给定精度 ϵ > 0 \epsilon>0 ϵ>0,令 k = 1 k=1 k=1
- 若 ∥ ∇ f ( x k ) ∥ < ϵ \parallel\nabla f(x^k)\parallel<\epsilon ∥∇f(xk)∥<ϵ,停止梯度下降算法, x ∗ = x k x^*=x^k x∗=xk,否则 d k = − ∇ f ( x k ) d^k=-\nabla f(x^k) dk=−∇f(xk)
- 在 x k x^k xk处沿 d k d^k dk方向作线性搜索, x k + 1 = x k + α d k x^{k+1}=x^k+\alpha d^k xk+1=xk+αdk,k=k+1,转步骤2.
例题:用最速下降法求解无约束问题
m
i
n
{
f
(
x
)
=
x
1
2
2
+
x
2
2
}
min\lbrace f(x)=\cfrac{x_1^2}{2}+x_2^2\rbrace
min{f(x)=2x12+x22}
求解matlab代码附上:
本代码精度设置为
1
0
−
5
10^{-5}
10−5
clc,clear
%%设定初始值
jingdu=1e-5%精度要求
x=[2 1];%初始点
%%梯度
fun_diff=[x(1),2*x(2)];
%%目标函数
fun=fun_ob(x)
%%梯度下降主循环
syms a%步长
while ((fun_diff(1)^2+fun_diff(2)^2)^0.5) > jingdu
%%梯度
fun_diff=[x(1),2*x(2)];
d=fun_diff*-1;
%一元线性搜索函数
k=fun_ob(x+a*d);
a_num=solve(diff(k));%求步长
x=x+a_num*d;
end
x,fun_ob(x)
function [a]=fun_ob(x)
a=(x(1)^2)/2+x(2)^2;
end
其函数图像如下:
并附上动态观察代码:
clc,clear
x1=-10:0.01:10
x2=-10:0.01:10
[x1,x2]=meshgrid(x1,x2)
x3=(x1.^2)/2+x2.^2;
%%设定初始值
jingdu=1e-5%精度要求
x=[10 10];%初始点
%%梯度
fun_diff=[x(1),2*x(2)];
%%目标函数
fun=fun_ob(x)
%%梯度下降主循环
syms a%步长
while ((fun_diff(1)^2+fun_diff(2)^2)^0.5) > jingdu
%%Draw
mesh(x1,x2,x3);
grid on
hold on
plot3(x(1),x(2),fun,'r*')
pause(0.1)
hold off
%%梯度
fun_diff=[x(1),2*x(2)];
d=fun_diff*-1;
%一元线性搜索函数
k=fun_ob(x+a*d);
a_num=solve(diff(k));%求步长
x=x+a_num*d;
fun=fun_ob(x)
end
x,fun_ob(x)
function [a]=fun_ob(x)
a=(x(1)^2)/2+x(2)^2;
end
附上求解结果对应位置: