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

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

作者 : 老饼 发表日期 : 2025-11-15 15:28:41 更新日期 : 2026-05-21 13:38:24
老饼讲解-简单易懂,干货满满,爽过嗦螺!


上节我们已经讲了梯度算法的原理,那么这节我们就来讲下梯度算法的实现,作为初步上手,我们先手算一遍,加深理解,然后再用代码来实现,这样就彻底弄懂梯度下降算法的具体实现步骤了。

一、梯度下降算法-实现-思路梳理

梯度下降算法简单来说,就是将解按负梯度方向不断迭代,直到满足终止条件,由于需要用到目标函数梯度,所以一般需要先算出梯度公式,以方便迭代过程中计算梯度

梯度下降算法原理

总的来说,梯度下降算法在实现过程中,需要如下四步:

1. 梯度公式准备   :计算目标函数的梯度

2. 初始化解与参数:设置好解的初始值和学习率

3. 按负梯度更新解:按照负梯度将解不断迭代

4. 终止条件判断   :直到梯度极小,就停止迭代

二、梯度下降算法-实现-手算例子

我们就以一个简单的二元函数为例,用梯度下降算法来求函数在什么时候取得最小值,下面我们先一步一步地的算,来看看具体过程是怎么样的。

2.1. 梯度下降-手算例子-问题

求  为何值时,取得最小值,其中: 

 

易知道, 在 处取得的最小值为0 ,下面展示用梯度下降法寻找解的具体过程,看结果是否与我们预期一致。

2.2. 梯度下降算法-手算具体过程

使用梯度算法求解上面的问题是较为简单的,下面我们就一步一步来手算一下。

1、梯度公式计算

     梯度下降算法要用到目标函数的梯度,所以我们要先算出梯度,如下:

  ,

     因此有:

                       

2、参数设定

     接下来我们初始化一下x,以及设置一下学习率。

     不妨初始化 

     此时 

3、迭代

     好了,下面我们就可以开始迭代x了,使它一步一步迫近最优解。

     迭代1:

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

     迭代2:

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

     ...............

     ...............

     迭代40:

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

4、结果

第40次迭代时,都极小,我们退出迭代 ,以 作为最终结果,此时函数值 ,易知,与预期的 x= [2,3] , y=0 几乎一致。

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

好了,我们仍然用手算的例子,来看看梯度下降算法代码是如何实现的,具体代码如下:

"""
本代码用于展示,梯度下降求y= (x1-2)^2+(x2-3)^2的最小解
本代码来自老饼讲解-机器学习:www.bbblearn.com
"""
x1 = 0                                                                 # 初始化x1
x2 = 0                                                                 # 初始化x2
for i in range(100):                                                   # 迭代100次
									                                   
    #------计算梯度--------                                            
    dx1 = 2*x1-4                                                       # 计算x1的梯度
    dx2 = 2*x2-6                                                       # 计算x2的梯度
										                               
    #----- 往负梯度方向更新x------                                     
    x1  = x1 - 0.1*dx1                                                 # 将x1往负梯度方向更新
    x2  = x2 - 0.1*dx2                                                 # 将x2往负梯度方向更新
    #----- 判断终止条件 --------
    if((abs(dx1)< 0.001)  & (abs(dx2)< 0.001)):                        # 如果梯度过小
        break                                                          # 则退出迭代
    print("第",i+1,"轮迭代:x=[",x1,",",x2,"],y=",(x1-2)**2+(x2-3)**2)  # 打印结果 

代码运行结果如下:

梯度下降的优化过程

这其实跟我们上面手算的结果是一样的,就不再过多解说啦。

总结

梯度下降算法的实现,其实只要先算法目标函数的梯度公式,然后再初始化一个解,之后只要不断地往负梯度方向迭代就可以了,非常的简单,在优化的过程中,我们就会看到目标函数一步一步的下降了。



图标 评论
添加评论