Part I · 第 3 章 多元与向量微积分 · 3.1

多元函数与偏导

机器人的世界里,几乎没有只依赖一个变量的量:末端到目标的距离同时取决于每个关节角,信号强度同时取决于 \(x\) 和 \(y\),损失同时取决于几百万个参数。把其余旋钮都固定住,只拧动其中一个,输出会变多快?这个"单旋钮的灵敏度"就是偏导数。

约 20 分钟 前置:1.1 向量 · 2.1 导数 4 个交互

    1为什么机器人需要它

    一元函数 \(g(x)\) 的导数回答:"\(x\) 动一点,\(g\) 变多少?"可机器人面对的函数几乎都有很多个输入:

    • 两连杆机械臂的末端到目标的距离 \(d(\theta_1,\theta_2)\):该先转肩关节,还是先转肘关节?
    • 地图上每个位置的代价或信号强度(WiFi、气味、距离场)\(c(x,y)\):往东走还是往北走,代价降得更快?
    • 神经网络策略的损失 \(\mathcal L(w_1,\dots,w_N)\):\(N\) 个参数里,每一个对损失的影响有多大?

    三个问题的答案都是同一种东西:固定其他变量,只看一个变量时的变化率,这就是偏导数。把所有偏导数排成一列,得到下一节的梯度;对向量值函数把它们排成一张表,得到 3.3 节的雅可比。所以这一节是整个第 3 章的地基。

    2直觉:把曲面切成一片一片

    二元函数 \(f(x,y)\) 可以画成一张曲面:在平面上每个点 \((x,y)\) 的正上方,高度是 \(f(x,y)\)。站在曲面上的一点 \(\mathbf p\),"坡度"这个词立刻变得含糊:朝东是上坡,朝北可能是下坡。坡度取决于朝哪走。

    最简单的办法是只允许沿着坐标轴走。固定 \(y = y_0\),把曲面沿着这个平面切开,切口是一条普通的一元曲线 \(x \mapsto f(x, y_0)\),它在 \(x_0\) 处的斜率就是 \(f\) 对 \(x\) 的偏导数。同样固定 \(x = x_0\) 再切一刀,得到另一条切口,它的斜率是对 \(y\) 的偏导数。下图中红色切口对应 \(x\),绿色切口对应 \(y\),拖动滑块把点 \(\mathbf p\) 移来移去。

    FIG 1曲面与两刀切口
    拖动画面可以旋转视角。琥珀色圆点是 \(\mathbf p\) 在曲面上的位置;红色曲线是 \(y = y_0\) 的切口,绿色曲线是 \(x = x_0\) 的切口;两条虚线是各自的切线,斜率分别是 \(\partial f/\partial x\) 与 \(\partial f/\partial y\)。曲面的竖直方向已按比例缩放,只看斜率的正负和大小关系即可。
    • 找到一个两个偏导数同时为 0 的点:两条切线都是水平的。在"鞍面"上试试,这个点叫什么?
    • 找一个点,让 \(\partial f/\partial x > 0\) 而 \(\partial f/\partial y < 0\):朝 \(x\) 正方向是上坡,朝 \(y\) 正方向却是下坡。
    核心洞见

    偏导数就是一元导数,只不过把其余变量当作常数。\(\partial f/\partial x\) 是"沿着 \(x\) 方向的坡度",\(\partial f/\partial y\) 是"沿着 \(y\) 方向的坡度"。一个点上有多少个输入变量,就有多少个这样的坡度。

    3动手玩:用差分"量"出偏导

    偏导数的定义就是一个极限:沿 \(x\) 方向迈一小步 \(h\),看 \(f\) 变了多少,再除以 \(h\)。左边是等高线图(越偏青色越低,越偏紫色越高,每条线上 \(f\) 相等),拖动黄点 \(\mathbf p\)。右边把两条切口画在同一张图里:横轴是离开 \(\mathbf p\) 的位移 \(t\),纵轴是 \(f\)。实心粗线段是"差商",即割线,虚线是真正的切线。把 \(h\) 拉小,割线就会贴上切线。

    现实里的 \(f\) 常常是传感器读数,带噪声。把"测量噪声"打开,再把 \(h\) 拉到很小,会发生什么?

    FIG 2偏导数实验室
    等高线图 (x, y)
    两条切口:f 对位移 t
    红色对应 \(x\) 方向,绿色对应 \(y\) 方向。左图中黄点旁的红、绿短线是步长为 \(h\) 的两步。右图的空心圆圈是带噪声的测量值,实线割线连接的是测量值,所以噪声不为零时割线的斜率会偏离切线。
    试一试
    • 噪声设为 0,把 \(h\) 缩小,直到两个差商都和解析偏导相差不到 0.01。
    • 把噪声设为 0.05 以上、\(h\) 拉到 0.01 以下,让估计的偏导数错得离谱(误差大于 2)。然后找一个折中的 \(h\),让误差回到 0.6 以下。

    这里有两种误差在拔河:\(h\) 大了,割线和切线差得远(截断误差,大约正比于 \(h\));\(h\) 小了,两个几乎相等的测量值相减,噪声被除以 \(h\) 放大(大约正比于 \(\sigma/h\))。所以数值求偏导存在一个最佳步长:既不能太大,也不能太小。机器人没有解析公式、只能"试探着动一动再看传感器"的时候,这一点尤其重要。

    4第二视角:偏导数会"相加"

    如果 \(x\) 和 \(y\) 同时改变呢?走一条阶梯路径:先沿 \(x\) 方向走 \(\delta_x\),再沿 \(y\) 方向走 \(\delta_y\)。每一小段都是"一元问题",变化量约等于斜率乘以步长。两段加起来,就是总变化的一阶预测:

    $$ f(x+\delta_x,\,y+\delta_y) - f(x,y) \;\approx\; \ci{\frac{\partial f}{\partial x}}\,\delta_x \;+\; \cj{\frac{\partial f}{\partial y}}\,\delta_y $$

    拖动下图中的紫色手柄 \(\mathbf q = \mathbf p + \boldsymbol\delta\),黄点 \(\mathbf p\) 也可以拖动。右边的瀑布图把预测的变化拆成两块:红色是 \(x\) 方向贡献的 \(f_x\delta_x\),绿色接在它后面,是 \(y\) 方向贡献的 \(f_y\delta_y\);琥珀色条是 \(f\) 的真实变化,紫色竖虚线标出预测值。

    FIG 3阶梯路径与瀑布图
    等高线图 (x, y)
    f 的变化量
    阶梯路径是 \(\mathbf p\to(p_x+\delta_x,\,p_y)\to\mathbf q\),先红后绿。预测与真实变化之间的差(残差)大约正比于 \(\|\boldsymbol\delta\|^2\):点一下"δ 减半",残差会变成约原来的四分之一。
    • 把 \(\mathbf q\) 拖到一个位置,使红、绿两块几乎抵消(预测的总变化小于 0.02),同时 \(\|\boldsymbol\delta\|>0.3\)。这时你正沿着什么在走?(答案在下一节。)
    三种常见的函数形态

    多入一出 \(f:\R^n\to\R\)(本节):有 \(n\) 个偏导数,排成一列就是梯度 \(\nabla f\)(3.2 节)。
    多入多出 \(F:\R^n\to\R^m\):每个输出各有 \(n\) 个偏导,一共 \(m\times n\) 个,排成一张表就是雅可比 \(J\)(3.3 节)。
    偏导的偏导:二阶偏导 \(\partial^2 f/\partial x_i\partial x_j\) 排成 Hessian(3.5 节),描述曲面怎么弯。

    5再看数学

    提示:把鼠标悬停在公式中带底色的符号上,FIG 2 中对应的元素会被高亮。

    定义

    设 \(f:\R^n\to\R\),\(\mathbf p=(p_1,\dots,p_n)\)。\(f\) 在 \(\mathbf p\) 处对第 \(j\) 个变量的偏导数,是只让第 \(j\) 个坐标变化的一元导数:

    $$ \frac{\partial f}{\partial x_j}(\mathbf p) \;=\; \lim_{h\to 0}\; \frac{f(\mathbf p + \hl{step}{h\,\mathbf e_j}) - \hl{f0}{f(\mathbf p)}}{\hl{h}{h}} \;=\; \frac{d}{dt}\, f(\mathbf p + t\,\mathbf e_j)\Big|_{t=0}. $$

    其中 \(\mathbf e_j\) 是第 \(j\) 个标准基向量(1.2 节),除了第 \(j\) 个分量为 1 外全为 0。最右边的写法说明了切口的含义:沿着穿过 \(\mathbf p\) 的坐标轴方向的直线,把 \(f\) 限制在这条线上,得到一个一元函数,再对它求导。常见的记号还有 \(f_{x_j}\)、\(\partial_j f\)、\(D_j f\),意思都一样。

    计算:把其余变量当常数

    实际计算时,求 \(\partial f/\partial x\) 就是对 \(x\) 求导,\(y\) 当成一个数字。例如 \(f(x,y) = x^2 y + \sin y\):

    $$ \ci{\frac{\partial f}{\partial x}} = \ci{2xy}, \qquad \cj{\frac{\partial f}{\partial y}} = \cj{x^2 + \cos y}. $$

    在 \(\mathbf p=(2,0)\) 处:\(f_x = 0\),\(f_y = 4 + 1 = 5\)。沿 \(x\) 方向,函数此刻是平的(因为 \(y=0\) 把 \(x^2y\) 整个压没了),沿 \(y\) 方向的坡度是 5。

    一阶近似与全微分

    FIG 3 的结论可以写成一般形式。把所有偏导数收在一起,用 1.7 节的点积来写:

    $$ f(\mathbf p + \boldsymbol\delta) \;\approx\; \cv{f(\mathbf p)} + \sum_{j=1}^{n} \frac{\partial f}{\partial x_j}(\mathbf p)\,\delta_j \;=\; \cv{f(\mathbf p)} + \Big[\tfrac{\partial f}{\partial x_1}\;\cdots\;\tfrac{\partial f}{\partial x_n}\Big]\boldsymbol\delta . $$

    方括号里是一个行向量,它就是下一节的梯度 \(\nabla f(\mathbf p)^\top\)。只要各偏导数本身连续(\(C^1\)),上式就成立,余项比 \(\|\boldsymbol\delta\|\) 小得多(\(o(\|\boldsymbol\delta\|)\));若二阶偏导也连续(\(C^2\)),余项是 \(O(\|\boldsymbol\delta\|^2)\)。只有偏导数存在而不连续时,这个近似可能失败,这是第 7 节的一个误区。

    二阶偏导与混合偏导

    偏导数本身又是 \(x,y\) 的函数,可以再求偏导。对 \(f = x^2y+\sin y\):

    $$ f_{xx} = 2y,\quad f_{yy} = -\sin y,\quad f_{xy} = \frac{\partial}{\partial y}\big(f_x\big) = 2x,\quad f_{yx} = \frac{\partial}{\partial x}\big(f_y\big) = 2x. $$

    两个混合偏导数相等不是巧合。只要二阶偏导连续,求导的次序就可以交换:\(f_{xy} = f_{yx}\)(Schwarz 定理,也叫 Clairaut 定理)。这个对称性在 3.5 节里变成"Hessian 是对称矩阵"。

    例题:机械臂末端到目标的距离

    平面两连杆机械臂,末端位置 \(\mathbf x(\theta_1,\theta_2)\),目标 \(\mathbf t\),距离 \(d = \|\mathbf x - \mathbf t\|\)。用链式法则(2.2 节)对 \(\theta_i\) 求偏导。先注意 \(\partial d/\partial\mathbf x = (\mathbf x-\mathbf t)/d\) 是从目标指向末端的单位向量 \(\hat{\mathbf n}\),于是:

    $$ \frac{\partial d}{\partial \theta_i} \;=\; \hat{\mathbf n}\cdot\frac{\partial \mathbf x}{\partial \theta_i}, \qquad \frac{\partial \mathbf x}{\partial \theta_1} = \begin{bmatrix} -l_1 s_1 - l_2 s_{12} \\ \;\;l_1 c_1 + l_2 c_{12}\end{bmatrix},\quad \frac{\partial \mathbf x}{\partial \theta_2} = \begin{bmatrix} -l_2 s_{12} \\ \;\;l_2 c_{12}\end{bmatrix}. $$

    读法:\(\partial\mathbf x/\partial\theta_i\) 是只转第 \(i\) 个关节时末端跑的方向(3.3 节中雅可比的第 \(i\) 列),\(\partial d/\partial\theta_i\) 是这个方向在"远离目标"方向上的投影(1.9 节)。如果这一列几乎垂直于 \(\hat{\mathbf n}\),转这个关节对距离几乎没有一阶影响。

    6机器人中的它:先转哪个关节?

    让机械臂末端靠近目标(黄色菱形),但这次只允许一次转一个关节。每个关节对距离的灵敏度正是偏导数 \(\partial d/\partial\theta_1\)、\(\partial d/\partial\theta_2\):右侧的条形图向左表示"正转会让距离变小",向右表示"正转会让距离变大"。点按钮,机器人会选灵敏度绝对值较大的那个关节,朝让距离变小的方向转一小步。这就是坐标下降(coordinate descent):每次只沿一根坐标轴优化。

    FIG 4每个关节对距离的灵敏度
    ∂d/∂θ₁
    ∂d/∂θ₂
    红箭头是 \(\partial\mathbf x/\partial\theta_1\),绿箭头是 \(\partial\mathbf x/\partial\theta_2\)(按 0.5 倍长度绘制)。虚线圆是以目标为圆心、当前距离为半径的等距线:箭头在 \(\hat{\mathbf n}\) 方向上的投影越大,对应关节越"有效"。可以拖动目标,也可以用滑块手动转关节。
    • 用"走一步"或滑块让末端到目标的距离小于 0.05。
    • 拖动目标,让两个关节的灵敏度几乎相同,条形图两根一样长。此时两个关节哪一个更值得转?
    真实系统里

    数值逆运动学:把每个关节的偏导数一次性算出来,沿所有关节一起走,比一次只转一个快得多,这就是下一节梯度和 3.4 节雅可比求逆的内容。灵敏度分析:标定时关心"哪个参数的误差对末端精度影响最大",答案就是偏导数。无模型机器人:当 \(f\) 是黑盒(比如硬件测得的力或气味浓度)时,机器人用 FIG 2 的办法,对每个自由度各"晃一下",用差商估计偏导;每多一个自由度就要多测一次,代价随维度线性增长,噪声大时还要多次平均。

    7常见误区

    误区 1:偏导数全为 0 就是极值点

    不一定。FIG 1 里的鞍面在原点两个偏导都是 0,但沿 \(x\) 是谷底、沿 \(y\) 是山顶。要区分极小、极大、鞍点,需要二阶信息(3.5 节的 Hessian)。

    误区 2:偏导数都存在,函数就"可微"

    偏导数只检查了沿坐标轴的两个方向。函数 \(f(x,y) = xy/(x^2+y^2)\)(\(f(0,0)=0\))在原点处两个偏导数都是 0,但沿对角线方向 \(f\) 恒等于 \(\tfrac12\),函数在原点甚至不连续,FIG 3 的一阶近似当然失败。放心:只要偏导数连续,函数就是可微的,机器人里遇到的光滑模型基本都满足。

    误区 3:"固定其余变量"取决于你选了什么变量

    \(\partial f/\partial x\) 的含义依赖于同时使用的其他坐标。以 \(r=\sqrt{x^2+y^2}\) 为例:用坐标 \((x,y)\) 时"固定 \(y\)、让 \(x\) 变",得 \(\partial r/\partial x = x/r\);改用坐标 \((x,\theta)\) 时"固定 \(\theta\)、让 \(x\) 变",由 \(x=r\cos\theta\) 得 \(\partial r/\partial x = 1/\cos\theta = r/x\)。同样写作 \(\partial r/\partial x\),两者却不同。机器人里要明确:偏导是对关节角、对笛卡尔坐标,还是对李代数里的扰动。

    误区 4:忘了各变量的单位不同

    FIG 4 中的 \(\partial d/\partial\theta_i\) 单位是"米/弧度"。把弧度偏导和米偏导直接比大小,等于把苹果和橘子比。同样是"转 0.1",转的是 0.1 弧度还是 0.1 米,影响天差地别。后面做优化时,变量的尺度不一致会让问题变得病态(6.3 节)。

    8小练习

    1. \(f(x,y) = x^2\sin y\)。\(\partial f/\partial y\) 在 \((1,\pi/2)\) 处是?
    把 \(x\) 当常数:\(f_y = x^2\cos y\)。代入得 \(1\cdot\cos(\pi/2) = 0\)。选项 A(\(2\))是 \(f_x = 2x\sin y\) 在这一点的值,求错了变量。
    2. 已知 \(f(1,2)=5\),\(f_x(1,2)=3\),\(f_y(1,2)=-1\)。用一阶近似估计 \(f(1.1,\,1.9)\)。
    \(\delta_x = 0.1\),\(\delta_y = -0.1\)。变化量约 \(3\times0.1 + (-1)\times(-0.1) = 0.3+0.1 = 0.4\),所以 \(f\approx 5.4\)。注意 \(y\) 减小了,而 \(f_y<0\),两个负号相乘,这一项反而是正的。
    3. 用差商 \((f(\mathbf p+h\mathbf e_x)-f(\mathbf p))/h\) 估计偏导,传感器有噪声。把 \(h\) 一直缩小,通常会怎样?
    差商里的噪声贡献约 \(\sqrt2\,\sigma/h\),随 \(h\) 变小而增大;截断误差约正比于 \(h\),随 \(h\) 变小而减小。两者之和在某个中间的 \(h\) 处最小(FIG 2)。
    4. 两连杆臂当前 \(\partial d/\partial\theta_1 = -0.8\),\(\partial d/\partial\theta_2 = +0.3\)(单位:米/弧度)。只转一个关节、转 0.1 rad,想让距离减小得最多,应该?
    变化量约 \(\frac{\partial d}{\partial\theta_i}\Delta\theta_i\)。关节 1 的灵敏度绝对值更大,且符号为负,正转 \(+0.1\) 使 \(d\) 变化 \(-0.08\) m。关节 2 反转虽然也能让 \(d\) 减小,但只有 \(0.03\) m。最后一项把单位和数量级弄错了。

    9延伸阅读

    • Khan Academy, Multivariable Calculus — Grant Sanderson(3Blue1Brown)主讲的多元函数、偏导数与"切片"直觉
    • G. Strang, Calculus (MIT OpenCourseWare) — 多元函数、偏导数与线性近似
    • S. Boyd & L. Vandenberghe, Convex Optimization, Appendix A.4 — 导数、梯度与链式法则的简明复习
    • J. Nocedal & S. Wright, Numerical Optimization, Ch. 8 — 有限差分近似导数及其步长选择