多元函数与偏导
机器人的世界里,几乎没有只依赖一个变量的量:末端到目标的距离同时取决于每个关节角,信号强度同时取决于 \(x\) 和 \(y\),损失同时取决于几百万个参数。把其余旋钮都固定住,只拧动其中一个,输出会变多快?这个"单旋钮的灵敏度"就是偏导数。
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\) 移来移去。
- 找到一个两个偏导数同时为 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\) 拉到很小,会发生什么?
- 噪声设为 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\)。每一小段都是"一元问题",变化量约等于斜率乘以步长。两段加起来,就是总变化的一阶预测:
拖动下图中的紫色手柄 \(\mathbf q = \mathbf p + \boldsymbol\delta\),黄点 \(\mathbf p\) 也可以拖动。右边的瀑布图把预测的变化拆成两块:红色是 \(x\) 方向贡献的 \(f_x\delta_x\),绿色接在它后面,是 \(y\) 方向贡献的 \(f_y\delta_y\);琥珀色条是 \(f\) 的真实变化,紫色竖虚线标出预测值。
- 把 \(\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\) 个坐标变化的一元导数:
其中 \(\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\):
在 \(\mathbf p=(2,0)\) 处:\(f_x = 0\),\(f_y = 4 + 1 = 5\)。沿 \(x\) 方向,函数此刻是平的(因为 \(y=0\) 把 \(x^2y\) 整个压没了),沿 \(y\) 方向的坡度是 5。
一阶近似与全微分
FIG 3 的结论可以写成一般形式。把所有偏导数收在一起,用 1.7 节的点积来写:
方括号里是一个行向量,它就是下一节的梯度 \(\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_{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}\),于是:
读法:\(\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):每次只沿一根坐标轴优化。
- 用"走一步"或滑块让末端到目标的距离小于 0.05。
- 拖动目标,让两个关节的灵敏度几乎相同,条形图两根一样长。此时两个关节哪一个更值得转?
数值逆运动学:把每个关节的偏导数一次性算出来,沿所有关节一起走,比一次只转一个快得多,这就是下一节梯度和 3.4 节雅可比求逆的内容。灵敏度分析:标定时关心"哪个参数的误差对末端精度影响最大",答案就是偏导数。无模型机器人:当 \(f\) 是黑盒(比如硬件测得的力或气味浓度)时,机器人用 FIG 2 的办法,对每个自由度各"晃一下",用差商估计偏导;每多一个自由度就要多测一次,代价随维度线性增长,噪声大时还要多次平均。
7常见误区
不一定。FIG 1 里的鞍面在原点两个偏导都是 0,但沿 \(x\) 是谷底、沿 \(y\) 是山顶。要区分极小、极大、鞍点,需要二阶信息(3.5 节的 Hessian)。
偏导数只检查了沿坐标轴的两个方向。函数 \(f(x,y) = xy/(x^2+y^2)\)(\(f(0,0)=0\))在原点处两个偏导数都是 0,但沿对角线方向 \(f\) 恒等于 \(\tfrac12\),函数在原点甚至不连续,FIG 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\),两者却不同。机器人里要明确:偏导是对关节角、对笛卡尔坐标,还是对李代数里的扰动。
FIG 4 中的 \(\partial d/\partial\theta_i\) 单位是"米/弧度"。把弧度偏导和米偏导直接比大小,等于把苹果和橘子比。同样是"转 0.1",转的是 0.1 弧度还是 0.1 米,影响天差地别。后面做优化时,变量的尺度不一致会让问题变得病态(6.3 节)。
8小练习
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 — 有限差分近似导数及其步长选择