跳转至

讲解稿 · 第 03 章 第 01 节:微分学

口播时长:约 15–20 分钟|建议语速:中速偏慢,公式处停顿两拍|字数:约 4100 字


开场钩子(约 90 秒)

先请你做一件事。

想象你现在坐在一辆车上,副驾的老王一直在看速度表。你瞄了一眼:60 km/h。你心里清楚,这个 60 不是"从家里出发到现在"的平均速度——你在城区堵过 20 分钟、高速上飙过 110。这个 60 是此时此刻你的瞬时速度。

再具体一点。假设这辆车的位置随时间变化服从 \(s(t) = 4t^2\) 米。问一句:开车第 3 秒的瞬间速度是多少?严格说,"第 3 秒的瞬间速度"不是一个能直接代入的东西——速度是位置变化多快的度量,而你只有第 3 秒这一瞬间,没动。

这就出现了一个悖论:没有变化,怎么测变化率?

解法是这样的:我们先算 3 秒到 3.001 秒之间走了多少米——这是平均速度。再让那个时间窗口一缩再缩,从 0.001 秒缩到 0.0001 秒,再缩到 0.00001 秒。当窗口无限趋近于 0,平均速度就会趋近于一个定值——这就是瞬时速度。数学里,我们管这个"无穷趋近的过程"叫极限 (limit),而最后趋近到的那个数,叫导数 (derivative)。

好,今天这一节,我们就要讲清楚这两个东西,并且把它们一路用到链式法则——这是后面反向传播(backpropagation)的数学地基。


复习昨日 & 今日路线(约 40 秒)

上一章我们玩了整整两章线性代数:从向量空间到矩阵类型,从矩阵运算到矩阵分解。Ch02 §04 我们还专门讲了"线性映射 = 矩阵"这件事。今天你会看到,导数——dy = f'(x)·dx 这个式子——在 Ch02 的框架下,其实就是一个 1×1 矩阵作用在 \(dx\) 上。换句话说,求导就是线性化。

下一节是积分学——问的是相反的问题:"累积了多少"。微分问的是此刻多快,积分问的是总共多少。两者最终会在微积分基本定理里合体,那是数学史上最美的定理之一——但那是后话。


核心概念一:极限 —— 微积分的入场券(约 3 分钟)

极限是微积分的地基。地基不牢,上面的所有东西都是空中的楼阁。

什么是极限?当函数的输入越来越接近某个目标值时,函数的输出趋近于哪个数。注意,是"趋近",不必真的取到。

\[\lim_{x \to a} f(x) = L\]

读作:"当 \(x\) 趋近于 \(a\) 时,\(f(x)\) 趋近于 \(L\)"。

这个概念被发明出来,就是因为有些点算不出函数值。看这个:

\[f(x) = \frac{x^2 - 1}{x - 1}\]

你直接代入 \(x = 1\),得到 \(\frac{0}{0}\)——未定义。但你试试接近 1 的值:\(f(0.9) = 1.9\),\(f(0.99) = 1.99\),\(f(1.01) = 2.01\),\(f(1.001) = 2.001\)。输出明显在朝 2 靠拢。

代数上看更清楚:分子因式分解为 \((x-1)(x+1)\),约掉 \((x-1)\),对所有 \(x \ne 1\) 都得到 \(f(x) = x + 1\)。所以 \(x \to 1\) 时,\(f(x) \to 2\)。这个函数在 \(x = 1\) 那里有个"洞"——图像上画出来是一个空心圆——但极限依然存在。

⚠️ 这里容易踩坑:极限只看"邻近值",不看"代入值"。分子分母同时为 0 的不定型不等于极限不存在。


核心概念二:ε-δ 定义 —— 把"无限趋近"写严格(约 3 分钟)

刚才我们用"接近 1 的值"那种直觉描述极限。在 19 世纪,柯西和魏尔斯特拉斯把它形式化了,写成了一句精确的话,叫ε-δ 定义。

符号首现: - \(\varepsilon\) (epsilon) — 任意给定的精度阈值,你提多小都行,比如 0.01、0.0001、\(10^{-100}\)。 - \(\delta\) (delta) — 要找到的邻域半径,只要 \(x\) 进入 \(a\) 周围这个半径内,\(f(x)\) 就能落到 \(L\) 周围那个 \(\varepsilon\) 半径内。

\(\displaystyle \lim_{x \to a} f(x) = L\) 的严格定义是:

对任意 \(\varepsilon > 0\),存在 \(\delta > 0\),使得当 \(0 < |x - a| < \delta\) 时,必有 \(|f(x) - L| < \varepsilon\)。

第一次看这段话你可能会懵。我用人话翻译一遍:你说要多准,我都能找到办法做到那么准。你说的精度(\(\varepsilon\))是 0.01,我就能找到一个距离(\(\delta\)),只要 \(x\) 离 \(a\) 不超过 \(\delta\),\(f(x)\) 离 \(L\) 就不超过 0.01。你说精度要 \(10^{-100}\),我照样能找到对应的 \(\delta\)。

下面我陪你走一个具体例——这是 Ch03 第一个完整 ε-δ 证明。

例 1:证明 \(\displaystyle \lim_{x \to 0} x^2 = 0\)。

证明的目标是:对任意 \(\varepsilon > 0\),存在 \(\delta > 0\),使 \(|x| < \delta\) 时 \(|x^2| < \varepsilon\)。

解法是倒推法。你想让 \(|x^2| < \varepsilon\),等价于 \(|x| < \sqrt{\varepsilon}\)。所以取 \(\delta = \sqrt{\varepsilon}\),就完成了。具体写:

Step 1:任给 \(\varepsilon > 0\),取 \(\delta = \sqrt{\varepsilon}\)。 Step 2:若 \(|x| < \delta\),则 \(|x^2| = |x|^2 < \delta^2 = (\sqrt{\varepsilon})^2 = \varepsilon\)。 Step 3:故对任意 \(\varepsilon > 0\) 都找到 \(\delta = \sqrt{\varepsilon}\),结论成立。\(\blacksquare\)

验算✓:取 \(\varepsilon = 0.01\),则 \(\delta = 0.1\)。只要 \(|x| < 0.1\),就有 \(|x^2| < 0.01\)。\(x = 0.05\) 时 \(x^2 = 0.0025 < 0.01\) ✓;\(x = 0.099\) 时 \(x^2 = 0.0098 < 0.01\) ✓。边界 \(x = 0.1\) 时 \(x^2 = 0.01\) 严格等于 \(\varepsilon\),符合"必小于"边界要求。


核心概念三:无穷小与极限的反直觉性(约 2 分钟)

极限这门语言的本质是无穷小 (infinitesimal)——一个无限趋近于 0 但永远不为 0 的量。微积分历史上因为这个东西吵了几百年,莱布尼茨把它当作"幽灵般的存在",贝克莱大主教嘲笑它是"已消失的量的鬼魂"。一直到 1870 年代,魏尔斯特拉斯用 ε-δ 把无穷小彻底赶出了定义——极限里不再出现具体的无穷小量,只有"任意小的精度"和"存在的半径"。

但无穷小这个直觉留下来了,它是我们理解"瞬时变化率"的桥梁。后面 Ch06 测度论里会用更现代的方式(Robinson 非标准分析)把无穷小正式迎回来。

下面再看一个反向例子——这次极限不存在。

例 2:证明 \(\displaystyle \lim_{x \to 0} \frac{1}{x}\) 不存在。

直觉告诉你:当 \(x\) 从右侧(\(x > 0\))趋近于 0,\(1/x\) 朝 \(+\infty\) 跑;当 \(x\) 从左侧(\(x < 0\))趋近于 0,\(1/x\) 朝 \(-\infty\) 跑。左右两边去往不同方向,所以极限不存在。我们用 ε-δ 严格写:

反证:若极限存在设为 \(L\),取 \(\varepsilon = 1\)。则需找到 \(\delta > 0\),使 \(0 < |x| < \delta\) 时 \(|1/x - L| < 1\)。但 \(1/x\) 在 \((-\delta, 0) \cup (0, \delta)\) 上的取值范围是 \((-\infty, -1/\delta) \cup (1/\delta, +\infty)\),这是一个无界集合,不可能被 \(|y - L| < 1\) 这个固定区间覆盖。矛盾。故极限不存在。\(\blacksquare\)

这个例子的工程意义是:神经网络里的梯度爆炸(gradient explosion)现象,本质上就是 \(1/x\) 在 0 附近这种"无界"行为——参数更新步长太大导致损失函数跳到极大值。

⏸️ 暂停思考 · 第一次

想一分钟:\(\displaystyle \lim_{x \to 0} \frac{\sin x}{x}\) 是什么?你已经知道答案(这是 1),但你能用 ε-δ 写出证明吗?提示:你需要先证 \(|\sin x| \le |x|\)(几何上从单位圆上看),再用夹逼。

——下一节洛必达法则时我们还会回来。今天你只需要知道:答案 1 是对的,严格证明需要夹逼,是分析学的练习题。


核心概念四:导数 —— 瞬时变化率的严格定义(约 3 分钟)

有了极限,我们就能写导数了。

\(f(x)\) 在 \(x = a\) 处的导数 (derivative),定义为:

\[f'(a) = \lim_{h \to 0} \frac{f(a + h) - f(a)}{h}\]

分子 \(f(a+h) - f(a)\) 是输出的变化量,分母 \(h\) 是输入的变化量。比值 \(\frac{\Delta y}{\Delta h}\) 是这一小段区间内的平均变化率。让 \(h \to 0\),这个平均变化率就变成瞬时变化率。

几何上,导数就是曲线在那个点的切线斜率。要算斜率,我们在曲线上取两个点,求它们连线(割线,secant line)的斜率,然后让第二个点一点点向第一个点靠近,看割线斜率趋近什么——这就是差商 (difference quotient) 的几何意义。

下面是一个完整手算例子。

例:求 \(f(x) = x^2\) 在 \(x = 3\) 处的导数。

Step 1:写出差商。 $\(\frac{f(3+h) - f(3)}{h} = \frac{(3+h)^2 - 9}{h}\)$

Step 2:展开分子。 $\(\frac{9 + 6h + h^2 - 9}{h} = \frac{6h + h^2}{h}\)$

Step 3:约分。 $\(= 6 + h\)$

Step 4:取极限 \(h \to 0\)。 $\(\lim_{h \to 0} (6 + h) = 6\)$

所以 \(f'(3) = 6\)。这意味着在 \(x = 3\) 这一点,\(x^2\) 正在以"输入每加 1,输出加 6"的速度增长。

与 Ch02 §04 的概念桥:\(dy = f'(x) \cdot dx\) 这个微分式,在 Ch02 框架下就是 1×1 矩阵乘法。导数 \(f'(x)\) 是输入空间 \(\mathbb{R}\) 到输出空间 \(\mathbb{R}\) 的一个线性映射,而一切从 \(\mathbb{R}\) 到 \(\mathbb{R}\) 的线性映射都形如 \(y = kx\)——一个数就够了。所以"求导"在本质上是把一个非线性映射在局部"线性化",这也是为什么泰勒展开的第一项就叫"线性近似"。

⚠️ 易错点:可微 (differentiable) 要求极限存在。如果函数在那里有尖角(绝对值 \(|x|\) 在 \(x=0\) 处),从左边和右边算出来的差商不同,极限就不存在,不可微。


核心概念五:求导法则 —— 不靠极限也能算(约 3 分钟)

每次都从极限定义硬算,累不累?当然累。所以前人整理了一组求导法则,让我们对几乎所有函数都能秒算。

法则 1 · 常数法则:常数的导数是零。\(f(x) = 5\),\(f'(x) = 0\)。水平线的斜率为零。直观:常数从不变。

法则 2 · 幂法则:求导主力。

\[\frac{d}{dx} x^n = n x^{n-1}\]

数字例:\(\frac{d}{dx} x^3 = 3x^2\),三次变二次。对任意实数指数都成立,包括负数和分数:\(\frac{d}{dx} x^{-1} = -x^{-2}\),\(\frac{d}{dx} \sqrt{x} = \frac{d}{dx} x^{1/2} = \frac{1}{2} x^{-1/2}\)。

法则 3 · 和差法则:逐项求导。 $\(\frac{d}{dx}[f(x) \pm g(x)] = f'(x) \pm g'(x)\)$

法则 4 · 乘积法则:两个函数相乘,导数不是导数的乘积。正确公式是:

\[\frac{d}{dx}[f(x) g(x)] = f'(x) g(x) + f(x) g'(x\]

记忆口诀:"左导右不导,加右导左不导"——第一个的变化率乘第二个的本身,加上第一个的本身乘第二个的变化率。

数字例:\(\frac{d}{dx}[x^2 \sin x] = 2x \sin x + x^2 \cos x\)。\(\checkmark\)

法则 5 · 商法则: $\(\frac{d}{dx}\left[\frac{f(x)}{g(x)}\right] = \frac{f'(x)g(x) - f(x)g'(x)}{[g(x)]^2}\)$

口诀:"下导上减上导下,除以下的平方"。英文里 "low d-high minus high d-low, over the square of what's below"。


核心概念六:链式法则 —— 反向传播的地基(约 3.5 分钟)

这一条,是 ML 整条通路的地基。

链式法则 (chain rule):当函数被复合起来(一个套在另一个里面),导数就是这条链上各层导数的乘积:

\[\frac{d}{dx} f(g(x)) = f'(g(x)) \cdot g'(x\]

直觉:剥洋葱。先对外层函数求导(保持内层函数不动),再乘上内层函数的导数。

数字例:求 \(\frac{d}{dx} (3x + 1)^5\)。

外层是 \((\cdot)^5\),内层是 \(3x + 1\)。

Step 1:外层求导,\((u)^5 \to 5u^4\),把内层 \(u = 3x+1\) 整体代回去。 Step 2:得 \(5(3x+1)^4\)。 Step 3:再乘内层的导数 \(\frac{d}{dx}(3x+1) = 3\)。 Step 4:合并得 \(5(3x+1)^4 \cdot 3 = 15(3x+1)^4\)。

验算✓:展开 \((3x+1)^5\) 太烦,我们用 \(u = 3x+1\) 反向验证:\(\frac{du}{dx} = 3\),\(\frac{d}{du}u^5 = 5u^4\),乘起来正好。

单变量 → 多变量 → 矩阵的三步递进——这是 Ch03 §03 的预告,先在这里打个底。

阶段 函数形态 求导结果
单变量 \(y = f(g(x))\) \(\frac{dy}{dx} = f'(g(x)) \cdot g'(x)\)
多变量 \(y = f(g_1(x), g_2(x))\) \(\frac{dy}{dx} = \frac{\partial f}{\partial g_1} \cdot \frac{dg_1}{dx} + \frac{\partial f}{\partial g_2} \cdot \frac{dg_2}{dx}\)
矩阵 \(\mathbf{y} = f(G(\mathbf{x}))\) \(J_y = J_f \cdot J_G\)(Jacobian 矩阵乘法)

回引 Ch02 §04 · 第一处:最后一行的 Jacobian @ Jacobian = 复合函数雅可比。这是 Ch02 矩阵乘法的 Ch03 应用。一句话——链式法则 = 矩阵乘法在导数世界的化身。

工程意义:一个深度神经网络 = 一长串复合函数。损失对每个权重的导数,就是从输出反着往输入方向,把每层的 Jacobian 乘起来。这正是反向传播干的事。


核心概念七:常见导数 + 洛必达法则(约 2 分钟)

下面是你以后会反复遇到的常见导数,每一个都能从极限定义推出来,但背下来省时:

函数 导数 备注
\(e^x\) \(e^x\) 唯一一个导数等于自身的函数
\(a^x\) \(a^x \ln a\) 指数函数推广
\(\ln x\) \(\frac{1}{x}\) 自然对数
\(\log_a x\) \(\frac{1}{x \ln a}\) 一般对数
\(\sin x\) \(\cos x\)
\(\cos x\) \(-\sin x\) 注意负号
\(\tan x\) \(\sec^2 x\)

⚠️ \(e^x\) 导数等于自身这件事不是巧合,它正是 \(e\) 被定义为 \(\lim_{n\to\infty}(1 + \frac{1}{n})^n\) 的根本原因——只有这个数,"增长率恰好等于自身"。这也是为什么 ML 里从 Softmax 到 Cross-Entropy 到正态分布,处处是 \(e\)。

最后讲一个救急工具——洛必达法则 (L'Hôpital's Rule):

\[\lim_{x \to a} \frac{f(x)}{g(x)} = \lim_{x \to a} \frac{f'(x)}{g'(x)}\]

当直接代入得到 \(\frac{0}{0}\) 或 \(\frac{\infty}{\infty}\)(不定型)时,可以分别对分子分母求导再重算极限。前提:分子分母都在 \(a\) 附近可微,且 \(g'(x) \ne 0\) 在 \(a\) 附近成立。

数字例 1:\(\lim_{x \to 0} \frac{\sin x}{x}\)。代入得 \(\frac{0}{0}\)。洛必达:\(\lim_{x \to 0} \frac{\cos x}{1} = 1\)。✓

数字例 2:\(\lim_{x \to 0} \frac{1 - \cos x}{x^2}\)。代入得 \(\frac{0}{0}\)。第一次洛必达:\(\lim_{x \to 0} \frac{\sin x}{2x}\),还是 \(\frac{0}{0}\)。第二次洛必达:\(\lim_{x \to 0} \frac{\cos x}{2} = \frac{1}{2}\)。✓

验算✓:用泰勒展开 \(\cos x = 1 - \frac{x^2}{2} + O(x^4)\),代入得 \(\frac{x^2/2 + O(x^4)}{x^2} \to \frac{1}{2}\)。✓


一个走完全程的例子(约 2.5 分钟)

好,我们用一个例子把整节的核心概念串起来。函数 \(f(x) = \sin(x^2)\)。求 \(f'(x)\)。

走一遍链式法则的全套动作:

Step 1:识别复合结构。外层 \(u \mapsto \sin u\),内层 \(x \mapsto x^2\)。 Step 2:算外层导数。\(\frac{d}{du}\sin u = \cos u\),把内层代回去:\(\cos(x^2)\)。 Step 3:算内层导数。\(\frac{d}{dx} x^2 = 2x\)。 Step 4:链式法则合并。 $\(f'(x) = \cos(x^2) \cdot 2x = 2x \cos(x^2)\)$

验算✓:用极限定义算——\(\frac{\sin((x+h)^2) - \sin(x^2)}{h}\) 在 \(h \to 0\) 时的极限,需要三角恒等式 \(\sin A - \sin B = 2\cos\frac{A+B}{2}\sin\frac{A-B}{2}\),算下来确实是 \(2x\cos(x^2)\)。✓

数字核对:\(x = 1\) 时,\(f'(1) = 2 \cdot 1 \cdot \cos(1) \approx 2 \cdot 0.5403 = 1.0806\)。把上面这个例子放到 PyTorch 自动微分里,\(\text{torch.autograd.grad}(\sin(x^2), x)\) 在 \(x=1\) 处给出的也是 1.0806。✓

到这里你看到了整条链:极限(定义)→ 导数(瞬时斜率)→ 求导法则(加速计算)→ 链式法则(复合函数)→ 常见导数(\(e^x, \sin, \cos, \ln\))→ 洛必达(不定型救急)→ 一个完整例子串起来。


易错点回头看(约 90 秒)

三条最常翻车的地方:

  • 很多人以为:乘积法则 \(\frac{d}{dx}[f \cdot g] = f' \cdot g'\)。其实是:\(f' \cdot g + f \cdot g'\)。因为:变化率是双通道的——\(f\) 在变,\(g\) 也在变,两个变化都要算上。数字反例:\(\frac{d}{dx}[x \cdot x]\)。错答 \(= 1 \cdot 1 = 1\);对答 \(= 1 \cdot x + x \cdot 1 = 2x\)。\(x = 3\) 时错答给 1,对答给 6——差了一个 \(x\)。

  • 很多人以为:\(\frac{d}{dx} \frac{1}{x} = 0\)(因为"1 的导数是 0")。其实是:\(-1/x^2\)。因为:\(\frac{1}{x} = x^{-1}\),幂法则给 \(-x^{-2}\)。也可用商法则:\(\frac{0 \cdot x - 1 \cdot 1}{x^2} = -\frac{1}{x^2}\)。这条直接连到 PyTorch 训练——学习率 (learning rate) 除以梯度时,\(\frac{1}{x}\) 在 \(x \to 0\) 附近会爆炸,这就是学习率衰减必须存在的原因。

  • 很多人以为:可微 ⇔ 连续。其实是:可微 ⇒ 连续,但反过来不成立。因为:连续只要求"图像没有跳跃",可微还要求"没有尖角"。反例:\(f(x) = |x|\) 在 \(x = 0\) 处连续(值为 0,左右都趋近于 0),但不可微(左侧斜率 \(-1\),右侧斜率 \(+1\),差商的左右极限不同)。


与下节的钩子(约 30 秒)

今天我们问了"此刻变化多快"。下一节——02. 积分学——我们问相反的问题:"累积了多少"。

一秒钟跑过 60 米,那么 60 秒总共跑了多少?这就是积分的本意。而微积分基本定理会告诉我们一件惊人的事:积分和微分互为逆运算,就像加法和减法、乘法和除法。这个定理,是数学史上最美的一行等式。下次见。