跳到主要内容

训练一个模型只有一个动作:把每个旋钮朝「让结果好一点」的方向挪一丁点。 这一章讲清「哪个方向」这四个字怎么算。

蒙着眼睛下山

1. 这一章讲什么

三件事: 只有一个旋钮时怎么知道该往哪边挪;有几千亿个旋钮时同样的问题怎么答; 以及当「结果」是一串函数套一串函数算出来的时候,这个方向怎么一段一段拼出来。

它在全书链条里的位置: 这是让「学习」这件事在计算上成立的那一层。 第 05 章说清楚要最小化什么,第 11 章说清楚怎么在几千亿个旋钮上一次算完, 第 17 章说清楚怎么走得更快更稳——三章的数学都在这一章里。

只需要第 01 章。 全章从「站在山上蒙着眼睛下山」这一个画面出发,不需要学过微积分。

2. 顶层全景

一个旋钮 ──▶ 导数:脚下这一小步的坡度

一堆旋钮 ──▶ 梯度:每个旋钮各自的坡度,排成一串数,整体指向最陡的上坡

一串函数套着 ──▶ 链式法则:各段坡度乘起来

怎么走 ──▶ 梯度下降:朝梯度的反方向迈一小步,重复

┌───────────────┴───────────────┐
▼ ▼
地形好不好走 有没有绳子拴着
(凸 / 非凸 / 鞍点) (拉格朗日 / KKT)

一句话链条: 坡度告诉你往哪走 → 一堆旋钮就是一堆坡度 → 复合函数的坡度靠乘法拼 → 朝反方向迈小步 → 地形和约束决定这么走靠不靠谱。

3. 坡度:一个数说清「往哪边走」

先看现象: 你站在一座山上,浓雾里什么都看不见。要下山,你不需要看见全景, 只需要知道脚下这一小步,哪个方向更低

把这件事写成数学就是导数1:让变量——式子里那个可以自由取值的东西—— 动一丁点,函数值跟着变了多少, 两者相除,再让那个「一丁点」趋近于 0。几何上它就是曲线在那一点的切线斜率2

f(x) = x²

在 x = 3 处: x 增加 0.001,f 从 9 增加到 9.006001
变化之比 = 0.006001 / 0.001 = 6.001
让那一丁点趋近 0,得到导数 f'(3) = 6

导数为正,说明往右走函数值变大;为负,往右走变小;为 0,说明这一点是平的。 「往哪边走」就靠这个符号,「走多快」就靠这个大小。

上面式子里的 x 就是变量,被它决定的那个 f(x) 叫函数值。 训练时被挪的那些旋钮,在数学上就是变量。

还有一个衡量代价的说法也在这里定下来:复杂度说的是「问题规模变大时, 要做的计算跟着涨多快」。规模翻倍代价也翻倍是一种情形,规模翻倍代价翻四倍是另一种, 后者在旋钮上千亿时会直接把方案判死刑。

4. 多个旋钮一起拧

问题: 一个函数有 784 个自变量,「坡度」还是一个数吗?

不是。做法是:只动一个、把别的按住,得到那一个方向上的坡度。 这种「保持其他变量固定」的导数叫偏导数3。784 个变量就有 784 个偏导数。

把这 784 个数按顺序排成一串,就得到了整本书里最重要的那个东西:梯度

f(w₁, w₂) = w₁² + 3w₂

只动 w₁: ∂f/∂w₁ = 2w₁ 在 (2, 5) 处 = 4
只动 w₂: ∂f/∂w₂ = 3 在 (2, 5) 处 = 3

梯度 = [4, 3]

梯度有一条决定性的性质:它指向函数值增大最快的那个方向, 而它的反方向就是下降最快的方向。所以下山的走法只有一句话:朝梯度的反方向迈一步。

上面那个例子里,梯度 [4, 3] 的长度是 5(第 01 章那把 ℓ2 尺子)。 这个长度也有意义:它说明当前这一点有多陡。 越接近谷底,梯度越短。

5. 坡度自己的坡度

问题: 梯度为 0 的地方,是谷底吗?

不一定。梯度为 0 只说明「这一点是平的」,它可能是谷底、山顶,或者两者都不是。

要分辨,得看坡度自己的坡度——也就是对导数再求一次导。 多变量时,把所有「先对第 i 个变量求导、再对第 j 个变量求导」的结果排成一张方表, 这张表叫 Hessian 矩阵4

判据很干净56:

梯度 = 0,且 Hessian 半正定 ──▶ 这是一个谷底(局部最小)
梯度 = 0,且 Hessian 有正有负 ──▶ 这是一个鞍点

鞍点这个名字来自马鞍的形状:沿着马背方向看它是谷底,沿着两条腿方向看它是山顶。 一阶偏导数为 0 的点统称驻点,谷底、山顶和鞍点都算78

为什么现在就要说清鞍点? 因为第 17 章会给出一个很反直觉的结论: 在旋钮特别多的时候,梯度为 0 的地方更可能是鞍点而不是谷底—— 要成为谷底,得在所有几千亿个方向上同时朝上,这比在其中几个方向上朝下苛刻得多。

上面那些判据的来源是泰勒展开9:在一点附近,任何足够光滑的函数都能用 「函数值 + 一阶项 + 二阶项 + …」逐级近似。一阶项由梯度决定,二阶项由 Hessian 决定。 这本书后面每一次「在当前点附近做近似」,用的都是它。

6. 一串函数套一串函数怎么求导

先看现象: 网络有 50 层。第 50 层的输出依赖第 49 层,第 49 层依赖第 48 层…… 最后的那个数对第 1 层的某个旋钮的坡度,该怎么算?

答案是一条规则,叫链式法则10:把沿途每一段的坡度乘起来。

z = f(y), y = g(x)

dz/dx = (dz/dy) × (dy/dx)

例:z = y²,y = 3x + 1,在 x = 2 处
y = 7,dy/dx = 3,dz/dy = 2y = 14
dz/dx = 14 × 3 = 42

这条规则就是第 11 章那套办法的全部数学。 一层网络的坡度好算,五十层串起来 也就是五十个好算的东西乘起来。真正的技巧不在这条规则本身, 而在乘的顺序——从前往后乘和从后往前乘,代价差几个数量级。第 11 章会算这笔账。

一个必须先说清的重名(这是我们的裁决): 概率那边也有一条被叫作「链式法则」的规则,说的是「把一串事件同时发生的可能性 拆成一串条件概率相乘」。它和这里这条是两件不同的事。 本书里「链式法则」这个名字只指微积分这一条;概率那一条我们一律叫 「概率的乘法拆解」,在第 03 章讲。

7. 求导的对象是一串数,不是一个数

问题: 上面写的都是「一个数对一个数」。可网络里到处是「一个数对一串数」 「一串数对一串数」。这些写出来是什么形状?

这套记号叫矩阵微积分。它不是新数学,只是把一堆偏导数摆整齐的约定11。 麻烦在于:摆的方式有两种,而两种的结果互为转置。

标量 y 对 M 项的向量 x 求导:

分母布局(本书采用) ──▶ 结果是一个 M 项的列向量
分子布局 ──▶ 结果是一个 M 项的行向量

本书统一用分母布局12。这不是数学规定,是这本书自己的选择。 读别的资料时公式对不上、到处差一个转置,十有八九就是这里出的问题。

一串数对一串数求导,得到的是一张表:第 i 行第 j 列放「第 j 个输出对第 i 个输入的偏导」。 这张表叫雅可比矩阵(在本书的布局下是它的转置)13。 第 11 章讲反向传播、第 38 章讲密度怎么变,用的都是它。

还有两条在第 11 章会直接用上的具体结论:

一个只作用在单个数上的函数,逐项作用在一串数上时,它的导数是一个对角矩阵—— 对角线上是每一项各自的导数,别的位置全是 0。这正是第 01 章讲的那种「逐维缩放」。

多分类的那套标准配法(第 05 章讲),「差多远」对最后一层净输入的导数化简之后, 就是干干净净的「预测减真实14。这个结果是整个多分类训练最常用的起点。

8. 沿着负梯度走

8.1 一步一步试

有了梯度,下山的算法只有一行:当前位置减去一个小倍数乘以梯度,得到下一个位置,重复。 这个方法叫梯度下降,也叫最速下降15

θ ← θ − α · ∇f(θ)

每做一次这样的更新,叫一次迭代。

迭代就是「同一个动作反复做,每做一次结果更好一点」。 训练几万亿次,说的就是这个动作做了几万亿次。

8.2 每步迈多大:一个必须人来定的数

上面那个 α 叫学习率。它决定每一步迈多大。

它太大会怎样? 一步跨过谷底冲到对面山坡,下一步又冲回来,来回震荡甚至越走越高—— 书里的说法是「过大会导致发散」16太小又怎样? 走得对,但走得极慢。

学习率是全书第一个没法被梯度自己调好的数——因为它不在目标函数里。 第 17 章整章都在处理它:先热身再衰减、周期性地调大、给每个旋钮各配一个。

8.3 走到什么时候算走到了

一路走下去,函数值会越来越小。当它几乎不再下降时,我们说这个过程收敛—— 收敛就是「再走也没什么变化了」。

但收敛到哪儿是另一回事。它可能停在一个局部最优:在它附近所有点都不比它更低, 可换个山谷可能低得多17

真正处处最低的那个点,才叫全局最优

对一般的函数,梯度下降只保证走到局部最优,不保证全局最优。 这条限制会在第 17 章被重新讨论:高维空间里的实际情况,和这句话给人的印象很不一样。

8.4 它的两个毛病

一是靠近谷底会变慢。 越接近最低点梯度越短,步子跟着变小。

二是可能走成之字形。 山谷如果是一条狭长的沟,梯度方向几乎垂直于沟的走向, 于是来回横跳、迟迟不往前18。第 17 章的动量法就是冲着这一条来的。

有没有更聪明的走法? 有:牛顿法用 Hessian 刻画局部弯曲程度,在一定条件下收敛快得多。 但它每步都要处理那张几千亿乘几千亿的表,代价太高19所以深度学习几乎只用一阶方法——只用梯度,不碰二阶。

9. 什么样的地形才保证走得到底

问题: 什么时候「局部最优」就是「全局最优」?

答案是的时候。一个函数是凸的,直观说就是它的图像像一只朝上的碗: 在函数曲线上任取两点连一条线段,这条线段永远不会落到曲线下面20

凸函数上,任何一个局部最低点都是全局最低点。 这是一条极强的保证。 第 09 章那几个线性模型、第 06 章的线性回归,目标函数都是凸的,所以它们的解干净利落。

神经网络不是。 书里写得很直接:神经网络的目标函数是非凸的21。 所以从第 10 章往后,「找到最优解」这个说法就要换成「找到一个够好的解」。

10. 带绳子的下山

先看现象: 你要找山上最低的点,但被一根绳子拴着,只能在某条小路上活动。 这时梯度为 0 的地方未必是答案——答案可能就在绳子绷紧的地方。

处理办法叫拉格朗日乘数法22:把每条约束乘上一个新的未知数,加进目标函数里, 然后对所有变量(包括这些新未知数)一起求驻点。 它把一个「有约束的问题」变成了一个「变量更多、但没有约束的问题」。

不等式约束还多一层文章。最优解处必须同时满足五个条件,统称 KKT 条件23。 其中最要紧的一条叫互补松弛24:

对每一条不等式约束,下面两件事至少有一件成立:

① 这条约束没被顶到边界 ──▶ 它对应的那个乘数为 0,等于不存在
② 它对应的乘数大于 0 ──▶ 这条约束正好卡在边界上

这一条会在第 09 章直接兑现。 支持向量机(一种在两类样本之间画分界线的经典模型) 的解只依赖那几个「贴着边界」的样本, 其余样本一个都不影响结果——原因就是它们对应的乘数是 0,被互补松弛判成了「不存在」。

还有一个配套概念:把原问题换成它的对偶问题求解。对偶问题的最优值总不超过原问题 (弱对偶),两者相等时叫强对偶25。支持向量机满足强对偶,所以换过去解不亏。

11. 主走查:一个复合函数从头算到尾

输入: 书里那个例子,f(x; w, b) = 1 ÷ (exp(−(wx+b)) + 1),取 x = 1、w = 0、b = 026这三个数是原书给的,不是我们编的。

第一步:把它拆成六个基本操作,顺着算一遍(每条边上的数是那一步的实际取值):

第几步这一步算什么输入输出这一步的导数
h₁x × w1, 00∂h₁/∂w = x = 1
h₂h₁ + b0, 00∂h₂/∂h₁ = 1
h₃h₂ × (−1)00∂h₃/∂h₂ = −1
h₄exp(h₃)01∂h₄/∂h₃ = exp(h₃) = 1
h₅h₄ + 112∂h₅/∂h₄ = 1
h₆1 ÷ h₅20.5∂h₆/∂h₅ = −1/h₅² = −0.25

输出 f = 0.5。

第二步:把这些坡度按链式法则乘起来,求 f 对 w 的坡度。

∂f/∂w = (∂f/∂h₆)·(∂h₆/∂h₅)·(∂h₅/∂h₄)·(∂h₄/∂h₃)·(∂h₃/∂h₂)·(∂h₂/∂h₁)·(∂h₁/∂w)
= 1 × −0.25 × 1 × 1 × −1 × 1 × 1
= 0.25

第三步:同一条链,两种乘的顺序,结果必须一样。

顺序怎么走中间值
从前往后先算 ∂h₁/∂w = 1,再一段段往前推1 → 1 → −1 → −1 → −1 → 0.25
从后往前先算 ∂f/∂h₆ = 1,再一段段往后退1 → −0.25 → −0.25 → −0.25 → 0.25 → 0.25

两条路都得到 0.25。 但代价完全不同: 从前往后,每多一个要求导的旋钮就要重走一遍; 从后往前,走一遍就把所有旋钮的坡度全带出来了27

这就是为什么深度学习只用从后往前那一种。 因为训练时输入端有几千亿个旋钮, 输出端只有一个数(那个「差多远」)。第 11 章会把这笔账算到底。

顺带看看那条被否决的路: 不用链式法则,直接给每个旋钮加一个小扰动、 看输出变了多少——这叫数值微分。它的时间复杂度——也就是算完要花多少次计算—— 是平方级的28: 一次正向传播本身的代价就正比于旋钮数,而每个旋钮都要单独来一次。 几千亿个旋钮,平方之后这个数没有任何意义。

12. 作者的判断与证据

书里给了证明的:

  • 局部最小解的一阶必要条件(梯度必为 0)5与二阶必要条件(Hessian 半正定)6 —— 书里给了完整证明,都是从泰勒展开两行推出来的;
  • 梯度下降每步下降的理由15 —— 同样从泰勒一阶展开直接读出来;
  • 对偶函数是原问题最优值的下界25 —— 书里给了三行推导。

书里明确说是约定的:

  • 分母布局12 —— 边注写着「除特别说明外,本书默认采用分母布局」。这是记号选择,不是定理。

书里坦白的:

  • 拉格朗日乘数法得到的驻点「会包含原问题的所有最小解,但并不保证每个驻点都是最小解」—— 所以实际用的时候还要自己验;
  • KKT 条件作为必要条件「还需要一定的正则性条件」,只有在凸问题并满足适当条件时才是充分的。 书里没有回避这个「适当条件」的模糊,但也没有展开。

13. 边界与局限

不讲极限与连续性的严格定义。 导数是用极限定义的,而极限本身书里没讲,默认读者接受。

不讲积分的应用。 附录里给了定积分、黎曼和的定义,但正文里积分几乎只以「对连续变量 求平均」的形式出现,在第 03 章会就地解释。

不讲数值优化的工程细节。 线搜索怎么定步长、置信域方法怎么做,书里明说「本书中只介绍梯度下降法」。

牛顿法只提了名字。 拟牛顿法、共轭梯度这些实际会用到的二阶近似方法,一概不展开。

离散优化只给了分类。 组合优化、整数规划各一段,给的是「这类问题很难」这个印象,不给算法。

14. 可带走的

  1. 导数就是脚下这一小步的坡度。 正负决定往哪边走,大小决定这一点有多陡;
  2. 梯度是把所有旋钮各自的坡度排成一串数,它指向上升最快的方向,反方向就是下降最快的方向;
  3. 梯度为 0 不等于到了谷底。 还要看二阶:半正定才是谷底,有正有负就是鞍点;
  4. 链式法则:一串函数套着,坡度就是各段坡度乘起来。 这是第 11 章那套办法的全部数学;
  5. 乘的顺序决定代价。 输入多、输出少时,从后往前走一遍就够;从前往后要为每个旋钮重走一遍;
  6. 别的资料公式对不上,先查布局约定。 本书用分母布局,换个约定所有式子都差一个转置;
  7. 学习率太大会发散,太小会极慢,而且它没法靠梯度自己调好——它不在目标函数里;
  8. 凸函数上局部最低就是全局最低。神经网络不是凸的,所以目标从「最优解」降级成「够好的解」;
  9. 有约束时用拉格朗日乘数法:把约束乘个新未知数加进目标,问题就变回无约束的;
  10. 互补松弛说:没顶到边界的约束等于不存在。 第 09 章支持向量机「只看贴边样本」就是这条的直接后果。

15. 原文地图

主题原书章原文位置
导数与几何意义附录 B 微积分text/18-apx.txt:459(搜「微积分学中重要的基础概念」) · text/18-apx.txt:469(搜「切线斜率」)
偏导数附录 B 微积分text/18-apx.txt:506(搜「保持其他变量固定」)
泰勒公式附录 B 微积分text/18-apx.txt:524(搜「泰勒公式」)
矩阵微积分与布局附录 B 微积分text/18-apx.txt:598(搜「矩阵和向量表示因变量」) · text/18-apx.txt:602(搜「Denominator Layout」)
雅可比矩阵与 Hessian附录 B 微积分text/18-apx.txt:639(搜「雅可比矩阵」) · text/18-apx.txt:652(搜「Hessian 矩阵」)
链式法则附录 B 微积分text/18-apx.txt:689(搜「求复合函数导数」)
Softmax 与交叉熵的梯度附录 B 微积分text/18-apx.txt:851(搜「多分类模型输出层最常见的梯度形式」)
局部最小解与驻点附录 C 数学优化text/18-apx.txt:933(搜「局部最小值」) · text/18-apx.txt:965(搜「驻点」) · text/18-apx.txt:968(搜「沿某些方向看是极小」)
一阶与二阶必要条件附录 C 数学优化text/18-apx.txt:950(搜「一阶必要条件」) · text/18-apx.txt:972(搜「二阶必要条件」)
梯度下降与步长附录 C 数学优化text/18-apx.txt:986(搜「最速下降法」) · text/18-apx.txt:1006(搜「过大会导致发散」) · text/18-apx.txt:1014(搜「之字形」)
凸优化附录 C 数学优化text/18-apx.txt:913(搜「凸优化」)
拉格朗日乘数法与 KKT附录 C 数学优化text/18-apx.txt:1038(搜「拉格朗日乘数法」) · text/18-apx.txt:1143(搜「称为不等式约束优化问题」) · text/18-apx.txt:1146(搜「互补松弛」)
弱对偶与强对偶附录 C 数学优化text/18-apx.txt:1130(搜「强对偶性」)
计算图与两种模式第4章 前馈神经网络text/05-ch04.txt:606(搜「的计算图」) · text/05-ch04.txt:673(搜「相同方向来递归地计算梯度」) · text/05-ch04.txt:718(搜「输出维度较小的情形」)
数值微分的代价第4章 前馈神经网络text/05-ch04.txt:554(搜「总体时间复杂度」)
神经网络的非凸性第4章 前馈神经网络text/05-ch04.txt:768(搜「神经网络的优化问题通常是一个非凸优化问题」)

Footnotes

  1. 出处:「附录 数学基础」第 459 段(text/18-apx.txt:459,搜「微积分学中重要的基础概念」)。

  2. 出处:「附录 数学基础」第 469 段(text/18-apx.txt:469,搜「切线斜率」)。

  3. 出处:「附录 数学基础」第 506 段(text/18-apx.txt:506,搜「保持其他变量固定」)。

  4. 出处:「附录 数学基础」第 652 段(text/18-apx.txt:652,搜「Hessian 矩阵」)。 原书也把它写作 ∇²f(x)。

  5. 出处:「附录 数学基础」第 950 段(text/18-apx.txt:950,搜「一阶必要条件」)。 定理 C.1:如果 x* 为局部最小解并且函数 f 在其邻域内一阶可微,则梯度为 0。 2

  6. 出处:「附录 数学基础」第 972 段(text/18-apx.txt:972,搜「二阶必要条件」)。 定理 C.2 还要求 Hessian 矩阵为半正定。 2

  7. 出处:「附录 数学基础」第 965 段(text/18-apx.txt:965,搜「驻点」)。

  8. 出处:「附录 数学基础」第 968 段(text/18-apx.txt:968,搜「沿某些方向看是极小」)。 原书还提醒:高维非凸优化里「不能简单地把训练困难只归因于局部极小」。

  9. 出处:「附录 数学基础」第 524 段(text/18-apx.txt:524,搜「泰勒公式」)。

  10. 出处:「附录 数学基础」第 689 段(text/18-apx.txt:689,搜「求复合函数导数」)。

  11. 出处:「附录 数学基础」第 598 段(text/18-apx.txt:598,搜「矩阵和向量表示因变量」)。 原书写明矩阵微积分是「多元微积分的一种记号体系」。

  12. 出处:「附录 数学基础」第 602 段(text/18-apx.txt:602,搜「Denominator Layout」)。 边注写着「除特别说明外,本书默认采用分母布局」——这是本书的记号选择。 2

  13. 出处:「附录 数学基础」第 639 段(text/18-apx.txt:639,搜「雅可比矩阵」)。 原书边注提醒:雅可比矩阵通常采用分子布局,和正文的分母布局互为转置。

  14. 出处:「附录 数学基础」第 851 段(text/18-apx.txt:851,搜「多分类模型输出层最常见的梯度形式」)。 原书还说明:标签不是 one-hot 而是软标签时,这个梯度形式仍然成立。

  15. 出处:「附录 数学基础」第 986 段(text/18-apx.txt:986,搜「最速下降法」)。 2

  16. 出处:「附录 数学基础」第 1006 段(text/18-apx.txt:1006,搜「过大会导致发散」)。

  17. 出处:「附录 数学基础」第 933 段(text/18-apx.txt:933,搜「局部最小值」)。

  18. 出处:「附录 数学基础」第 1014 段(text/18-apx.txt:1014,搜「之字形」)。

  19. 出处:「附录 数学基础」第 1015 段(text/18-apx.txt:1015,搜「牛顿法利用 Hessian 矩阵刻画局部曲率」)。 原书写明它「在一定条件下具有局部二次收敛速度,但每次迭代需要计算或近似求解 Hessian 矩阵相关的线性系统,复杂度较高」。

  20. 出处:「附录 数学基础」第 913 段(text/18-apx.txt:913,搜「凸优化」)。 原书给出凸集与凸函数的定义,并指出有约束时还要求等式约束为线性、不等式约束为凸。

  21. 出处:「第4章 前馈神经网络」第 768 段(text/05-ch04.txt:768,搜「神经网络的优化问题通常是一个非凸优化问题」)。 原书用一个 1-1-1 结构的两层网络画出了损失曲面,两种损失函数都是非凸的。

  22. 出处:「附录 数学基础」第 1038 段(text/18-apx.txt:1038,搜「拉格朗日乘数法」)。

  23. 出处:「附录 数学基础」第 1143 段(text/18-apx.txt:1143,搜「称为不等式约束优化问题」)。

  24. 出处:「附录 数学基础」第 1146 段(text/18-apx.txt:1146,搜「互补松弛」)。 原书还提醒:处于边界上的约束也可能对应乘数为 0,这类约束不一定真正影响最优性。

  25. 出处:「附录 数学基础」第 1130 段(text/18-apx.txt:1130,搜「强对偶性」)。 2

  26. 出处:「第4章 前馈神经网络」第 606 段(text/05-ch04.txt:606,搜「的计算图」)。 原书图 4.3 给出了这个复合函数在 x=1, w=0, b=0 时的计算图,边上标着每个变量的实际取值。

  27. 出处:「第4章 前馈神经网络」第 718 段(text/05-ch04.txt:718,搜「输出维度较小的情形」)。 原文:「前向模式更适合输入维度较小、输出维度较大的情形;反向模式更适合输入维度很高、 输出维度较小的情形。」

  28. 出处:「第4章 前馈神经网络」第 554 段(text/05-ch04.txt:554,搜「总体时间复杂度」)。