第16章:下山,先学会怎么迈步——梯度下降

经典机器学习部分结束了。你手里现在有函数、向量、矩阵、导数、概率、熵,有线性回归、逻辑回归、SVM、决策树和随机森林,还有过拟合、欠拟合和验证集。按道理,我们已经可以进入深度学习了。

但在走进多层神经网络之前,还有一个环节必须单独拎出来讲。

你回想一下线性回归那一章。我们是怎么找到"最好的那条线"的?我说了一句"计算误差平方和对w和b的偏导数,然后反复朝下降最快的方向挪动"------一笔带过了。在逻辑回归那一章,我又说了一句"用交叉熵作为损失函数,然后用梯度下降来优化"------又一笔带过了。

现在到了深度学习,不能再一笔带过了。因为深层网络动辄几百万、几十亿个参数,它唯一能用的优化方法就是梯度下降------而且每次训练都得跑几万步、几十万步。你如果不理解梯度下降的直觉、变体和陷阱,就看不明白深度学习训练过程里那些"为什么会这样"的问题。

所以这一章,我们专门聊梯度下降。

蒙着眼睛下山

先给你一个经典的比喻,你大概已经听过了------蒙着眼睛下山。

你站在一座山的山顶。脚下是连绵起伏的地形。你的目标是下到山谷的最低点。但问题是你看不见整座山的地形------大雾弥漫,你只能感知到自己脚下的那一小块区域。

你怎么下?

你用脚探一下脚下的坡度。哪个方向最陡?就往那个方向迈一步。到了新位置,再探一下,再迈一步。重复,直到你站的地方不再往下倾斜------那就是山脚了。

这个"探坡度"在数学里就是计算梯度。梯度是一个向量,它告诉你在当前点朝着哪个方向走,函数值上升得最快。你要下降,就朝反方向走。所以叫"梯度下降"。

每一步走多远,就是"学习率"在控制------步子太大可能跨过谷底,冲到对面的山坡;步子太小可能走很久都到不了。

这个比喻你肯定听过,但你未必想过它为什么这么贴切。因为深度学习的损失函数------那个你要最小化的目标------通常是一个极其复杂的高维曲面,复杂到没有人能画出它的全貌。你确实"看不见"全局。你只能通过梯度来感知脚下的局部地形。

三种走法:全量、随机和折中

梯度下降在实际使用中有三种常见的变体。它们的区别在于:每次迈步之前,你用多少数据来"探坡度"。

第一种叫批量梯度下降。每次都把全部训练数据拿来算梯度。精确,但慢。如果你的训练集有一百万张图片,那每走一步都要先算完这一百万张图片的梯度------代价太大了。而且它每次迈步的方向是"全局"的最陡方向,但全局最陡不一定比局部随机走法更快到达谷底。

第二种叫随机梯度下降。每次只随机挑一个样本来算梯度,然后迈一步。快,但是非常嘈杂。你每一步的方向都依赖那一个随机样本------它可能是个噪声很大的样本,把你带偏了。它的路径看起来像喝醉了酒的人下山,摇摇晃晃,但平均来说还是往下走的。

第三种叫小批量梯度下降。它是前两种的折中。每次随机挑一小批样本------通常几十到几百个------算它们的平均梯度,然后迈一步。这个做法既不像全量那么慢(每步只用几百个样本),又不像纯随机那么嘈杂(几百个样本的平均比单个样本稳定得多)。它成了深度学习里的默认选择。

所以你在任何深度学习的教程里看到"随机梯度下降"或者"SGD"的时候,它通常指的是小批量版本,而不是真正的纯随机。

学习率:步子多大才合适

学习率是深度学习里最难调的超参数之一。它决定了你每一步迈多大。

如果学习率太大,你可能会"跨过"谷底。在大雾中下山,一步迈出去两米,可能直接跨过了那个只有半米宽的最低点,冲到了对面的山坡上。更糟的是,如果步子太大,损失函数可能不降反升------你从山的一侧跨到了另一侧更高的地方。

如果学习率太小,你每一步都在极其精确地沿着山坡下滑,但问题是你可能需要走几千几万步才能到谷底。训练时间太长,而且可能陷在一个局部的浅坑里出不来------因为步子太小,跳不出那个浅坑。

所以学习率通常是一个先大后小的策略。在训练初期,离谷底很远,你可以走快一点。在训练后期,快到谷底了,步子得收窄,否则会震荡。

深度学习里有很多"自适应学习率"算法------Adam、RMSprop、Adagrad------它们会自动根据梯度的历史信息来调整每一步的学习率,省去了手动调参的麻烦。Adam是目前最常用的默认选择,在绝大多数问题上表现稳健,不需要你反复试验就能跑出不错的结果。

局部最小值的陷阱,以及我们为什么不太怕它了

刚才说的"浅坑",在深度学习里有一个专门的名字------局部最小值

如果你站在一个浅坑里,脚下的坡度是平的------你觉得你到了山脚。但实际上,旁边不远处还有一个更深的谷底,比你现在的位置低得多。在经典机器学习里,局部最小值是一个大问题。很多优化算法会卡在里面出不来。

但深度学习后来发现了一个奇怪的现象:在高维空间里,局部最小值可能没那么可怕。

如果你想一想就明白了。在二维平面上,你很容易被一个浅坑困住,因为往任何一个方向走都是上坡。但如果你的损失函数是一个几百万维的空间呢?你在一个点上的梯度为零------但它可能只是在某个维度上为零。在另外几万个维度上,它可能仍然是斜的,你可以沿着那些维度继续往下滑。

高维空间里的"鞍点"------就是在一个方向上是下坡、在另一个方向上是上坡的点------比真正的局部最小值多得多。而梯度下降在高维空间里通常能绕过鞍点,找到更低的区域。

所以今天深度学习界不太把"局部最小值"当作核心问题了。真正麻烦的是鞍点高原------那些梯度接近零、路又平又长、你走了很久损失都不怎么下降的区域。但在实践中,小批量随机梯度的噪声往往能把模型推出这些死水区。

从梯度下降到反向传播,只差一步

你现在已经理解了梯度下降的全部骨架。

它有一个目标(最小化损失函数),一个方向(梯度的反方向),一个步长(学习率),以及一种走法(小批量)。你只需要这三样东西,就能在任意可微的损失函数上跑优化。

而深度学习的全部训练过程,就是把"损失函数"换成"神经网络的输出和真实标签之间的误差",然后把链式法则从最后一层一层一层倒着传回第一层------算出每一个参数对损失的梯度,再用梯度下降去更新这些参数。

那个"倒着传"的过程,叫反向传播。它本质上就是一个高效的链式法则批量计算器。

下一章,我们搭第一个多层网络。它叫多层感知机。

参考文献

  1. Ruder, S. (2016). An Overview of Gradient Descent Optimization Algorithms. arXiv:1609.04747.

    • 推荐理由:这是一篇梯度下降的综述论文,覆盖了从批量/随机/小批量到Adam、RMSprop、Nesterov等所有主流优化算法。全文不到20页,大部分篇幅都在用直观语言解释每种算法的动机和优缺点。适合在读完本篇后作为拓展阅读。
  2. 3Blue1Brown. (2017). "Gradient descent, how neural networks learn | Chapter 2, Deep Learning". YouTube.

    • 推荐理由:这期视频用动画把"蒙着眼睛下山"的比喻完整呈现出来了------你会看到一个人站在三维地形上、每次探坡度、迈一步、再探、再迈,直到谷底。配合本篇阅读,文字的抽象描述和视频的动画会交叉印证,理解门槛大幅降低。
  3. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. 第8章"Optimization for Training Deep Models"。

    • 推荐理由:深度学习教材里最系统的优化章节。从梯度下降的基本算法开始,到学习率调度、动量方法、自适应算法,覆盖了全部重要内容。读这篇教材的时候,你会发现我们本章聊的"直觉"到了那里变成了完整的数学框架------前后对照,就能明白那些公式在说什么。
相关推荐
临风细雨1 小时前
从 Bun 的 Rust 重写,看 C# 如何重建 AI 基础设施层
人工智能·rust·c#
中微极客1 小时前
Seedance 2.5深度解析:30秒4K视频生成与50路多模态参考的工程实践
人工智能·音视频
weixin_446260851 小时前
SolarChain-Eval:面向去中心化能源市场的物理约束可信经济智能体评测基准
人工智能·去中心化·能源
齐昭王城1 小时前
PI0、PI0.5、PI0-FAST 原理讲解
人工智能·机器学习
deepdata_cn1 小时前
AI双向赋能:一边吃掉巨量电力,一边重构新型能源体系
人工智能·能源
aiqianji1 小时前
垂直专业的AI短篇小说写作软件有哪些特点?
人工智能·python
在书中成长2 小时前
HarmonyOS 小游戏《对战五子棋》开发第33篇 - AI异步落子与setTimeout
人工智能·harmonyos
2601_955759622 小时前
code0 gpt-image-2 场景相关:广告投放素材快速生成流程
人工智能·gpt
方华世界2 小时前
企业级Java AI Agent应用平台
java·开发语言·人工智能