优化是机器学习的重要组成部分。几乎每个机器学习算法的核心都包含一个优化算法。
在本文中,您将了解一个简单的优化算法,您可以将其与任何机器学习算法一起使用。它易于理解且易于实现。阅读本文后,您将了解:
- 什么是梯度下降?
- 梯度下降如何在线性回归等算法中使用?
- 梯度下降如何扩展到非常大的数据集?
- 充分利用梯度下降的一些技巧是什么?
用我的新书掌握机器学习算法**启动您的项目**,其中包括**分步教程**和所有示例的**Excel电子表格**文件。
让我们开始吧。

用于机器学习的梯度下降
图片由大峡谷国家公园提供,部分权利保留。
梯度下降
梯度下降是一种优化算法,用于查找函数(f)的参数(系数)值,从而使成本函数(cost)最小化。
当参数无法通过解析方式(例如,使用线性代数)计算,而必须通过优化算法搜索时,最适合使用梯度下降。
梯度下降的直观理解
想象一个大碗,就像你用来吃麦片或装水果的碗一样。这个碗是成本函数(f)的图。

大碗
图片由William Warby提供,部分权利保留。
碗表面上的一个随机位置是当前系数(cost)值的成本。
碗底是最佳系数集的成本,即函数的最小值。
目标是不断尝试不同的系数值,评估它们的成本,并选择具有稍微更好(更低)成本的新系数。
重复这个过程足够多次,将达到碗底,您将知道导致最小成本的系数值。
获取您的免费算法思维导图

方便的机器学习算法思维导图样本。
我创建了一份方便的思维导图,其中包含60多种按类型组织的算法。
下载、打印并使用它。
还可以独家访问机器学习算法电子邮件迷你课程。
梯度下降过程
该过程从函数系数的初始值开始。这些值可以是0.0或小的随机值。
系数 = 0.0
通过将系数代入函数并计算成本来评估系数的成本。
成本 = f(系数)
或者
成本 = 评估(f(系数))
计算成本的导数。导数是微积分中的一个概念,指函数在给定点的斜率。我们需要知道斜率,以便了解在下一次迭代中移动系数值的方向(符号),从而获得更低的成本。
增量 = 导数(成本)
现在我们从导数中知道了下坡方向,我们可以更新系数。必须指定一个学习率参数(alpha),它控制每次更新时系数可以改变的幅度。
系数 = 系数 – (alpha * 增量)
重复这个过程,直到系数的成本(cost)为0.0或足够接近0以达到满意。
你可以看到梯度下降是多么简单。它确实需要你了解成本函数或你正在优化的函数的梯度,但除此之外,它非常直接。接下来我们将看到如何在机器学习算法中使用它。
机器学习中的批量梯度下降
所有监督机器学习算法的目标是最佳地估计一个目标函数(f),该函数将输入数据(X)映射到输出变量(Y)。这描述了所有分类和回归问题。
一些机器学习算法具有表征目标函数(f)算法估计的系数。不同的算法具有不同的表示和不同的系数,但其中许多算法需要一个优化过程来找到导致目标函数最佳估计的系数集。
可以使用梯度下降进行优化的常见算法示例是线性回归和逻辑回归。
评估机器学习模型估计目标函数的拟合程度可以通过多种方式计算,通常特定于机器学习算法。成本函数涉及通过计算数据集中每个训练实例的模型预测并将预测与实际输出值进行比较并计算总和或平均误差(例如,线性回归中的平方残差之和或SSR)来评估机器学习模型中的系数。
从成本函数中,可以为每个系数计算一个导数,以便可以使用上面描述的更新方程进行更新。
在梯度下降算法的每次迭代中,针对整个训练数据集计算机器学习算法的成本。算法的一次迭代称为一个批次,这种形式的梯度下降被称为批量梯度下降。
批量梯度下降是机器学习中描述的最常见形式的梯度下降。
机器学习中的随机梯度下降
梯度下降在处理非常大的数据集时运行缓慢。
由于梯度下降算法的一次迭代需要对训练数据集中的每个实例进行预测,因此当您有数百万个实例时,这可能需要很长时间。
在数据量很大的情况下,您可以使用梯度下降的一种变体,称为随机梯度下降。
在这种变体中,运行上述梯度下降过程,但对系数的更新是针对每个训练实例执行的,而不是在批次实例结束时执行。
该过程的第一步要求对训练数据集的顺序进行随机化。这是为了打乱对系数进行更新的顺序。由于系数在每个训练实例之后都会更新,因此更新会变得嘈杂,到处跳动,相应的成本函数也会如此。通过打乱系数更新的顺序,它利用了这种随机游走,并避免了分心或卡住。
系数的更新过程与上述相同,只是成本不是对所有训练模式求和,而是针对一个训练模式计算。
对于非常大的训练数据集,随机梯度下降的学习速度可以快得多,通常您只需要对数据集进行少量几次遍历(例如1到10次遍历)即可获得良好或足够好的系数集。
梯度下降的技巧
本节列出了充分利用机器学习梯度下降算法的一些技巧和诀窍。
- **绘制成本与时间的关系图**:收集并绘制算法每次迭代计算的成本值。对于运行良好的梯度下降,预期是每次迭代成本都会降低。如果成本没有降低,请尝试减小学习率。
- **学习率**:学习率值是一个小的实数,例如0.1、0.001或0.0001。为您的特定问题尝试不同的值,看看哪个效果最好。
- **重新缩放输入**:如果成本函数的形状没有倾斜和扭曲,算法将更快地达到最小成本。您可以通过将所有输入变量(X)重新缩放到相同的范围(例如[0, 1]或[-1, 1])来实现这一点。
- **少量遍历**:随机梯度下降通常不需要对训练数据集进行超过1到10次遍历即可收敛到良好或足够好的系数。
- **绘制平均成本**:在使用随机梯度下降时,对每个训练数据集实例的更新可能导致成本随时间变化的图出现噪声。对10、100或1000次更新取平均值可以更好地了解算法的学习趋势。
总结
在这篇文章中,您了解了机器学习中的梯度下降。您了解到:
- 优化是机器学习的重要组成部分。
- 梯度下降是一种简单的优化过程,可以与许多机器学习算法一起使用。
- 批量梯度下降是指在计算更新之前,从所有训练数据中计算导数。
- 随机梯度下降是指从每个训练数据实例中计算导数并立即计算更新。
您对机器学习中的梯度下降或本文有什么疑问吗?请留言提问,我将尽力回答。
感谢您的所有工作,Jason。
非常有帮助
不客气,Victor
先生,您能否写一篇关于比较不同优化算法(GD、SGD、ADAM...)的博客,并附带数据集和代码。
感谢您的建议。
这是我读过的最好、最简单的解释。
继续努力。
谢谢,萨拉。
是的……这个概念解释得非常简单。
解释得真漂亮!非常感谢您。
不客气,Aravind,我很高兴它有用。
嗨,Jason,
您所说的“更新”是什么意思?
嗨,Krishna,我的意思是改变正在优化的系数。
嗨,布朗利,
感谢您分享这个主题。您的解释简单明了。
我很高兴您觉得它有用。
简单易懂。谢谢杰森
谢谢。
帖子提到“该过程的第一步要求对训练数据集的顺序进行随机化”。这需要在什么时候完成?是在每个epoch开始时还是在运行整个操作之前?
我尝试过两种方法,但简单地看图表,没有看到任何明显的差异。
谢谢
嗨,Carmen,一般来说,在每个 epoch 之前进行随机化是个好主意。如果样本顺序不变,每次更新后的变化可能会相互抵消,从而导致性能下降。
我还有另一个问题。
我一直在阅读线性回归教程,在我看来,alpha 和 epoch 的数量是您所说的调优参数,对吗?这意味着我们需要尝试不同的值,看看哪些值能产生最佳预测(至少在训练数据集上)。
以 epoch 数量为例,我创建了一个循环,顺序尝试 4、5、6...100 个 epoch,并为每个 epoch 设置保存了获得的 RMSE 值,然后将 RMSE 绘制为 epoch 设置的函数。这还允许我识别在训练数据集上产生最低 RMSE 的 epoch 设置。
您会说这是一种通用方法吗?1)我们可以了解调优参数如何影响模型的预测精度;2)识别调优参数的最佳组合?
谢谢
是的,好方法。
通常,我喜欢尝试广泛的 epoch 数量(以对数刻度为10、100、1000),然后从那里缩小范围。
搜索预定义参数块称为网格搜索,我在博客上对此写了一些内容。
对不起,又是我 🙂
关于 alpha(学习参数)的问题。将其设置为一个非常小的值是否有好处?我尝试了几种,看起来为了获得非常小的 RMSE,epoch 的数量必须大大增加。因此,权衡似乎是——这需要更长的时间。但是,“慢学习者”的真正好处是什么?直观上,感觉它应该会减少方差,但我不敢肯定自己是对的。训练数据集中的观察次数是否会影响此值的设置?
谢谢
好问题。epoch 的数量和学习率是相关的。
小的 alpha 需要更多的训练,反之亦然。
你会一遍又一遍地在各种算法中看到这种模式,即更新量和学习时间。
解释很有用
谢谢杰森
很高兴你喜欢它,zerious95,谢谢。
嗨,Jason,你能举一个如何将此方法应用于某个数据集的例子吗?只是为了看看整个过程的实际运行情况。
当然,Dapo,请看这个教程
https://machinelearning.org.cn/linear-regression-tutorial-using-gradient-descent-for-machine-learning/
感谢您的文章,它对新手非常有帮助,但我仍然有一个问题。如果我的坐标位于波浪函数的顶部,我该怎么办?如果能用图片展示会更容易,但我无法粘贴,所以想象一个正弦函数及其波浪。我的意思是,在这一点上导数等于零,而这一点是最大值,所以梯度下降可能在这里不起作用。
Jason,
非常棒,解释简单。一直在阅读梯度下降,这是迄今为止最有意义的。我读到梯度下降中使用了偏导数。我已经有一段时间没有学习微积分了,我觉得需要复习一下。您认为学习微积分1课程是最好的选择吗?还是我应该只阅读偏导数或导数?任何关于资源或应重点关注哪种微积分课程的建议都将不胜感激。谢谢
嗨 Andy,
如果您打算研究新的梯度下降方法或自行实现梯度下降以供实际操作使用,那么熟悉算法的“原因”是一个好主意。
如果您想使用它并交付结果,我建议这可能不是您时间的最佳利用。
嗨,Json,
关于梯度下降的精彩解释,对我们这些机器学习新手来说是极大的帮助。
我的问题是如何在多维情况下找到导数。
例如
f(x1,x2) = x1^2 + x2^3+7
在这种情况下,导数的主题是什么?
是 df(x1,x2)/x1 还是 df(x1,x2)/dx2。或者会是偏微分方法吗?
谢谢你
是的,当函数有多个自变量(如x_1、x_2等)时,我们就使用偏导数的概念。
为了更新系数,您将计算 f 对 x_1 的偏导数(保持 x_2 为常数),然后计算 f 对 x_2 的偏导数(保持 x_1 为常数),依此类推。
非常感谢先生!您的努力值得赞赏!
谢谢,我很高兴你觉得这篇文章有用。
亲爱的Jason先生,
我能得到一份执行梯度下降或梯度优化的算法列表吗,比如L-BFGS算法或共轭梯度?
另外,先生,我正在使用自编码器模型在Brani图上进行模式识别,并且我正在使用L-BFGS进行梯度下降/优化。您能为我推荐一些更好的算法吗?
非常感谢您
抱歉,我没有清单。
查看任何现代神经网络库以获取一个好的列表,例如,这是Keras中的列表
https://keras.org.cn/optimizers/
Adam 非常出色
https://machinelearning.org.cn/adam-optimization-algorithm-for-deep-learning/
解释得太棒了……精彩……以如此简单的方式解释,即使是外行也能轻松理解……
谢谢。
非常感谢,非常好的全面解释
谢谢。
Jason,你的教学努力值得称赞。
然而,不应鼓励学生避免机器学习背后的数学。相反,应建议他们热情地投入学习。任何对这些问题的非数学化研究都会产生对该主题的残缺不全和有缺陷的知识。
谢谢您的想法,Andrea。
你好 Jason,
首先,我想说这篇帖子对于所有寻求梯度下降等优化算法信息的人来说都很棒。
其次,我有一个关于使用梯度下降最小化线性回归成本函数的疑问
在scikit-learn的文档中,链接为scikit-learn.org/stable/modules/linear_model.html
我看到一条声明提到,
LinearRegression通过系数 w = (w_1, ..., w_p) 拟合一个线性模型,以最小化数据集中观测响应与线性近似预测响应之间的残差平方和。数学上它解决了一个如下形式的问题
\underset{w}{min\,} {|| X w – y||_2}^2
所以,我的问题是,如果我使用 sklearn.Linear Model 包的 LinearRegression 类来最小化成本函数(即残差平方和),这个类是如何最小化它并获得最小化该成本函数的模型系数(即 theta0,theta1)的?您认为 LinearRegression 类使用哪种优化算法来最小化成本函数并获得模型系数?
我可以使用 sklearn 库的 SGDRegressor 类来最小化成本函数并使用随机梯度下降等优化算法获得最小化此成本函数的模型系数(即 theta0,theta1)吗?
请帮忙……
请帮忙……
sklearn 和其他库不使用梯度下降,而是通常使用线性代数方法。当所有数据都能轻松放入内存时,您可以这样做。
我们在这里使用线性回归来演示梯度下降,因为它是一种易于理解的算法。如果所有数据都能放入内存并且我们可以使用线性代数方法,我们可能不会使用这种算法来拟合线性回归。
嗨 Jason
我可以肯定地说,就我所了解的梯度下降而言,这是一篇出色的文章。
非常感谢您撰写这篇优秀的文章。
我希望“sklearn”中的“SGDRegressor”使用此成本函数来计算线性二次方程的最佳系数,而“LinearRegressor”使用正规方程来解决相同的问题。
然而,这里我怀疑在 SGD 中我们如何开始初始系数集,以便我们开始收敛到最佳?
SGD 不能保证最佳系数,只能保证足够好的系数。
你可以尝试多次运行该过程,并从所有运行中选择最好的一个。
谢谢Jason的回答,请问如何用一些随机系数开始是最好的方法?
范围在0-1之间的小随机数
为什么我们在梯度下降中改变delta w?
什么是收敛?
为什么我们在收敛时进行梯度下降?
当梯度下降不收敛时会发生什么?为什么我们需要合适的学习率?
我可以使用 Python 创建一个 AI 并将其集成到 xcode 和 Android Studio 中,并使用它来创建一个 AI 应用程序吗?
有没有办法创建一个 AI 操作系统?如果有,如何实现?
抱歉,我对 xcode 或 Android Studio 不了解,无法为您提供好的建议。
嗨,Jason,
感谢您对梯度下降的解释。我有一个关于随机梯度下降的问题。
对于这个解释
“系数的更新过程与上述相同,只是成本不是对所有训练模式求和,而是针对一个训练模式计算。”
关于这一点,我只是困惑于成本是如何针对一个训练模式计算的?这不是批量梯度下降吗?
谢谢你
不同之处在于,梯度是从单个样本而不是一批样本中估计的,因此噪声更大。
您能推荐任何关于在 Python 中实现此算法的文章吗?
是的,请看这里
https://machinelearning.org.cn/implement-linear-regression-stochastic-gradient-descent-scratch-python/
嗨,Jason,
解释得很棒,不过有一个问题。我对微积分还不熟悉,但是斜率的符号如何告诉我们移动的方向呢?
我的意思是,如果斜率为负,我们是否会减小系数的值,反之亦然?
或者这取决于每条曲线/函数。
是的,就这么简单。在数轴上向左或向右移动。
现在,所有这些梯度微积分如何应用于自然语言处理文本分类文本摘要?
梯度下降与网络解决的通用问题无关。
非常感谢您所有的解释,Jason。对我帮助很大。
有没有可能获得使用 R (Caret) 和 Python (Sklearn) 的人工神经网络模型,通过交叉验证和参数调优来应用梯度下降和随机梯度下降的示例?
当然,从这里开始
https://machinelearning.org.cn/start-here/#deeplearning
棒极了。非常有用的文章,它使机器学习中的梯度下降清晰易懂。
谢谢。
解释得太棒了。我是您机器学习页面的忠实粉丝。
谢谢。
关于这个主题的解释真的很好,可以彻底理解。期待阅读更多基于机器学习的主题。关于使其更有趣的一点建议是——尝试添加示例和视觉效果。
感谢您的建议。
非常有帮助。谢谢杰森
很高兴听到这个!
内容丰富的页面,谢谢先生。
谢谢。
清晰简洁的解释。谢谢分享。
谢谢。
嗨,Jason,您做得非常棒。非常感谢。希望您不介意我在未来机器学习工作中需要帮助时联系您。我是一名数学家,从事优化问题算法研究。致敬
如果能帮上忙,我在这里。
非常棒的帖子!感谢您分享这些信息。
很高兴看到应用机器学习如何改善生活。
谢谢,Ben。
先生,解释得很好很简洁,谢谢。但我可以在哪里学习这个算法的实现呢?
谢谢。
您可以在这里使用 Python 实现它
https://machinelearning.org.cn/linear-regression-tutorial-using-gradient-descent-for-machine-learning/
非常非常感谢您的帖子……正如您上面提到的电子书,它有点贵。但是,如果您能以更低的价格提供,那将是很棒的,因为我目前还是一名学生。
没问题,您可以在这里联系我,我可以给您发送学生折扣。
https://machinelearning.org.cn/contact/
首先,如果我的问题不合这里的标准,我想说声抱歉。我真的是这个领域的新手。
谢谢您的分享。这是一个有趣的话题。但是,关于多层感知器中的梯度下降,我有一些疑问。希望您能回答。
首先,假设我们使用MLP训练IRIS数据集并设置epochs为10。
在您的文章中,随机梯度下降会针对数据集中的每个样本更新成本(系数)。那么,对于每次迭代,每个类别的最终成本函数是什么?假设类别1 IRIS有50个样本,那么是RSS最低的样本成本作为该迭代的最终成本值,还是最后一个样本成本?
对于批量梯度下降,您提到在每次迭代中,机器学习算法会计算整个训练数据集的成本。这在MLP中如何实现?您能否进一步解释这一部分?如何确定和更新每个类别的最终系数?最终系数的值是多少?
我们将使用交叉熵作为分类任务的损失函数,在此了解交叉熵是什么
https://machinelearning.org.cn/cross-entropy-for-machine-learning/
为了计算损失或误差,我们可以对批次或整个数据集中的所有样本进行求和或平均。
系数或权重是迭代更新的,直到我们决定停止训练。
嗨,Jason,
我喜欢你的教程,总是学到很多东西。优化的目的是最小化成本函数。我们如何为无监督学习定义成本函数?我们能否优化无监督机器学习算法,以及如何优化?
谢谢,
索菲亚
是的,通常目标函数是某种形式的群体分离。
也许从这里开始
https://machinelearning.org.cn/clustering-algorithms-with-python/
嗨,Jason,
机器学习优化是一个过程。我认为优化的第一步是定义成本/损失函数和度量/评估方法。我认为数据准备,例如特征工程、超参数调优、模型调优,例如模型集成,都应该属于优化的一部分。
您有没有关于机器学习优化的通用文章?
谢谢,
索菲亚
我希望很快能写一本关于这个主题的书。
嗨,Jason,
非常棒的随机梯度下降 (SGD) 概念教程
如果我错了请纠正。我将 SGD 定义为:
“在探索定义输入 (X) 和输出 (Y) 之间映射函数的权重(存在于另一个模型空间中)的搜索空间时,SGD 是最小化某个成本或损失函数的方式——它建立了一个搜索标准,例如实际输出与估计输出之间的误差——通过梯度执行(表示成本函数对每个模型权重贡献的敏感度的数学导数乘以学习率步长),……SGD 之所以被称为“随机”,是因为模型的权重更新是在每个数据集批次(部分随机选择——甚至打乱)上执行的,……而不是对整个数据集执行权重更新。”
所以最终存在“随机性”,因为算法每次运行时都会略有不同(选择的批次)……”
此致,
JG
谢谢。
也许吧。随机性是因为我们正在近似目标函数的梯度,因为我们无法访问真实的目标函数或真实的梯度。
太棒了!谢谢
不客气。
您好,我只是想问一下,梯度下降可以应用于所有算法(例如随机森林、SVM)吗?梯度下降本身就是一种算法吗(不需要线性回归算法的配合)?如果梯度下降如此有用,为什么大家在他们的线性回归模型中不都使用它呢?为什么人们也不在其他算法上使用梯度下降呢?将它应用于所有算法真的有必要吗?
我正在学习梯度下降,现在正在进行编码部分。我很困惑如何真正将它应用到我的代码中:我应该在代码中的哪里应用它?如何将梯度下降与算法一起使用来预测某些东西?还有一些其他优化算法,那么我应该使用这些不同的优化算法而不是梯度下降吗?
不,仅适用于具有可增量系数的算法。
即使可以应用,也可能存在更高效的优化算法,例如,它可用于线性回归和逻辑回归,但效率不高。
好的,非常感谢!
不客气。
嗨,先生,梯度下降只用于回归问题,网格搜索和随机搜索也是优化算法,只用于分类。
或者我们可以将梯度、网格和随机搜索用于所有算法。
为此感谢……❤️
梯度下降可以用于任何你想要的优化问题,它可能不是解决该问题最合适的方法。
无法下载您的思维导图,先生。请您查看一下。
很抱歉听到这个消息,您可以在这里给我发电子邮件并直接索取副本
https://machinelearning.org.cn/contact/
嗨,Jason,
有一篇关于随机梯度下降和批量梯度下降之间差异的帖子是矛盾的。在这篇文章中,内容是这样的:
***
梯度下降在处理非常大的数据集时运行缓慢。
由于梯度下降算法的一次迭代需要对训练数据集中的每个实例进行预测,因此当您有数百万个实例时,这可能需要很长时间。
在数据量很大的情况下,您可以使用梯度下降的一种变体,称为随机梯度下降。
***
但在你的另一篇帖子(链接如下)中,却说了相反的话。
***
随机梯度下降的缺点
频繁更新模型比其他配置的梯度下降计算成本更高,在大型数据集上训练模型需要显著更长的时间。
***
https://machinelearning.org.cn/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/
你能告诉我应该遵循哪个吗?
随机梯度下降总是比批量梯度下降慢。
尊敬的先生,
我有油井钻井数据,我想使用机器学习对其进行探索性分析。
请问您能帮我吗?
此致
感谢您的询问。
抱歉,我无法帮助你完成你的项目。
我很乐意帮忙,但我没有能力参与你的项目到你需要的程度或能做好工作的程度。
我相信你能理解我的立场,因为我每天都会收到许多项目帮助请求。
尽管如此,我很乐意回答你关于机器学习的任何具体问题。
嗨,Jason,
我相信梯度下降有助于我们估计最小化成本函数并足够接近最佳模型的参数。然后可以根据模型过拟合或欠拟合数据的情况来改变这些参数。请确认此观点是否正确,如果不对,请相应地提供建议。
此致。
梯度下降与随机梯度下降有什么不同?请用文字描述。
嗨 Qamar……您可能会发现以下内容很有趣
https://machinelearning.org.cn/difference-between-backpropagation-and-stochastic-gradient-descent/
为什么它被称为随机梯度法?
嗨 Allabaksh……以下资源可能对您有用
https://machinelearning.org.cn/stochastic-in-machine-learning/
谢谢。它帮助我建立了一些关于梯度下降的直觉。
非常欢迎你,ling!我们感谢你的支持和反馈。
哇,这是最好的解释!非常感谢!
非常欢迎你,unknownAI!