目录
老饼讲解:一步一步上手学习

【代码】梯度下降算法-代码实现

作者 : 老饼 发表日期 : 2025-11-16 15:03:10 更新日期 : 2026-05-14 14:59:21
老饼讲解-简单易懂,干货满满,爽过嗦螺!


上节我们已经说了梯度下降算法了,可能有些同学还不够形象,那么这里我们拉点数据出来溜一溜,看看梯度下降算法具体是如何优化目标函数的。

一、梯度下降算法-实例解说

上节我们已经说了,梯度下降法呢,就是先给x一个初始化值,然后将它不断往目标函数的负梯度方向下降,从而使目标函数值不断下降,最后找到目标函数的局部最优解。

梯度下降-算法原理

那么下面,我们就根据这一流程,来具体展示一个例子,看看梯度下降法的具体操作和代码实现。

1.1. 梯度下降例子-问题描述

现在,我们有一个目标函数

 

请问,为何值时,y取得最小值?

事实上,我们都知道哈,上面这函数的最小值就是在处取得,此时y=0。那么如果我们要用梯度下降算法来解决这个问题,要怎么搞呢,下面就一起来试一试吧~

1.2. 梯度下降例子-梯度计算

在梯度下降算法中,依赖于的梯度,因此我们需要先算出梯度,也就是对于的偏导数,如下:

 ,

即,目标函数的梯度为:

好了,知道了目标函数,以及它的梯度公式,就可以使用梯度下降算法来迭代它的最优解了。

二、梯度下降例子-手算流程

对于初学者,我们不妨先来手算,感受梯度下降算法是如何一步一步迭代的。

好了,我们将解初始化为,此时。然后,我们设置学习率,接下来将不断地往负梯度方向迭代就可以了。

Step-1:

计算梯度 :
更新x      :
查看 y值  : 

Step-2:

计算梯度 :
更新x      :
查看 y值  : 

  .........

  .........

迭代40:

计算梯度 :     
更新x      :  
查看 y值  : 

大家可以发现,第40次迭代时, 梯度的元素都极小了,这说明此时已经处在一个比较平缓的位置,我们退出迭代 ,以 作为最终结果,这时目标函数值 ,易知,与预期的  几乎一致,这说明梯度下降法已经成功地达到了我们的目标。

三、梯度下降算法-代码实现

好了,上面我们通过手算,应该已经很清楚梯度下降算法到底每一步是怎么做的了,那么如果使用代码来实现,要如何实现呢,下面我们用matlab来实现一下,具体代码如下:

% 本代码展示如何用梯度下降法求函数y= (x1-2)^2+(x2-3)^2最小解
% 本代码来自《老饼讲解神经网络》 www.bbblearn.com
x1 = 0 ;   % 初始化x1
x2 = 0 ;   % 初始化x2
for i = 1 :100
    %------计算梯度--------
    dx1 = 2*x1-4;          
    dx2 = 2*x2-6;
    
    %----- 往负梯度方向更新x------
    x1  = x1 - 0.1*dx1;    
    x2  = x2 - 0.1*dx2;
    
    disp(['第',num2str(i),'轮迭代:x=:[',num2str(x1),',',num2str(x2),'],y=',num2str((x1-2)^2+(x2-3)^2)])
    %----- 如果梯度过小,则退出迭代 --------
    if((abs(dx1)< 0.001)  & (abs(dx2)< 0.001))
        break
    end
end

运行结果如下:

第1轮迭代:x=[0.4,0.6],y=8.32                         
第2轮迭代:x=[0.72,1.08],y=5.3248                 
第3轮迭代:x=[0.976,1.464],y=3.4079             
第4轮迭代:x=[1.1808,1.7712],y=2.181           
......
第39轮迭代:x=[1.9997,2.9995],y=3.5889e-07
第40轮迭代:x=[1.9997,2.9996],y=2.2969e-07

好了,可以看到,当第40轮的时候,它最终的结果[1.9997,2.9996]已经很接近我们的真实最小解了。

总结

这节我们实际的使用了一下梯度下降算法,来加深对梯度下降算法的理解,避免空洞和抽象。事实上,可以看到,梯度下降算法就是一个很简单的算法,只要计算出参数的梯度,然后初始化一个解,再不断地让解往负梯度方向进行迭代,那么目标函数值就会不断的下降了,当梯度很小时,就退出迭代就可以了。



图标 评论
添加评论