📺B站视频讲解(Bilibili):博主个人介绍
📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
📘加博主微信,进技术交流群:jerrydev
把微积分讲成深度学习的“方向盘”:导数、偏导、梯度与链式法则一篇打通(D2L 2.4 学习笔记)
目标:用新手也能跟上的方式,把本章出现的核心概念一次讲清楚:
- 你到底在求什么?(变化率 / 斜率 / 方向)
- 关键符号怎么读?(f′、dy/dx、∂、∇、nabla)
- 深度学习里它们怎么用?(损失函数、优化、反向传播的“数学底座”)
阅读建议:先把「工具箱地图」看完,再逐节看例子,最后用「记忆卡片」做复习。
1. 为什么深度学习离不开微积分?
微积分有两条主线:
- 积分:从“把很多小块加起来”得到面积/总量(历史上用逼近法逼近圆面积就是经典出发点)。
- 微分:研究“变化的速度”和“如何把事情做得更好”。
在深度学习里,你每天都在做一件事:
- 定义一个模型,给它一个损失函数(loss function,衡量“模型有多糟糕”)。
- 通过训练让损失变小:这本质就是一个**优化(optimization)**问题。
而优化的核心动作只有一个:
沿着让损失下降最快的方向,走一小步。
这个“下降最快的方向”怎么来的?——靠导数/偏导/梯度。
所以,这一章可以把它当成:
深度学习的“方向盘与油门”:
- 导数 / 梯度告诉你方向(往哪走会下降)。
- 学习率(后面章节)决定你每次走多远。
2. 本章的最小工具箱地图(先建立全局)
你只需要抓住四个关键词:
- 导数(Derivative):单变量函数的变化率。
- 偏导数(Partial derivative):多变量函数里,只看某一个变量的变化率。
- 梯度(Gradient):把所有偏导数拼成一个向量——它直接给出“最陡方向”。
- 链式法则(Chain rule):处理复合函数的求导规则——神经网络的结构几乎全是复合。
如果把函数看作一个“系统”,那么:
- 导数:系统对一个输入旋钮的敏感度
- 偏导:系统对某一个输入旋钮的敏感度(其他旋钮先固定)
- 梯度:系统对所有输入旋钮的敏感度集合
- 链式法则:系统由多个模块串起来时,敏感度如何“沿着模块链条传递”
后面你会发现:
反向传播 = 链式法则 + 计算图的有序传播。
3. 2.4.1 导数与微分:从“割线”走向“切线”
3.1 变化率:为什么会有“导数”?
先从直觉开始。
假设你有一个函数 (y=f(x))。你想知道:
- (x) 增加一点点时,(y) 会变化多少?
如果我们只看两个点:(x) 和 (x+h),那么“平均变化率”(割线斜率)是:
[
\frac{f(x+h)-f(x)}{h}
]
当 (h) 越来越小,这个“平均变化率”就越来越接近某个极限——这就是瞬时变化率。
3.2 导数的定义(你要背下来的第一条公式)
在点 (a) 处的导数定义为:
[
f’(a)=\lim_{h\to 0}\frac{f(a+h)-f(a)}{h}
]
这句话可以翻译成:
让 (x) 往右挪一个很小的 (h),看输出变化除以输入变化;当 (h) 逼近 0 时,得到极限。
3.3 导数的“读法”和“符号大全”
同一个导数,经常会看到很多写法。你至少要认得它们:
- (f’(x)):读作“f prime of x”(f 的撇,或“f 在 x 的导数”)
- (y’):读作“y prime”
- (\frac{dy}{dx}):读作“d y d x”(也常被中文口语读成“dy 比 dx”)
- (\frac{df}{dx}):读作“d f d x”
- (\frac{d}{dx} f(x)):读作“对 x 求导的算子作用在 f(x) 上”
- (Df(x))、(D_x f(x)):读作“D f”或“D sub x f”(更偏线性代数/算子风格)
记忆技巧:
- 看到prime(撇):多半是导数。
- 看到d/dx:明确“对谁求导”。
- 看到D:把导数当作“一个操作”。
3.4 常用求导规则(背核心,不背废话)
下面这几条就是本章“单变量求导”的工具箱:
- 常数导数为 0
[
\frac{d}{dx}C=0
]
- 幂函数(幂律)
[
\frac{d}{dx}x^n = n x^{n-1}
]
- 指数函数
[
\frac{d}{dx}ex=ex
]
- 对数函数
[
\frac{d}{dx}\ln x=\frac{1}{x}
]
- 线性性质(常数倍 & 加法)
[
\frac{d}{dx}[C f(x)] = C f’(x)
]
[
\frac{d}{dx}[f(x)+g(x)] = f’(x)+g’(x)
]
- 乘法法则
[
\frac{d}{dx}[f(x)g(x)] = f(x)g’(x) + g(x)f’(x)
]
- 除法法则
[
\frac{d}{dx}\left[\frac{f(x)}{g(x)}\right]=\frac{g(x)f’(x)-f(x)g’(x)}{[g(x)]^2}
]
记忆技巧:
- 乘法:“前不动导后 + 后不动导前”。
- 除法:“下乘上导 - 上乘下导 / 下平方”(上、下指分子/分母)。
3.5 一个贯穿示例:(f(x)=3x^2-4x)
先求导:
[
f’(x)= 3\cdot 2x - 4 = 6x-4
]
在 (x=1) 处:
[
f’(1)=6\cdot1-4=2
]
用数值逼近理解“极限”
你可以用差商:((f(1+h)-f(1))/h),让 (h) 一直缩小,看它趋近于 2。
importnumpyasnpdeff(x):return3*x**2-4*xdefnumerical_lim(f,x,h):return(f(x+h)-f(x))/h h=0.1for_inrange(5):print(h,numerical_lim(f,1.0,h))h*=0.1你会看到:(h) 从 0.1 缩小到 0.00001 时,数值会越来越接近 2。
这件事的意义:
- 导数不是“玄学符号”,它是“把变化率压到极限”得到的量。
3.6 导数的几何意义:切线斜率与局部线性
导数在点 (a) 的另一个解释:
它是曲线在该点的切线斜率。
更实用的是“局部线性近似”:
[
f(x) \approx f(a) + f’(a)(x-a)
]
这句话非常重要,因为它解释了为什么很多优化算法可以靠“线性近似”一步步逼近最优。
4. 2.4.2 偏导数:多变量函数怎么“只对一个变量求导”?
深度学习里常见的函数不是 (y=f(x)),而是:
[
y=f(x_1, x_2, \dots, x_n)
]
比如损失 (L) 可能同时依赖成千上万个参数。
4.1 偏导数的核心思想
偏导就是:
“只让 (x_i) 变一下,其他变量先当常数。”
定义(你要认得的第二条公式):
[
\frac{\partial y}{\partial x_i}=
\lim_{h\to 0}\frac{f(x_1,\dots,x_i+h,\dots,x_n)-f(x_1,\dots,x_i,\dots,x_n)}{h}
]
4.2 偏导数的符号与读法
- (\frac{\partial y}{\partial x_i}):读作“partial y partial x i”(偏 y 偏 x_i)
- (\frac{\partial f}{\partial x_i}):读作“partial f partial x i”
- (f_{x_i}) 或 (f_i):读作“f sub x_i”或 “f sub i”(简写)
- (D_i f)、(D_{x_i}f):算子写法
记忆技巧:
- 看到(\partial)(弯弯的 d):就是偏导。
很多新手混淆 d 与 ∂:
- d通常用于单变量/全微分语境。
- ∂明确告诉你“多变量,只对其中一个变量求”。
4.3 一个例子:(f(x_1,x_2)=3x_12+5e{x_2})
对 (x_1) 的偏导:
[
\frac{\partial f}{\partial x_1}=6x_1
]
对 (x_2) 的偏导:
[
\frac{\partial f}{\partial x_2}=5e^{x_2}
]
注意观察:
- 求 (\partial/\partial x_1) 时,(x_2) 被当作常数。
- 求 (\partial/\partial x_2) 时,(x_1) 被当作常数。
5. 2.4.3 梯度:把“所有偏导”拼成一个向量
偏导告诉你“某个方向”的变化率,但在优化里你想要的是:
所有方向里,往哪走下降最快?
这需要一个向量——梯度。
5.1 梯度的定义(第三条必须熟悉的公式)
设 (f:\mathbb{R}^n\to\mathbb{R}),输入 (\mathbf{x}=[x_1,\dots,x_n]^\top),输出是一个标量。
梯度定义为:
[
\nabla_{\mathbf{x}} f(\mathbf{x})=
\Big[\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\dots,\frac{\partial f}{\partial x_n}\Big]^\top
]
5.2 梯度符号怎么读?
- (\nabla):读作“nabla”(也有人读“del”,但深度学习里常用 nabla)
- (\nabla f):读作“nabla f”或 “f 的梯度”
- (\nabla_{\mathbf{x}} f):读作 “对 x 的梯度”
记忆技巧:
- (\nabla) 像一个“倒三角”,可以记成“方向箭头的集合”。
5.3 梯度的意义:最陡上升与最陡下降
一个非常关键的事实:
- 梯度方向是函数上升最快的方向。
- 负梯度方向是函数下降最快的方向。
所以你会在优化里反复看到更新:
[
\mathbf{x} \leftarrow \mathbf{x} - \eta \nabla f(\mathbf{x})
]
其中 (\eta) 是学习率(步长)。
5.4 你在深度学习里会常见的梯度结果
下面三条在推导里经常出现(先认识即可):
- 二次型
[
\nabla_{\mathbf{x}}, \mathbf{x}^\top\mathbf{A}\mathbf{x} = (\mathbf{A}+\mathbf{A}^\top)\mathbf{x}
]
特别地,如果 (\mathbf{A}) 是对称矩阵((\mathbf{A}=\mathbf{A}^\top)),那就变成 (2\mathbf{A}\mathbf{x})。
- 向量二范数平方
[
\nabla_{\mathbf{x}}|\mathbf{x}|^2 = 2\mathbf{x}
]
- 矩阵的 Frobenius 范数平方
[
\nabla_{\mathbf{X}}|\mathbf{X}|_F^2 = 2\mathbf{X}
]
5.5 一个最小 PyTorch 体验:梯度不是“算出来”,是“传出来”
下面这段代码让你感受:框架会帮你自动算梯度(下一节 2.5 会系统讲自动微分)。
importtorch x=torch.tensor([1.0,2.0,3.0],requires_grad=True)# f(x) = ||x||^2 = x1^2 + x2^2 + x3^2f=(x*x).sum()f.backward()# 触发反向传播print(x.grad)# 期望是 2x输出会是 ([2,4,6]),对应 (2\mathbf{x})。
6. 2.4.4 链式法则:复合函数的“梯度传递公式”
你在神经网络里看到的结构大多是:
[
\text{输入} \rightarrow \text{线性变换} \rightarrow \text{激活函数} \rightarrow \text{再线性} \rightarrow \dots \rightarrow \text{损失}
]
这是一串复合函数。只靠“幂律、加法法则”会很痛苦。
链式法则就是解决方案。
6.1 单变量链式法则(第四条必须熟悉的公式)
若 (y=f(u)),(u=g(x)),则:
[
\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}
]
直觉:
- x 变一点点 → u 变多少 → y 再跟着变多少。
记忆技巧(非常好用):
- “上游梯度 × 局部梯度”。
6.2 多变量链式法则(深度学习更常用)
假设:
- (y) 依赖 (u_1,\dots,u_m)
- 每个 (u_j) 又依赖 (x_1,\dots,x_n)
那么对任意 (x_i):
[
\frac{\partial y}{\partial x_i}
=\sum_{j=1}^{m}\frac{\partial y}{\partial u_j}\frac{\partial u_j}{\partial x_i}
]
这就是反向传播里“把梯度从后往前累加”的数学原因。
6.3 一个新手必练的链式法则例子
令:
- (u = 3x^2-4x)
- (y = u^2)
求 (dy/dx)。
步骤:
- (dy/du = 2u)
- (du/dx = 6x-4)
所以:
[
\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}=2u(6x-4)=2(3x^2-4x)(6x-4)
]
这就是“模块串联,梯度相乘”。
6.4 一个更贴近深度学习的“多变量”链式例子
令:
- (u_1 = x_1^2 + x_2)
- (u_2 = e^{x_2})
- (y = u_1\cdot u_2)
你要算 (\partial y/\partial x_1) 与 (\partial y/\partial x_2)。
先算局部偏导:
(\partial y/\partial u_1 = u_2)
(\partial y/\partial u_2 = u_1)
(\partial u_1/\partial x_1 = 2x_1)
(\partial u_1/\partial x_2 = 1)
(\partial u_2/\partial x_2 = e^{x_2}=u_2)
(\partial u_2/\partial x_1 = 0)
然后套多变量链式:
[
\frac{\partial y}{\partial x_1}=\frac{\partial y}{\partial u_1}\frac{\partial u_1}{\partial x_1}+\frac{\partial y}{\partial u_2}\frac{\partial u_2}{\partial x_1}=u_2\cdot 2x_1 + u_1\cdot 0=2x_1 e^{x_2}
]
[
\frac{\partial y}{\partial x_2}=\frac{\partial y}{\partial u_1}\frac{\partial u_1}{\partial x_2}+\frac{\partial y}{\partial u_2}\frac{\partial u_2}{\partial x_2}=u_2\cdot 1 + u_1\cdot u_2 = e{x_2}(1+x_12+x_2)
]
你会发现:
- (x_2) 会通过两条路径影响 y(影响 u1,也影响 u2),所以要“相加”。
- (x_1) 只通过 u1 影响 y,所以路径更简单。
这就是计算图里“多条路径的梯度要相加”的根源。
7. 小结:你现在应该能一口气说清楚什么?
学完这一章,你至少要能做到:
- 看到导数定义,知道它是“极限下的变化率”。
- 看到偏导符号 (\partial),知道“只对一个变量求导”。
- 看到梯度 (\nabla),知道它是“所有偏导组成的向量”,并能说出“负梯度下降最快”。
- 看到链式法则,知道它是“复合函数的梯度传递规则”,并理解它支撑了反向传播。
8. 本章练习:给你一份“可直接对照”的解题版
提示:以下解答是根据题意进行推导与讲解,重点是训练你把“公式→操作流程”串起来。
练习 1:画 (y=x^3-\frac{1}{x}) 以及 (x=1) 处切线
- 先求导:
[
y’ = 3x^2 + \frac{1}{x^2}
]
- 在 (x=1) 处:
- (y(1)=1-1=0)
- (y’(1)=3+1=4)
- 切线公式:
[
y \approx y(1) + y’(1)(x-1)= 0 + 4(x-1)=4x-4
]
- 画图(Python):
importnumpyasnpimportmatplotlib.pyplotasplt x=np.linspace(0.2,2.5,400)y=x**3-1/x t=np.linspace(0.2,2.5,400)line=4*t-4plt.plot(x,y,label='y = x^3 - 1/x')plt.plot(t,line,label='tangent at x=1')plt.scatter([1],[0])plt.legend()plt.grid(True)plt.show()练习 2:(f(\mathbf{x})=3x_12+5e{x_2}) 的梯度
df/dx1:(6x_1)
df/dx2:(5e^{x_2})
所以:
[
\nabla f = [6x_1,\ 5e{x_2}]\top
]
练习 3:(f(\mathbf{x})=|\mathbf{x}|_2) 的梯度
设 (\mathbf{x}\neq 0)。
[
|\mathbf{x}|_2 = \sqrt{x_12+\cdots+x_n2}
]
对每个分量:
[
\frac{\partial}{\partial x_i}|\mathbf{x}|_2 = \frac{x_i}{|\mathbf{x}|_2}
]
所以:
[
\nabla |\mathbf{x}|_2 = \frac{\mathbf{x}}{|\mathbf{x}|_2}
]
注意:在 (\mathbf{x}=0) 处不可导(严格意义上梯度不存在),这在优化里会引出“次梯度”等概念(后面优化章节会遇到类似思想)。
练习 4:写出 (u=f(x,y,z)),且 (x=x(a,b))、(y=y(a,b))、(z=z(a,b)) 的链式法则
目标:(u) 最终是 (a,b) 的函数。
对 (a):
[
\frac{\partial u}{\partial a}
=\frac{\partial u}{\partial x}\frac{\partial x}{\partial a}
+\frac{\partial u}{\partial y}\frac{\partial y}{\partial a}
+\frac{\partial u}{\partial z}\frac{\partial z}{\partial a}
]
对 (b):
[
\frac{\partial u}{\partial b}
=\frac{\partial u}{\partial x}\frac{\partial x}{\partial b}
+\frac{\partial u}{\partial y}\frac{\partial y}{\partial b}
+\frac{\partial u}{\partial z}\frac{\partial z}{\partial b}
]
这就是“多条路径影响同一个输出 → 梯度相加”的标准形式。
9. 记忆卡片:把这一章变成“随手能背的公式组”
9.1 四件套(最小闭环)
导数定义:(f’(a)=\lim_{h\to 0}\frac{f(a+h)-f(a)}{h})
偏导定义:(\frac{\partial y}{\partial x_i}=\lim_{h\to 0}\frac{f(\dots,x_i+h,\dots)-f(\dots,x_i,\dots)}{h})
梯度定义:(\nabla f=[\partial f/\partial x_1,\dots,\partial f/\partial x_n]^\top)
链式法则:
- 单变量:(dy/dx=(dy/du)(du/dx))
- 多变量:(\partial y/\partial x_i=\sum_j (\partial y/\partial u_j)(\partial u_j/\partial x_i))
9.2 常用求导规则(单变量)
- (dC/dx=0)
- (d(x^n)/dx = n x^{n-1})
- (d(e^x)/dx = e^x)
- (d(\ln x)/dx = 1/x)
- (d(Cf)/dx = C f’)
- (d(f+g)/dx = f’+g’)
- (d(fg)/dx = f g’ + g f’)
- (d(f/g)/dx = (g f’ - f g’)/g^2)
9.3 一句“深度学习翻译”
- 梯度:损失对参数的敏感度向量。
- 负梯度:损失下降最快方向。
- 链式法则:梯度在网络层之间传播的规则。
10. 前瞻:下一章“自动微分”你会学到什么?
当网络很深、函数很复杂时,手推梯度会非常痛苦。下一章你会看到:
- 框架把函数拆成很多“基本算子”(加、乘、exp、matmul…)
- 给每个算子准备“局部梯度”
- 用链式法则在计算图上把梯度从输出一路传回输入(反向传播)
所以你现在学的这一章,等价于在给自动微分“打地基”:
你不需要每次都手算,但你必须看得懂梯度到底在表达什么。
结语:本章你最该获得的能力
如果你只记住一句话:
导数/偏导/梯度负责告诉你“怎么变会变好”,链式法则负责让你在“复杂结构”里仍然能算出这个方向。
当你真正把这句话消化掉,后面的优化算法、反向传播、自动微分,会顺很多。
📺B站视频讲解(Bilibili):博主个人介绍
📘《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
📘加博主微信,进技术交流群:jerrydev