@pallavishekhar_: 梯度下降背后的数学原理 在此阅读:https://outcomeschool.com/blog/math-behind-gradient-descent…

X AI KOLs Timeline 新闻

摘要

这篇博客文章通过逐步的数值示例和直观理解,解释了梯度下降(训练机器学习模型所使用的基本优化算法)背后的数学原理。

梯度下降背后的数学原理 在此阅读:https://outcomeschool.com/blog/math-behind-gradient-descent…
查看原文
查看缓存全文

缓存时间: 2026/05/26 15:12

梯度下降背后的数学原理

原文链接:https://outcomeschool.com/blog/math-behind-gradient-descent

梯度下降背后的数学原理

在这篇博客中,我们将通过逐步的数值示例来学习梯度下降背后的数学原理。

梯度下降是用于训练机器学习(https://outcomeschool.com/blog/machine-learning)和深度学习模型的最基本优化算法。理解其背后的数学原理能让我们清晰地了解模型实际上是如何学习的。别担心,我们会一步步讲解每个概念,确保一切易于理解。

我们将涵盖以下主题:

  • 什么是损失函数
  • 什么是梯度下降
  • 梯度下降的直觉
  • 梯度下降背后的数学原理
  • 逐步数值示例
  • 多参数梯度下降
  • 学习率的作用
  • 梯度下降的类型
  • Python中的梯度下降

我是Amit Shekhar,Outcome School(https://outcomeschool.com/)的创始人。我教导并指导了许多开发者,他们的努力让他们获得了高薪的技术工作,帮助了许多科技公司解决独特的问题,并创建了许多被顶级公司使用的开源库。我热衷于通过开源、博客和视频分享知识。

我在Outcome School教授人工智能和机器学习(https://outcomeschool.com/program/ai-and-machine-learning)。

让我们开始吧。

大局观

在深入细节之前,我们先了解一下整体概念。

模型通过调整其权重来学习,使其预测值更接近实际值。梯度下降是一种算法,它告诉模型如何调整这些权重。它不断地朝着减少误差的方向微调权重,一步步地,直到误差尽可能小。

简单来说:

梯度下降 = 一种沿着误差曲线一步步向下滑动,直到到达最低点的简单方法。

什么是损失函数

在学习梯度下降之前,我们首先必须理解什么是损失函数

损失函数是一种衡量模型预测值与实际值之间差距的函数。简单来说,它告诉我们模型错得有多离谱。

假设我们正在构建一个预测房价的模型。一栋房子的实际价格是60,而我们的模型预测为50。误差为60 - 50 = 10。一种常见的衡量误差的方法是对其进行平方。因此,损失变为(60 - 50)² = 100。

我们对误差进行平方有两个原因。首先,平方使得所有误差变为正数,这样负误差和正误差就不会相互抵消。其次,平方对较大误差的惩罚比小误差更重。

当我们有很多样本时,我们会在整个数据集上对这些平方误差取平均。这被称为均方误差(MSE),它是机器学习中最常用的损失函数之一。

**我们训练的目标是使这个损失尽可能小。**而这就是梯度下降发挥作用的地方。

什么是梯度下降

让我们分解一下这个术语:梯度下降 = 梯度 + 下降

  • 梯度指的是表面在特定方向上的斜率或陡度。
  • 下降意味着向下移动。

所以,梯度下降意味着沿着最陡峭的斜率方向向下移动。

简单来说,**梯度下降是一种优化算法,它找到使损失函数最小化的权重值。**它通过反复朝着减少损失的方向调整权重来实现。

梯度下降的直觉

学习这个的最好方法是通过一个例子。

假设我们站在一座山上,而且完全被雾笼罩。我们看不到山谷的底部。我们唯一能感觉到的是脚下地面的坡度。我们的目标是到达山谷的底部(最低点)。

那么,我们会怎么做?我们会感受坡度,然后朝着地面下降的方向迈出一步。如果坡度陡,我们就迈一大步。如果坡度平缓,我们就迈一小步。我们不断重复,直到感觉地面变得平坦,这意味着我们到达了底部。

这正是梯度下降所做的。山就是损失函数。山谷底部就是最小损失。我们感受到的坡度就是梯度。而我们迈出的每一步就是一次权重更新。

梯度下降背后的数学原理

现在,让我们理解梯度下降背后的实际数学原理。我们会保持简单,一步步来。

什么是导数

导数告诉我们函数的变化率。简单来说,它告诉我们函数在给定点处的斜率。

假设我们正在开车。车速表告诉我们位置随时间变化的速度。这个速度就是位置对时间的导数。

类似地,在梯度下降中,我们需要知道损失函数在当前权重值处的斜率。导数正好告诉我们这一点。

对于函数f(w),导数写为如下形式:

这里,f'(w)告诉我们当w发生微小变化时,f的输出变化了多少。

  • 如果导数为,函数正在上升(斜率向上)。
  • 如果导数为,函数正在下降(斜率向下)。
  • 如果导数为,函数是平坦的(我们处于最小值或最大值)。

更新规则

现在我们知道导数(梯度)告诉我们什么,我们可以定义如何更新权重。梯度下降的更新规则如下:

w_new = w_old - α * f'(w_old)

这里:

  • w_old是权重的当前值
  • w_new是权重的更新值
  • α(alpha)是学习率,一个控制步长的小正数
  • f'(w_old)是当前权重处的梯度(导数)

现在的问题是:为什么我们要减去梯度?

因为我们想要下山(减少损失)。如果梯度为正(斜率向上),减去它会让我们向左移动(下山)。如果梯度为负(斜率向下),减去一个负数相当于增加,所以我们会向右移动(也是下山)。这样,无论我们处于最小值的哪一侧,我们总是朝着最小值移动。

这就是更新规则中减号的精妙之处。

逐步数值示例

理解这个的最好方法是通过一个具体的数值例子。

假设我们的损失函数是:

这里,这个函数的最小值在w = 3处,因为(3 - 3)² = 0。但让我们假设模型不知道这一点。它从一个初始猜测开始,并使用梯度下降来找到最小值。

f(w) = (w - 3)²的导数是:

现在,让我们从w = 0开始,学习率α = 0.1,并逐步应用更新规则。

步骤w (之前)梯度: 2(w - 3)新 w: w - 0.1 * 梯度
102(0 - 3) = -60 - 0.1 * (-6) = 0.6
20.62(0.6 - 3) = -4.80.6 - 0.1 * (-4.8) = 1.08
31.082(1.08 - 3) = -3.841.08 - 0.1 * (-3.84) = 1.464
41.4642(1.464 - 3) = -3.0721.464 - 0.1 * (-3.072) = 1.7712
51.77122(1.7712 - 3) = -2.45761.7712 - 0.1 * (-2.4576) = 2.0170

在这里,我们可以看到w每一步都越来越接近3。梯度每一步也在变小,这意味着随着我们接近最小值,步长越来越小。这就是梯度下降如何收敛到最小值。

要亲手通过真实项目学习梯度下降、损失函数和优化器,请查看Outcome School的《人工智能和机器学习课程》(https://outcomeschool.com/program/ai-and-machine-learning)。

多参数梯度下降

在上面的例子中,我们只有一个权重w。但在真实的神经网络中,我们有数百万个权重。那么,梯度下降如何处理多个权重?

假设我们有两个权重w1w2,我们的损失函数是L(w1, w2)。我们需要分别找出损失相对于每个权重的变化方式。这被称为偏导数

这样想:假设我们在调节一台电视。电视有两个旋钮——一个控制音量,一个控制亮度。为了理解每个旋钮的效果,我们每次只转动一个旋钮,保持另一个不动。这正是偏导数所做的。

Lw1的偏导数写为:

这里,符号只是表示“对一个变量求导数,同时保持其他所有变量固定”的一种花哨写法。

梯度是所有偏导数的集合。对于两个权重,梯度是:

梯度 = [∂L/∂w1, ∂L/∂w2]

每个权重的更新规则变为:

`` w1_new = w1_old - α * ∂L/∂w1

w2_new = w2_old - α * ∂L/∂w2 ``

每个权重使用自己的偏导数独立更新。这就是梯度下降如何扩展到神经网络中数百万甚至数十亿个参数。

学习率的作用

学习率α)控制梯度下降中每一步的大小。选择合适的学习率非常重要。让我们看看使用不同的学习率,在同一函数f(w) = (w - 3)²上,从w = 0开始,会发生什么。

学习率太小(α = 0.01):

第1步:梯度 = 2(0 - 3) = -6,新 w = 0 - 0.01 * (-6) = 0.06 第2步:梯度 = 2(0.06 - 3) = -5.88,新 w = 0.06 - 0.01 * (-5.88) = 0.1188

在这里,我们可以看到w几乎没怎么移动。实际上,在α = 0.01下经过20步后,w仅约为0.997,离3还远得很。相比之下,α = 0.1在仅仅4步后就达到了大约2.02。使用极小的学习率训练将非常缓慢。

学习率恰到好处(α = 0.1):

正如我们在上面的数值示例中看到的,w稳步向3移动。这是理想情况。

学习率太大(α = 1.5):

第1步:梯度 = 2(0 - 3) = -6,新 w = 0 - 1.5 * (-6) = 9 第2步:梯度 = 2(9 - 3) = 12,新 w = 9 - 1.5 * 12 = -9

在这里,w从0跳到了9(越过3),然后从9跳到-9(更远)。数值在发散而不是收敛。这意味着学习率太大,梯度下降永远找不到最小值。

因此,必须小心选择学习率。如果太小,训练速度慢;如果太大,训练变得不稳定。在实践中,通常以0.001或0.01作为起点。对于像Transformer这样的大型模型,甚至更小的值如1e-4也很常见。

梯度下降的类型

到目前为止,我们使用简单的函数f(w) = (w - 3)²来学习数学原理。但在实践中,损失是在训练数据集上计算的。数据集可能非常大(数百万个样本),一次性对所有样本计算梯度可能非常慢。这就是不同类型的梯度下降出现的原因。

**批量梯度下降:**这就是我们一直在讨论的。它在每一步使用整个训练数据集来计算梯度。梯度准确,但对于大型数据集来说速度慢。

**随机梯度下降(SGD):**SGD不是使用整个数据集,而是在每一步仅使用一个随机选择的数据点来计算梯度。这使得每一步更快,但梯度噪声较大,因为它仅基于一个样本。

**注意:**在现代深度学习中,“SGD“这个术语经常被宽松地用于指代小批量SGD。例如,PyTorch中的torch.optim.SGD适用于任何批量大小,不仅仅是1。尽管在实践中批量大小通常大于1,但这个名称还是保留了下来。

**小批量梯度下降:**这是折中方案。它使用一小批数据点(通常为32、64或128,对于现代GPU上的大型模型有时更大)来计算梯度。它比批量梯度下降更快,比SGD噪声小。

让我用表格列出它们的区别,以便更好地理解:

类型每步使用的数据速度梯度准确度
批量梯度下降整个数据集
随机梯度下降1个数据点低(有噪声)
小批量梯度下降一批(例如32到1024)中等中等

在实践中,小批量梯度下降是最常用的方法,因为它在速度和精度之间取得了良好的平衡。

要亲手掌握SGD、小批量梯度下降和超参数调优,我们有一个完整的课程——请查看Outcome School的《人工智能和机器学习课程》(https://outcomeschool.com/program/ai-and-machine-learning)。

Python中的梯度下降

现在,让我们用Python代码看看梯度下降的实际运行。我们将使用同样的函数f(w) = (w - 3)²,如下所示:

`` w = 0.0 learning_rate = 0.1

for step in range(50): gradient = 2 * (w - 3) w = w - learning_rate * gradient loss = (w - 3) ** 2 print(f“Step {step + 1}: w = {w:.4f}, loss = {loss:.6f}“) ``

这里,我们从w = 0.0开始,学习率为0.1。每一步,我们计算梯度,更新权重,并打印w的当前值和损失。

最后一步输出:

Step 50: w = 3.0000, loss = 0.000000

经过50步,w基本上等于3,损失基本上为0。模型找到了最小值。

这就是梯度下降在代码中的工作方式。在像PyTorch和TensorFlow这样的真实深度学习框架中,应用了相同的原理,但梯度是通过反向传播自动计算的。我们有一篇详细的博客《反向传播背后的数学原理》(https://outcomeschool.com/blog/math-behind-backpropagation),它逐步解释了这些梯度实际上是如何计算的。

总结

让我们回顾一下我们学到的东西:

  • 损失函数衡量模型预测的错误程度。
  • 梯度下降是通过调整权重最小化损失的算法。
  • 梯度(导数)告诉我们斜率的方向和陡度。
  • 更新规则w_new = w_old - α * 梯度将权重移向最小值。
  • 学习率控制每一步的大小。
  • 在实践中,小批量梯度下降用于训练大型模型。

这就是梯度下降背后的数学原理,也是每个神经网络学习的基础。

准备好AI工程面试:AI工程面试题(https://github.com/amitshekhariitbhu/ai-engineering-interview-questions)

这就是全部内容。

谢谢。

Amit Shekhar Outcome School创始人(https://outcomeschool.com/)

你可以通过以下方式与我联系:

  • X (https://x.com/amitiitbhu)
  • LinkedIn (https://www.linkedin.com/in/amit-shekhar-iitbhu)
  • YouTube (https://www.youtube.com/@amitshekhar)
  • GitHub (https://github.com/amitshekhariitbhu)

关注Outcome School:

  • X (https://x.com/outcome_school)
  • LinkedIn (https://www.linkedin.com/company/outcomeschool)
  • YouTube (https://youtube.com/@OutcomeSchool)
  • GitHub (http://github.com/OutcomeSchool)

在此阅读我们所有的高质量博客。 (https://outcomeschool.com/blog)

相似文章

用对抗样本攻击机器学习

OpenAI Blog

本文讨论了针对机器学习模型的对抗攻击,并展示了梯度掩蔽(一种试图拒绝攻击者访问有用梯度的防御技术)为何从根本上是无效的。论文表明,攻击者可以通过训练能够模拟被防御模型行为的替代模型来绕过梯度掩蔽,最终使这一防御策略失效。