分享

深度学习之——梯度下降法的数学原理

 netouch 2025-04-21 发布于北京

      梯度下降法——是一种最优化算法,用于找到函数的局部极小值或全局最小值。它基于函数的梯度(或偏导数)信息来更新参数,目标是通过逐渐调整参数值来最小化目标函数的值。在机器学习算法中,梯度下降是最常采用的方法之一,尤其是在深度学习模型中,BP反向传播方法的核心就是对每层的权重参数不断使用梯度下降来进行优化。

图片

      梯度下降法的一个直观的理解,就像一个圆球从山顶滚向山脚的过程:  

1. 初始位置:圆球随机落在山顶的某个位置,就像算法一开始随机设定参数。

2. 找坡度:圆球会自动朝最陡的下坡方向滚动,这对应算法计算损失函数的梯度(最陡上升方向)并取反,确定参数更新方向。因为梯度方向与等高线垂直,所以圆球总是垂直于山坡滚动。  

3. 控制步长:圆球滚动的距离由初始势能(学习率)决定。步子太大可能直接滚过山脚,太小又会走得很慢,学习率就是用来平衡这个“步子大小”的关键。  

4. 不断迭代:每滚一步,圆球都会重新调整方向,直到感觉坡度变缓(梯度接近零),此时认为到达山脚(找到最优解)。但现实中可能因局部陡坡卡住(陷入局部最小值),需要调整策略。  

图片

整个过程圆球在复杂地形中“试探着往下走”,通过不断调整方向和步长逼近最低点,即,梯度下降算法最终找到让目标函数最小的参数。


一、梯度下降法的数学原理

1.1 什么是梯度

      梯度是微积分中的基本概念,也是机器学习解优化问题经常使用的数学工具,要理解梯度,首先我们先温习一下导数的概念——导数是一元函数的变化率(斜率)。如下求导计算,第一个表达式为求图片的导数:

图片

当一个函数有多个变量的时候,想知道在某个位置的变化率(最典型的就是曲面上某个点的变化率)时,需要分别对每个变量求偏导数,也就是求各个方向的变化率:

图片

偏导数写成向量形式二元时为

f =图片多元时为

图片

图片

学习率或者步长,δ的取值决定了梯度下降法收敛的速度,同时也影响最终的效果,如下图所示:

图片

1.3 梯度下降法的步骤

    1. 初始化参数随机初始化模型的参数(例如权重和偏置)。

    2. 计算梯度使用当前参数计算损失函数关于这些参数的梯度。

   3. 更新参数将每个参数沿着梯度的反方向移动一小步,步长由学习率控制。

   4. 重复迭代重复计算梯度和更新参数,直到满足某个停止条件(例如达到最大迭代次数或损失函数值足够小)。

二、梯度下降算法实例

2.1 一维梯度下降实例
假设有一个单变量函数,即一维函数:
图片
上面的表达式,其实就是一个最简单、最典型的抛物线函数。它的导数(一维函数的导数,就等价于梯度)为:
图片
  • 初始化起始点,例如起始点为x0 = 1, 学习率为:
  • 图片
图片

2.2 多维梯度下降实例
    假设有一个多维函数:
图片
    其中,θ1、θ2为变量。

假设初始的起点坐标为:
图片
学习率定为:
图片
函数的梯度(分别对θ1、θ2求偏导数,然后列成向量形式)为:
图片
进行多次更新迭代,过程如下:
图片
迭代100次后,从数值上我们发现,基本上已经非常逼近最小值坐标点了。在二维空间上可以看到迭代逼近最小值坐标点的过程,如下图:
图片
以上过程实现代码如下:
#梯度下降求最小值及坐标位置import numpy as npx = np.array([1,3])              # 初始化起始点xlr = 0.1                        # 设置学习率for i inrange(100):              # 最大迭代100次    dx = np.array([2*x[0],2*x[1]]) # 计算当前位置的梯度        x  = x - lr*dx              # 往负梯度方向更新x     if((min(abs(dx))<0.00000001)):       break                     #  如果梯度过小,则退出迭代     print('第'+str(i+1)+'轮迭代:x=:['+str(x[0])+','+str(x[1])+'],y='+str((x[0])**2+(x[1])**2))



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多