☰
一元函数微分学:机器学习梯度下降与链式法则的数学根基
2026/10/22 22:20:00 网站建设 项目流程

参加这次组队学习,Task 03 刚好轮到一元函数微分学。说实话,报名之前我以为这部分只是“复习一下高中导数”,等真正看完讲义、做完作业才发现,机器学习里那些看起来高深的概念,往回追根溯源全在这一章里埋着。这篇文章就把我完成 Task 03 时梳理的知识脉络、实操心得和踩过的坑整理出来,给同样在这个学习社区里推进度的同学,也适合所有想补数学底子再入门机器学习的朋友。

1. 为什么机器学习要学一元函数微分学

很多人会有疑问:机器学习动不动就是高维数据、矩阵运算,我一个“一元函数”的导数学了有什么用?这个想法我在刚开始也冒出来过,直到组队学习里老师点了一句——“梯度下降里的梯度,本质上就是导数在多维空间的推广”,我一下子反应过来:如果连一元导数都没吃透,后面看梯度、雅可比矩阵,纯粹是在看符号天书。

1.1 损失函数与梯度下降的数学根源

机器学习的核心逻辑其实很朴素:定义一个损失函数,衡量模型预测值与真实值的差距,然后不断调整模型参数,让这个差距越来越小。这个“不断调整”的过程,就是优化。

以最简单的线性回归举例。假设模型是 ŷ = wx + b,我们常用均方误差作为损失函数:

L(w) = (1/n) * Σ (wx_i + b - y_i)²

如果只看 w 这一个参数,把其他东西看成常数,那么 L(w) 就是关于 w 的一元函数。我们的目标,是找到让 L(w) 最小的 w。怎么找?高中就知道,函数在极值点处导数为 0。所以我们求 L'(w),令它等于 0,解出 w——这就是最小二乘法的解析解。

但现实里很多损失函数复杂到没办法直接解方程,于是我们改用迭代法:每次朝“让损失下降最快的方向”走一小步。这个方向,恰恰就是导数(梯度)的负方向。参数更新公式:

w ← w - η · L'(w)

整个式子核心就是 L'(w),也就是一元函数的导数。如果这个基础不牢,后面不管是逻辑回归、神经网络还是各种正则化项,理解起来都像在沙地上盖楼。

1.2 从一元到多元:本Task是机器学习数学的脚手架

组队学习把一元函数微分学放在 Task 03,逻辑上非常讲究。一元函数是理解“变化率”“局部线性逼近”“极值判定”的最简载体,一旦搞明白这套思想,后面的多元函数微分学、梯度向量、Hessian 矩阵,都是在“一元导数”骨架上长出来的。

举个例子,神经网络的反向传播算法,核心是链式法则。虽然网络动辄几百万参数,但每次计算梯度时,都是一层层地做导数乘法。你会看到:

∂L/∂w = ∂L/∂a · ∂a/∂z · ∂z/∂w

这就是链式法则的反复应用。如果你在 Task 03 里把一元复合函数求导练熟了,看到这个式子只会觉得亲切;如果没练熟,那后面就是在不断查公式、背结论,非常痛苦。

所以这个 Task 表面是在学数学,实际上是在给整个机器学习课程打地基。地基稳不稳,直接决定后面能走多远。

2. 本次Task的核心知识点拆解

Task 03 的内容可以分成四块:导数与微分的定义、求导法则、中值定理与泰勒公式、极值与凸性。每一块都不是孤立的,它们在后续课程里的用途完全不同。

2.1 导数定义与几何意义:别只看公式,要理解“瞬时变化率”

导数的定义式是:

f'(x) = lim_{h→0} [f(x+h) - f(x)] / h

这个式子看起来简单,但它其实在描述一个非常直观的场景:函数 f(x) 在 x 这一点附近的平均变化率,当 h 无限缩小时,就变成瞬时变化率。

几何上,它对应的是曲线在 (x, f(x)) 处的切线斜率。这一点千万别只背结论,一定要动手画图。我在学习时用代码画了 y = x² 在 x = 1 处的切线,看到那条切线确实贴近曲线的一小段,才真正理解“导数就是局部线性近似”这个说法。

机器学习里到处都在用这个思想。比如梯度下降的每一步,都是把损失函数在当前参数附近近似成一条直线(或一个平面),然后沿着这条直线往下走。如果导数都没弄明白,后面理解“学习率太大导致 overshooting”这类现象时,就只能靠死记硬背。

还有个小细节很容易被忽略:函数在某一点可导,前提是左导数等于右导数。比如 y = |x| 在 x = 0 处是连续的,但不可导。这个例子在组队学习群里被反复提起,就是因为后面有些算法对不可导点特别敏感,比如 ReLU 激活函数在原点附近的行为分析。

2.2 基本求导法则与复合函数:链式法则怎么也逃不掉

这个 Task 里,求导法则算是“基本功中的基本功”。我整理了一张自测表,推荐你也试试能不能不看资料默写出来:

  • 幂函数:f(x) = x^n,f'(x) = n x^(n-1)
  • 指数函数:f(x) = e^x,f'(x) = e^x
  • 对数函数:f(x) = ln x,f'(x) = 1/x
  • 三角函数:(sin x)' = cos x,(cos x)' = -sin x

这些公式看起来简单,真正容易翻车的是复合函数求导。链式法则的内容是:

如果 y = g(f(x)),则 dy/dx = g'(f(x)) · f'(x)

我在做作业时反复错在一个地方:求 e^(x²) 的导数时,总是写着写着忘了把 2x 乘上去。后来我给自己定了一个机械化流程:先看外层函数是什么,对外层求导,再把内层原样抄在括号里,最后乘内层导数。比如:

d/dx e^(x²) = e^(x²) · 2x

这个口诀听起来笨,但真的管用。尤其是机器学习里经常出现嵌套很深的复合函数,比如 sigmoid 函数 σ(z) = 1/(1+e^(-z)) 的求导,化简之后得到 σ'(z) = σ(z)(1-σ(z))。这个结论如果你直接从复合函数一步一步推,会理解得非常透彻;如果只是背结论,后面推导交叉熵损失时会觉得很突兀。

2.3 中值定理与泰勒展开:机器学习的“近似工具”

中值定理听起来像纯数学理论,但它其实是机器学习里很多推导的理论基石。拉格朗日中值定理说:

如果 f(x) 在 [a, b] 连续,在 (a, b) 可导,那么存在 ξ ∈ (a, b),使得 f'(ξ) = [f(b) - f(a)] / (b - a)

翻译成人话:一段连续曲线上,总有一个点的切线斜率等于整段曲线的平均变化率。这个定理我们在组队学习里没有要求会严格证明,但它引出的泰勒展开,才是真正高频使用的工具。

泰勒公式是这么写的:

f(x) ≈ f(a) + f'(a)(x-a) + (1/2!)·f''(a)(x-a)² + ...

这个式子告诉你:任何一个足够光滑的函数,都可以用多项式来逼近。机器学习里这是个“万能近似器”的理论基础逻辑——你不需要完美还原函数,只要能用简单的数学形式拟合到足够好。

更直接的应用是梯度下降的收敛性分析。有时候我们能证明一个优化算法在某个条件下能收敛到局部最优,靠的就是对损失函数做泰勒展开,然后分析高阶项的影响。我在学习这里时觉得有点枯燥,但后来看优化算法的论文,发现满屏都是泰勒展开的影子。所以 Task 03 这部分一定要耐着性子啃完。

2.4 极值与凸性判断:为什么“局部最优”和“全局最优”差这么远

极值问题在高中就学过:求导、令 f'(x)=0、判断驻点附近单调性。但组队学习的讲义里专门强调了一个容易忽略的点——驻点不一定是极值点。y = x³ 在 x = 0 处导数为 0,但既不是极小值也不是极大值,而是拐点。判定极值必须看二阶导数:

  • f''(x) > 0,极小值点
  • f''(x) < 0,极大值点
  • f''(x) = 0,需进一步判断

这个知识点放到机器学习里,对应的就是“局部最优和全局最优的问题”。深度学习里的损失函数往往是非凸的,存在大量局部极小值和鞍点,优化算法很容易困在里面。虽然现在有很多工程手段去缓解,但理解“为什么会有这个问题”,根源就在这一章。

凸优化与凸函数也需要在这里建立直觉。凸函数满足:

f(λx₁ + (1-λ)x₂) ≤ λf(x₁) + (1-λ)f(x₂)

意思是函数图像上的任意两点连线,都在函数图像上方。凸函数的极大优势是:局部极小值一定等于全局最小值。所以传统机器学习里,很多模型都刻意设计成凸优化问题,就是为了避免陷入局部极值。这个“设计模型时先看凸不凸”的思维,早在一元函数微分学阶段就该养成。

3. 实操过程与学习建议

组队学习最大的好处是“有人带着,有节奏,有伙伴”。但这个节奏是双刃剑——跟不上就容易被甩开。我这次给自己定了个规矩:每天动手推公式 + 跑一小段可视化代码,而不是只看不练。

3.1 组队学习节奏安排与任务拆解

Task 03 我拆分成了差不多 7 天的量,每天投入一到两小时:

第 1 天:看视频和讲义,理解导数定义与几何意义,做对应的选择题和基础计算题。

第 2 天:练习求导法则,重点练复合函数链式法则。这一天不用快,但必须保证每种题型都至少亲手推一遍。

第 3 天:学习微分概念,理解“以直代曲”的思想,配合图像理解切线的意义。

第 4 天:深入中值定理和泰勒公式,尝试自己推导第 2 阶泰勒展开,并对比原始函数和泰勒近似的差异。

第 5 天:极值、最值、凹凸性与渐近线,结合画图工具仔细观察曲线行为。

第 6 天:做作业的时候,强迫自己每道题除了写答案,还要在空白处写一句“这道题对应机器学习的哪个概念”。

第 7 天:整理错题,回看讨论区的重点回复,找一个小伙伴互相讲一遍核心知识点。

这个节奏不一定适合所有人,如果你本身在职、时间紧张,至少保证第 2 天和第 6 天不能省。链式法则是理解后面一切梯度计算的基础,而“联系机器学习场景”决定了你学的数学是活知识还是死公式。

3.2 用可视化代码辅助理解

光看公式很容易走神,我强烈建议至少在学导数几何意义和泰勒展开这两个地方,动手画一下图。下面是我在完成 Task 03 时写的一个小可视化脚本,展示 f(x) = x² 在 x=1 处的切线:

import numpy as np import matplotlib.pyplot as plt def f(x): return x ** 2 def df(x): return 2 * x x = np.linspace(-2, 2, 400) y = f(x) x0 = 1.0 y0 = f(x0) slope = df(x0) tangent = y0 + slope * (x - x0) plt.figure(figsize=(8, 5)) plt.plot(x, y, label="f(x) = x^2", linewidth=2) plt.plot(x, tangent, label=f"tangent at x={x0}", linestyle="--") plt.scatter([x0], [y0], color="red", zorder=5) plt.xlim(-2, 2) plt.ylim(-1, 4) plt.grid(True) plt.legend() plt.show()

跑完这张图你可以清楚看到:切线只在 x=1 附近和曲线贴合,离远一点就分开了。这就是“导数代表着局部信息”的直观体现——你用一个线性函数去近似非线性函数,只能在“附近”成立。

后面学习正则化、学习率衰减,脑子里如果有这张切线图,很多抽象描述都会变得具体。

3.3 把作业题和机器学习场景一一对应

组队学习的作业里,有一道题让求 f(x) = (x-3)² + 2 的最小值。这道题看似基础,我特意做了一张梯度下降迭代表,验证自己是否真的理解了“沿负梯度方向更新”:

初始设 x = 0,学习率 η = 0.1。f'(x) = 2(x-3),所以每一步更新:

x ← x - 0.1 · 2(x-3) = x - 0.2(x-3)

我手动迭代了 5 步:

迭代次数当前 x导数 f'(x)更新后 x
00.0-6.01.2
11.2-3.61.92
21.92-2.162.352
32.352-1.2962.6112
42.6112-0.77762.76672
52.76672-0.466562.860032

可以看到 x 在逐步逼近最优解 3。这个过程虽然简单,但它就是机器学习中“梯度下降”的完整缩影。如果你愿意,还可以换一个更大的学习率,比如 η = 0.5,就会发现 x 开始在最优解附近震荡。这个小小的变换,能把“学习率太大导致不收敛”这个现象提前暴露出来,比单纯背理论印象深刻得多。

我还尝试过用 SymPy 做符号求导来对答案,比自己反复笔算高效很多。但注意,工具只能帮你验证结果,不能帮你练“手动拆复合函数”的肌肉记忆。

import sympy as sp x = sp.symbols("x") expr = sp.exp(x ** 2) * sp.sin(x) print(sp.diff(expr, x))

任务是用它来对照手算结果,而不是替代手算。一旦发现结果不一致,一定要回头重新拆解,这个过程才是最涨功力的地方。

4. 常见问题与避坑指南

这一节把我在组队学习讨论区、以及自己做题过程中遇到的高频问题整理成速查表。每个问题背后都有人踩过坑,提前看到就能省下不少时间。

4.1 概念混淆速查表

经常混淆的点区别要点典型例子
导函数 vs 微分导数 f'(x) 是变化率;微分 dy = f'(x)dx 是变化量的线性近似y=x² 的导数 2x;在 x=1 处 dx=0.1 时 dy≈0.2
极值点 vs 驻点驻点只是 f'(x)=0 的点,不一定是极值点y=x³ 在 x=0 处是驻点但不是极值
极大值 vs 最大值极大值是局部概念,最大值是全局概念波浪函数有很多局部峰,但只有一个全局最高点
可导 vs 连续可导一定连续,连续不一定可导y=
凹函数 vs 凸函数国内高数教材和国际教材对“凹凸”的定义经常相反,组队学习按“f''(x)>0 为凸(convex)”f(x)=x² 是凸函数

最后一条“凹凸性定义”特别坑。因为你以后看国外资料,convex function 就是国内有些教材说的“凹函数”。我在组队学习群里见过好几次因为这个争论而耽误进度的同学。建议你直接按“f''(x) 的符号”来记忆,别用中文的“凹”“凸”两个字自己脑补图像。

4.2 计算中的细节失误

我在批改自己练习时,反复出现三类低级错误:

第一,复合函数求导漏乘内层导数。比如求 sin(2x) 的导数,很容易只写 cos(2x),忘了再乘一个 2。这个错误在练链式法则的前三天里几乎每个人都犯过,解决方法只有一个——每一步先把内外层结构写清楚,再开始求导。

第二,对商求导时符号和顺序出错。商法则公式是:

(u/v)' = (u'v - uv') / v²

注意是 u'v 减 uv',不是反过来。这个公式你用多了会发现,只要中间有一步紧张,很容易把减号写成加号。我自己的习惯是每次都把分子拆成“上导下不导,减去下导上不导”这句话默念一遍。

第三,忽略函数的定义域。比如 ln(x²) 的导数,按链式法则是 2x / x² = 2/x,这个结果在 x>0 和 x<0 时都成立,但很多人因为盯着 ln 的定义域,忽略了最终结果定义域的变化。这类问题不影响考试,但在后面理解损失函数时,会限制你对“模型输出范围”的敏感度。

4.3 学习节奏与心态问题

组队学习里最常见的挫败感是“老师讲完我都懂,一做题就废”。我第二次做 Task 03 题目时仍然有这种感觉。后来发现,问题出在“看答案太早”上。如果一道题看了 5 分钟没有思路,不要急着点开答案,先去翻讲义,把相关例子抄一遍,再合上笔记本重新写。这个“先输入再输出”的过程比直接背答案有效得多。

另外,组队学习时一定要参与讨论区的提问。我在群里看过一个特别好的提问方式:把卡住的步骤截图,标注“我按链式法则求到了这里,接下来符号不知道怎么处理”。这种提问方式让回答的人能精准定位问题,围观的人也跟着复习了一遍。相反,那种直接拍题目说“这道题怎么做”的提问,往往得不到高质量回复。

4.4 关于“刷题”和“理解”的平衡

其实 Task 03 的题量并不算多,如果你只求做完,可能三天就完成了。但我想提醒你:这一章值得多花点时间“咀嚼”,不要赶进度。组队学习后面还有多元函数微分、线性代数、概率论,每一章都建立在前面章节的直觉上。我在完成一元函数微分学时,额外做了一件事:把每个核心概念尝试用自己的话解释一遍,然后发给同组的小伙伴听。能讲明白的知识,才是真正属于你的知识。

这个习惯后来在 Task 04 里救了我一命——当我看到偏导数和梯度的定义时,因为已经建立好“导数就是变化率”的直觉,多元推广几乎没有任何认知负担。

所以如果你现在正卡在这个 Task,别急。慢慢把导数定义、链式法则、泰勒展开这三块吃透,往后的路会越走越顺。我个人在学习中最深刻的体会是:数学基础这个东西,你欠下的每一笔债,后面都会以“看不懂代码细节”或“公式推不出来”的方式连本带利地还回来。反过来,每一分扎实投入,都会在后续某个模型原理彻底想通的那一刻,给你巨大的正反馈。

最后分享一个小技巧:学完这章后,回去翻翻机器学习入门教材里的线性回归部分,尝试用你刚学到的导数知识,自己推导一遍均方误差损失对参数 w 的梯度。如果你能顺利推出来,那 Task 03 就算真正学透了。这比多做十道求导题都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询