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

发布时间:2026/7/12 1:00:11
第16章:下山,先学会怎么迈步——梯度下降 经典机器学习部分结束了。你手里现在有函数、向量、矩阵、导数、概率、熵有线性回归、逻辑回归、SVM、决策树和随机森林还有过拟合、欠拟合和验证集。按道理我们已经可以进入深度学习了。但在走进多层神经网络之前还有一个环节必须单独拎出来讲。你回想一下线性回归那一章。我们是怎么找到“最好的那条线”的我说了一句“计算误差平方和对w和b的偏导数然后反复朝下降最快的方向挪动”——一笔带过了。在逻辑回归那一章我又说了一句“用交叉熵作为损失函数然后用梯度下降来优化”——又一笔带过了。现在到了深度学习不能再一笔带过了。因为深层网络动辄几百万、几十亿个参数它唯一能用的优化方法就是梯度下降——而且每次训练都得跑几万步、几十万步。你如果不理解梯度下降的直觉、变体和陷阱就看不明白深度学习训练过程里那些“为什么会这样”的问题。所以这一章我们专门聊梯度下降。蒙着眼睛下山先给你一个经典的比喻你大概已经听过了——蒙着眼睛下山。你站在一座山的山顶。脚下是连绵起伏的地形。你的目标是下到山谷的最低点。但问题是你看不见整座山的地形——大雾弥漫你只能感知到自己脚下的那一小块区域。你怎么下你用脚探一下脚下的坡度。哪个方向最陡就往那个方向迈一步。到了新位置再探一下再迈一步。重复直到你站的地方不再往下倾斜——那就是山脚了。这个“探坡度”在数学里就是计算梯度。梯度是一个向量它告诉你在当前点朝着哪个方向走函数值上升得最快。你要下降就朝反方向走。所以叫“梯度下降”。每一步走多远就是“学习率”在控制——步子太大可能跨过谷底冲到对面的山坡步子太小可能走很久都到不了。这个比喻你肯定听过但你未必想过它为什么这么贴切。因为深度学习的损失函数——那个你要最小化的目标——通常是一个极其复杂的高维曲面复杂到没有人能画出它的全貌。你确实“看不见”全局。你只能通过梯度来感知脚下的局部地形。三种走法全量、随机和折中梯度下降在实际使用中有三种常见的变体。它们的区别在于每次迈步之前你用多少数据来“探坡度”。第一种叫批量梯度下降。每次都把全部训练数据拿来算梯度。精确但慢。如果你的训练集有一百万张图片那每走一步都要先算完这一百万张图片的梯度——代价太大了。而且它每次迈步的方向是“全局”的最陡方向但全局最陡不一定比局部随机走法更快到达谷底。第二种叫随机梯度下降。每次只随机挑一个样本来算梯度然后迈一步。快但是非常嘈杂。你每一步的方向都依赖那一个随机样本——它可能是个噪声很大的样本把你带偏了。它的路径看起来像喝醉了酒的人下山摇摇晃晃但平均来说还是往下走的。第三种叫小批量梯度下降。它是前两种的折中。每次随机挑一小批样本——通常几十到几百个——算它们的平均梯度然后迈一步。这个做法既不像全量那么慢每步只用几百个样本又不像纯随机那么嘈杂几百个样本的平均比单个样本稳定得多。它成了深度学习里的默认选择。所以你在任何深度学习的教程里看到“随机梯度下降”或者“SGD”的时候它通常指的是小批量版本而不是真正的纯随机。学习率步子多大才合适学习率是深度学习里最难调的超参数之一。它决定了你每一步迈多大。如果学习率太大你可能会“跨过”谷底。在大雾中下山一步迈出去两米可能直接跨过了那个只有半米宽的最低点冲到了对面的山坡上。更糟的是如果步子太大损失函数可能不降反升——你从山的一侧跨到了另一侧更高的地方。如果学习率太小你每一步都在极其精确地沿着山坡下滑但问题是你可能需要走几千几万步才能到谷底。训练时间太长而且可能陷在一个局部的浅坑里出不来——因为步子太小跳不出那个浅坑。所以学习率通常是一个先大后小的策略。在训练初期离谷底很远你可以走快一点。在训练后期快到谷底了步子得收窄否则会震荡。深度学习里有很多“自适应学习率”算法——Adam、RMSprop、Adagrad——它们会自动根据梯度的历史信息来调整每一步的学习率省去了手动调参的麻烦。Adam是目前最常用的默认选择在绝大多数问题上表现稳健不需要你反复试验就能跑出不错的结果。局部最小值的陷阱以及我们为什么不太怕它了刚才说的“浅坑”在深度学习里有一个专门的名字——局部最小值。如果你站在一个浅坑里脚下的坡度是平的——你觉得你到了山脚。但实际上旁边不远处还有一个更深的谷底比你现在的位置低得多。在经典机器学习里局部最小值是一个大问题。很多优化算法会卡在里面出不来。但深度学习后来发现了一个奇怪的现象在高维空间里局部最小值可能没那么可怕。如果你想一想就明白了。在二维平面上你很容易被一个浅坑困住因为往任何一个方向走都是上坡。但如果你的损失函数是一个几百万维的空间呢你在一个点上的梯度为零——但它可能只是在某个维度上为零。在另外几万个维度上它可能仍然是斜的你可以沿着那些维度继续往下滑。高维空间里的“鞍点”——就是在一个方向上是下坡、在另一个方向上是上坡的点——比真正的局部最小值多得多。而梯度下降在高维空间里通常能绕过鞍点找到更低的区域。所以今天深度学习界不太把“局部最小值”当作核心问题了。真正麻烦的是鞍点和高原——那些梯度接近零、路又平又长、你走了很久损失都不怎么下降的区域。但在实践中小批量随机梯度的噪声往往能把模型推出这些死水区。从梯度下降到反向传播只差一步你现在已经理解了梯度下降的全部骨架。它有一个目标最小化损失函数一个方向梯度的反方向一个步长学习率以及一种走法小批量。你只需要这三样东西就能在任意可微的损失函数上跑优化。而深度学习的全部训练过程就是把“损失函数”换成“神经网络的输出和真实标签之间的误差”然后把链式法则从最后一层一层一层倒着传回第一层——算出每一个参数对损失的梯度再用梯度下降去更新这些参数。那个“倒着传”的过程叫反向传播。它本质上就是一个高效的链式法则批量计算器。下一章我们搭第一个多层网络。它叫多层感知机。参考文献Ruder, S. (2016). An Overview of Gradient Descent Optimization Algorithms. arXiv:1609.04747.推荐理由这是一篇梯度下降的综述论文覆盖了从批量/随机/小批量到Adam、RMSprop、Nesterov等所有主流优化算法。全文不到20页大部分篇幅都在用直观语言解释每种算法的动机和优缺点。适合在读完本篇后作为拓展阅读。3Blue1Brown. (2017). “Gradient descent, how neural networks learn | Chapter 2, Deep Learning”. YouTube.推荐理由这期视频用动画把“蒙着眼睛下山”的比喻完整呈现出来了——你会看到一个人站在三维地形上、每次探坡度、迈一步、再探、再迈直到谷底。配合本篇阅读文字的抽象描述和视频的动画会交叉印证理解门槛大幅降低。Goodfellow, I., Bengio, Y., Courville, A. (2016).Deep Learning. MIT Press. 第8章Optimization for Training Deep Models。推荐理由深度学习教材里最系统的优化章节。从梯度下降的基本算法开始到学习率调度、动量方法、自适应算法覆盖了全部重要内容。读这篇教材的时候你会发现我们本章聊的“直觉”到了那里变成了完整的数学框架——前后对照就能明白那些公式在说什么。