最速下降法及案例分析(含MATLAB代码)
最速下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。1对于给定
一、最速下降法的背景与应用
最速下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。1
二、最速下降法的基本原理
对于给定的函数 f ( x ) f(x) f(x)由泰勒展开得: f ( x ) = f ( x 0 ) + ∇ f ( x ) ( x − x 0 ) + ∇ f ( x ) ( x − x 0 ) 2 ! + . . . (1) f(x)=f(x_0)+\nabla f(x)(x-x_0)+\frac{\nabla f(x)(x-x_0)}{2!}+... \tag{1} f(x)=f(x0)+∇f(x)(x−x0)+2!∇f(x)(x−x0)+...(1)取它的第二阶展开,则 f ( x ) ≈ f ( x 0 ) + ∇ f ( x ) ( x − x 0 ) (2) f(x)\approx f(x_0)+\nabla f(x)(x-x_0) \tag{2} f(x)≈f(x0)+∇f(x)(x−x0)(2)
如上图所示
∇
f
\nabla f
∇f为梯度方向,
−
∇
f
-\nabla f
−∇f为负梯度方向(反向梯度)。所以我们就有
x
−
x
0
=
−
α
∗
∇
f
(
x
0
)
(3)
x-x_0=-\alpha *\nabla f(x_0)\tag{3}
x−x0=−α∗∇f(x0)(3)那么就得到迭代公式
x
k
+
1
=
x
k
−
α
∗
∇
f
(
x
k
)
,
(
α
>
0
)
(4)
x_{k+1}=x_k-\alpha *\nabla f(x_k),(\alpha>0)\tag{4}
xk+1=xk−α∗∇f(xk),(α>0)(4)
其中
α
\alpha
α称为学习率。也可以理解为步长,
α
\alpha
α的不同,会导致迭代次数不同,收敛速度就不同。
最速下降法案例分析
下面取一个例子 f ( x ) = x 2 f(x)=x^2 f(x)=x2, ∇ f ( x ) = 2 x \nabla f(x)=2x ∇f(x)=2x, x 0 = 10 , α = 0.2 x_0=10,\alpha=0.2 x0=10,α=0.2由迭代公式(4)有:
x k {x_k} xk | x k + 1 = x k − α ∗ ∇ f ( x k ) x_{k+1}=x_k-\alpha *\nabla f(x_k) xk+1=xk−α∗∇f(xk) | ∇ f ( x k ) \nabla f(x_k) ∇f(xk) |
---|---|---|
x 1 x_1 x1 | x 1 = x 0 − α ∗ ∇ f ( x 0 ) = 6 x_1=x_0-\alpha *\nabla f(x_0)=6 x1=x0−α∗∇f(x0)=6 | ∇ f ( x 1 ) \nabla f(x_1) ∇f(x1)=12 |
x 2 x_2 x2 | x 2 = x 1 − α ∗ ∇ f ( x 1 ) = 3.6 x_2=x_1-\alpha *\nabla f(x_1)=3.6 x2=x1−α∗∇f(x1)=3.6 | ∇ f ( x 2 ) \nabla f(x_2) ∇f(x2)=7.2 |
x 3 x_3 x3 | x 3 = x 2 − α ∗ ∇ f ( x 2 ) = 2.16 x_3=x_2-\alpha *\nabla f(x_2)=2.16 x3=x2−α∗∇f(x2)=2.16 | ∇ f ( x 3 ) \nabla f(x_3) ∇f(x3)=4.32 |
… | … | … |
按照这样迭代下去,只要给定一个精度值
ϵ
\epsilon
ϵ,使得
∇
f
(
x
k
)
\nabla f(x_k)
∇f(xk)<
ϵ
\epsilon
ϵ,就可以了。如下图,它是越来越靠近最低点的。
通过观察下这个图可以看到,学习率 α \alpha α取的不同,迭代次数也会不同,选择合适的学习率,收敛速度会更快。
四、最速下降法与梯度下降法的区别
最速下降法与梯度下降法的主要区别在最速下降法有学习率 α \alpha α,而梯度下降法没有(就是 α \alpha α恒等等于1,是不变的),梯度下降法默认负梯度方向就是目标函数值下降最快的方向。即 △ x = − ∇ f ( x ) \triangle x=-\nabla f(x) △x=−∇f(x),故每次都将自变量沿着负梯度方向移动单位步长,目标函数值就会逐渐收敛。但是收敛速度非常大的程度地依赖于其Hessian矩阵的条件数2。
五、 最速下降法的缺点
某点的负梯度方向,通常只是在该点附近才具有这种最速下降的性质。在一般情况下,当用最速下降法寻找极小点时,在开始几步目标函数下降较快;但在接近极小点时,收敛速度长久不理想了。
通过上面案例分析也可以清晰的看到,在开始时都是收敛比较快(图像上的点比较稀疏),而在靠近极小值时,收敛比较慢。从图像是上看密密麻麻的。如果当目标函数的等值 线为比较扁平的椭圆时,那收敛就更慢了。所以,在实用中常用最速下降法和其他方法联合应用,在前期使用最速下降法,而在接近极小值点时,可以改用收敛较快的其他方法。
还有就是最速下降法只能得到局部最优,也就是说当你的函数有多个极值时。函数值是否最小与于初始值
x
0
x_0
x0的选举有关。
案例分析的代码
clear,clc
%f=x^2;%df=2*x;
x0=15; %初始值
el=0.0001; %设置精度
n=0.9; %学习率
x1=x0-n*2*x0;
k=1;
while abs(2*x1)>el
x0=x1;
x1=x0-n*2*x0;
k=k+1; %k为迭代次数
end
xd=2*x1
k
%%%%%%%%%%%%%%%%%%%%%%下面是给图像标箭头
while abs(2*x1)>el
x0=x1;
x1=x0-n*2*x0;
k=k+1; %k为迭代次数
end
xd=2*x1
k
x11(1)=10;
for i=1:k
x11(i+1)=x11(i)-n*2*x11(i);
end
x11
y=x11.^2
scatter(x11,y,'k')
hold on
t=-10:0.01:10;
y1=t.^2;
plot(t,y1,'b')
for i=1:k
PlotLineArrow(gca,[x11(i),x11(i+1)],[y(i),y(i+1)],'g','r')
end
下面是画箭头的m.文件3。
function PlotLineArrow(obj, x, y, markerColor, lineColor)
% 绘制带箭头的曲线
% 绘制散点图
plot(x, y, 'o', 'Color', markerColor, 'MarkerFaceColor', markerColor);
% 获取 Axes 位置
posAxes = get(obj, 'Position');
posX = posAxes(1);
posY = posAxes(2);
width = posAxes(3);
height = posAxes(4);
% 获取 Axes 范围
limX = get(obj, 'Xlim');
limY = get(obj, 'Ylim');
minX = limX(1);
maxX = limX(2);
minY = limY(1);
maxY = limY(2);
% 转换坐标
xNew = posX + (x - minX) / (maxX - minX) * width;
yNew = posY + (y - minY) / (maxY - minY) * height;
% 画箭头
annotation('arrow', xNew, yNew, 'color', lineColor);
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)