• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

梯度下降法求函数最小值 基于matlab实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

算法原理

梯度下降法是一个最优化算法,可以用来求一个函数的最小值,最大值等,也常用于人工神经网络中更新各个感知器之间的权值,求出cost function的最小值等,应用广泛。
其原理简单,就求函数的最小值这个应用而言,大致说来就是先求出该函数梯度,大家都知道梯度是一个函数在该点的最快上升率,那么求个相反数就是最快下降率了。将每个自变量按下列公式更新:

xt+1=xt+Δx

其中
Δx=ηfx

η称为学习速率,也称为步长,指明了自变量朝向最快下降方向减少的速度,这个值的选定相当重要,太大了会导致震荡,无法收敛到最小值点,太小了会导致收敛速度过慢。
xt+1xt的差小于一个阀值时,就可以停止循环了。

Matlab实现

% 没有加入冲量项的随机梯度下降法实现
syms x y real
y(x) = x^2+2*x+10 ;
delta(x) = -diff(y(x)) ;
step = 0.1 ;
first_x = 10 ;
x_current = first_x ;
x_next = first_x ;
show_tmp = 0 ;
show = [] ;
counter = 0 ;
delta_last = 0 ;
while (true)
    delta_x = double(delta(x_current))*step ;
    if(abs(delta_x) < 0.0001)
        break
    end
    x_next = x_current + delta_x ;
    x_current = x_next ;
    counter = counter + 1;
    show_tmp = x_next ;
    show = [show, show_tmp] ;
    if(counter > 200)
        break ;
    end
end
x_next
counter
figure(1)
ezplot(y(x))
hold on 
plot([-100, 100],[double(y(x_next)), double(y(x_next))],\'-r\')
double(y(x_next))
figure(2)
plot(show)
pause
close all

待求解的函数曲线图像如下所示,其中的红线为梯度下降法算出来的最小值,可以看出来梯度下降法成功求出了该函数的最小值。

自变量的变化曲线,可以看出当循环超过25次时,此时的x已经很接近最小值点了,收敛速度取决于步长step。

各位可以自行调整步长和初始值,观察其收敛速度的变化,需要注意的是,这个步长如果太大将会导致震荡,无法收敛到最小值点,如果太小,将导致收敛速度太慢。
——————————————————————————————
另外,这个函数因为是二次函数,没有多个极点,因此梯度下降法能够在不陷入局部最优的情况下找到最大值,如果是存在多个极点的复杂函数会怎么样呢?让我们看下以下例子:

% 加入了冲量项,缓解陷入局部最优的随机梯度下降算法
syms x y real
y(x) = x^2+4*x+sin(cos(2*x+x^2)) ;
delta(x) = -diff(y(x)) ;
step = 0.1 ;
first_x = 10 ;
x_current = first_x ;
x_next = first_x ;
show_tmp = 0 ;
show = [] ;
counter = 0 ;
delta_last = 0 ;
alpha = 0; % 冲量项比例系数,设为0相当于没有加入冲量项
while (true)
    delta_x = double(delta(x_current))*step + delta_last*alpha;
    delta_last = delta_x ;
    if(abs(delta_x) < 0.0001)
        break
    end
    x_next = x_current + delta_x ;
    x_current = x_next ;
    counter = counter + 1;
    show_tmp = x_next ;
    show = [show, show_tmp] ;
    if(counter > 200)
        break ;
    end
end
x_next
counter
figure(1)
ezplot(y(x))
hold on 
plot([-100, 100],[double(y(x_next)), double(y(x_next))],\'-r\')
double(y(x_next))
figure(2)
plot(show)
pause
close all

可以看出来,最小值和剃度下降法算出来的最小值并没有重合,此时算法陷入了局部最优点,梯度下降法算出的最小值是y = -3.1586

自变量变化曲线如下:

当把冲量项的系数alpha改为0.5时,得出:

此时梯度下降法算出来的最小值为 y = -3.9611,从图中也可以看出已经是达到了函数最低点了。
自变量变化曲线如下:

总结上面的实验,可以看出,加入冲量项可以缓解梯度下降法陷入局部最优的风险。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
(转载)delphi实例TDBGrid用右键菜单复制行粘贴行发布时间:2022-07-18
下一篇:
delphi实现post请求发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap