首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零开始深入理解梯度下降法

从零开始深入理解梯度下降法

作者头像
用户2423478
发布2025-10-28 13:08:22
发布2025-10-28 13:08:22
180
举报
文章被收录于专栏:具身小站具身小站

1. 概述

梯度下降法是一种用于寻找函数局部最小值的一阶迭代优化算法,核心思想非常直观,通过沿着函数当前点的梯度(即最陡上升方向)的反方向(即最陡下降方向)以小步长迭代更新参数,逐步逼近函数的最小值点。

核心目的: 最小化一个目标函数 J(θ),其中 θ 是我们要优化的参数向量。

2. 直观理解

想象一个在浓雾笼罩的山丘上的登山者,目标是找到最近的山谷(最低点),看不清整个地形,只能感受到脚下地面的倾斜程度,策略会环顾四周,感觉到哪个方向是最陡的下坡方向,朝着那个方向走一小步。

重复: 到达新的位置后,你再次感受最陡的下坡方向,再走一小步。

最终: 通过不断重复这个过程,最终会到达一个山谷底部,在这里无论往哪个方向走,地面都是平坦或向上的。

梯度下降法就是这个过程的数学抽象:

  • 山丘:就是我们要最小化的目标函数 J(θ)。
  • 位置:就是当前的参数估计 θk。
  • 脚下的倾斜程度:就是函数在该点的梯度 ∇J(θk),梯度指向的是函数值上升最快的方向。
  • 最陡的下坡方向:就是负梯度方向 −∇J(θk)。 走一小步:就是用一个学习率 αα 来控制步长的大小,更新公式为:θk+1=θk−α∇J(θk)。

3. 详细推导

第一步:泰勒展开与局部线性近似 假设我们当前在第 k 次迭代,参数为 θk,希望找到一个微小的增量 Δθ,使得函数值减小:J(θk+Δθ)<J(θk),在 θk 处对函数 J 进行一阶泰勒展开:

目标是让新的函数值 J(θk)+∇J(θk)TΔθ尽可能小。

第二步:寻找最优的更新方向 目标是最小化泰勒展开的近似值,上式J(θk)J(θk) 是固定值,所以最小化问题转化为:

第三步:引入学习率并得到更新公式 确定了方向,步长应该走多大,这就是学习率 αα 的作用,它控制着每一次迭代更新的步长。

因此,参数的更新规则如下,就是梯度下降法最核心的公式:

学习率 α 是梯度下降中最重要的超参数,设置合理能以较快的速度稳定地收敛到局部最小值,在实践中,常常需要通过实验(如学习率网格搜索)来找到一个好的 α 值,或者使用自适应学习率的优化器。

  • α 太小:
    • 优点:非常稳定,每次下降虽然慢,但一定能保证函数值减小。
    • 缺点:收敛速度极慢,需要很多次迭代才能到达最低点。
  • α 太大:
    • 优点:初期收敛可能很快。
    • 缺点:可能一步迈过了最低点,导致函数值震荡甚至发散,永远无法收敛。

4. 总结

算法流程

参数说明:

  • 过程说明:计算在第 k 步的当前参数 θk处,目标函数 J关于每一个参数的偏导数,并将这些导数值组合成一个向量,这个向量 gk的方向指向函数值 J增长最快的方向,其大小(模长)表示这个方向上的增长率有多陡峭。
  • θk:这是一个向量,表示在第 k 次迭代时,模型所有参数的当前取值。
  • J(θk):是目标函数(或称损失函数)在参数取值为 θk 时的输出结果,是一个标量(单个数字),定量地衡量了模型在当前参数下的“不好”的程度(例如,预测值与真实值之间的总误差)。
  • ∇(Nabla算子):这是一个微分算子,意思是“对……求梯度”。它要求对目标函数 JJ 关于它的每一个参数 θ1,θ2,...,θn 分别求偏导数。
  • ∇J(θk):这是函数 J 在点 θk 处的梯度,是一个向量,其每个分量是 J 对某个参数的偏导数在该点的值。
  • gk:是梯度的另一种写法,表示第 k 步的梯度。

应用场景

  • 线性回归:最小化均方误差(MSE)损失函数。
  • 逻辑回归:最小化交叉熵损失函数。
  • 神经网络:反向传播算法的核心就是梯度下降。通过链式法则计算网络中所有权重的梯度,然后用梯度下降法更新权重。几乎所有现代的深度学习模型(CNN, RNN, Transformer)都是用基于梯度下降的优化器训练的。
  • 优化问题:任何可微目标函数的优化问题,在无法求得解析解时,都可以尝试使用梯度下降法来寻找数值解。

优点:

  • 简单通用:概念简单,实现容易,适用于各种可微函数。
  • 低计算成本:只需要计算一阶梯度,计算和存储成本远低于需要计算Hessian矩阵的牛顿法。
  • 可扩展性:可以处理大规模数据集(通过其变种,如随机梯度下降)。

缺点:

  • 收敛速度慢:特别是接近最小值时,收敛速度会变得非常慢(线性收敛)。它无法利用曲率信息像牛顿法那样“预测”最小值的位置。
  • 对学习率敏感:学习率选择不当会严重影响性能(太小则慢,太大则震荡或不收敛)。
  • 容易陷入局部最优:对于非凸函数,梯度下降法保证收敛到的只是局部最小值,而非全局最小值,初始点的选择很重要。
  • 可能停滞在鞍点:在高维问题中,鞍点比局部极小值更常见。在鞍点处梯度也是零,梯度下降法会无法继续更新。

主要变种 为了解决上述缺点,尤其是收敛速度和鞍点问题,发展出了许多强大的变种:

  • 随机梯度下降:每次迭代只随机选择一个样本来计算梯度,计算更快,引入了噪声可以帮助跳出局部最优点,是深度学习的主流算法。
  • 小批量梯度下降:每次迭代使用一小部分(一个Batch) 样本来计算梯度,是SGD和标准GD的折中,兼具效率和稳定性,是最常用的实践方式。
  • 带动量的SGD:引入了“动量”的概念,类似于小球滚下山坡。它积累了之前梯度的方向,有助于加速收敛并减少震荡。
  • 自适应学习率算法(如Adam):为每个参数自适应地计算不同的学习率,是目前深度学习实践中最流行、最通用的优化器。

5. 具体示例(线性回归)

用一个最简单的线性回归的例子来演示具体计算过程 ∇J(θk)。

3. 代入数值: 假设有 3个 数据点:(1, 2), (2, 4), (3, 6)。 模型初始参数如下,学习率 α=0.1

首次迭代 (k=0):

现在,参数从 [0,0][0,0] 更新到了 [0.4,0.933][0.4,0.933],完成一次完整的梯度下降迭代。

下一次迭代(k=1): 将在新的点上重新计算梯度 g1,然后再次更新。

4. 总结一下 计算梯度 gk=∇J(θk)就是一个求导过程,目的是找到当前点最陡的上升方向,从而让我们能向相反(最陡下降)的方向前进。在实际代码中,这个求导和计算过程是自动化的(如使用PyTorch/TensorFlow的自动微分功能),但其背后的数学原理就是如上所示的偏导数计算。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 具身小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. 直观理解
  • 3. 详细推导
  • 4. 总结
  • 5. 具体示例(线性回归)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档