梯度与方向导数
站在山坡上,朝东走是上坡,朝北走是下坡,朝东北走又是另一种坡度:坡度取决于方向。方向导数回答"朝这个方向走,坡度是多少",梯度把所有方向的答案压缩成一个向量:它指向最陡的上坡,长度就是那里的最大坡度,并且总是垂直于等高线。从优化、势场导航到神经网络训练,机器人学里"往哪边走最划算"的问题,答案几乎都是梯度。
1为什么机器人需要它
上一节的偏导数只回答了"沿 \(x\) 轴"和"沿 \(y\) 轴"两个方向。真实的机器人想知道的是任意方向:
- 势场导航:地图上每一点有一个"代价",终点最低、障碍物附近很高。机器人朝代价下降最快的方向挪一步,就是沿着负梯度走。
- 优化与学习:逆运动学、标定、轨迹优化、训练神经网络,都是"调整参数让代价变小",每一步沿着负梯度(6.3 节)。
- 感知:图像梯度给出边缘的方向;SDF(有符号距离场)的梯度指向离最近障碍物最远的方向,是避障的常用信息。
- 灵敏度:灵敏度分析问"参数朝哪个方向变化,对输出影响最大",答案还是梯度。
这一节把"每个坐标方向的坡度"升级成"任意方向的坡度",并说明为什么梯度这个小小的向量能回答所有这些问题。
2直觉:绕着脚下转一圈
想象站在山坡上的点 \(\mathbf p\),原地转一圈,每个朝向 \(\mathbf u\)(单位向量)都有一个脚下的坡度,叫做方向导数 \(D_{\mathbf u}f(\mathbf p)\):沿着 \(\mathbf p + t\mathbf u\) 走,\(f\) 对 \(t\) 的变化率。转一圈的过程中,坡度有一个最大值(最陡上坡的方向)、一个最小值(最陡下坡,恰好是反方向),以及两个正好为 0 的朝向:沿着等高线走,高度不变。
这条坡度曲线形状非常规整:它是一条余弦曲线。峰值的位置就是梯度的方向,峰值的高度就是梯度的长度。下面亲手验证。
3动手玩:方向导数罗盘
左边是等高线图(越偏青色越低,越偏紫色越高)。拖动黄点 \(\mathbf p\),再拖动紫色手柄设定朝向 \(\mathbf u\)。琥珀色大箭头是梯度 \(\nabla f(\mathbf p)\),青色线是穿过 \(\mathbf p\) 的等高线切线。右边把方向导数 \(D_{\mathbf u}f\) 画成朝向角 \(\varphi\) 的函数,竖线标出当前的 \(\varphi\)。
- 转动 \(\mathbf u\),让方向导数最大(右图曲线的峰顶)。此时 \(\mathbf u\) 和梯度箭头是什么关系?这个最大值等于什么?
- 让 \(D_{\mathbf u}f\approx 0\),但梯度并不为零(\(\|\nabla f\|>0.3\))。此时 \(\mathbf u\) 沿着什么线?
- 让方向导数取最小值。这时 \(\mathbf u\) 与梯度成多大的角?
任何方向的坡度都是梯度在这个方向上的投影:\(D_{\mathbf u}f = \nabla f\cdot\mathbf u = \|\nabla f\|\cos\varphi\)(点积,1.7 节)。所以:梯度方向最陡(\(\varphi=0\),坡度 \(\|\nabla f\|\));反方向最陡下降(\(\varphi=\pi\));垂直方向(\(\varphi=\pm\pi/2\))坡度为 0,那就是等高线的方向。
4第二视角:梯度场与沿梯度的流线
在每个点都画一支梯度箭头,就得到一个梯度场。下图把它画在等高线上:箭头处处垂直于等高线,指向函数增大的一侧,越陡越长。点击地图任意位置放下一个"种子":青色线是从那里一路往下走的最速下降线,琥珀色线是一路往上走的最速上升线。你会看到这些线像水流一样,垂直地穿过每一圈等高线。
- 放下至少 3 个种子,检验:流线与每一圈等高线都垂直相交。
- 切到"鞍面",在 \(x\) 轴附近(\(|y|<0.4\)、\(|x|>1.5\))放一个种子:下降线先接近原点,然后拐弯离开。梯度在原点为 0,原点是什么点?
最后看一步"沿着负梯度走"。从 \(\mathbf p\) 出发,走到 \(\mathbf p' = \mathbf p - \eta\nabla f(\mathbf p)\),\(\eta\) 是步长。右图画出 \(f\) 沿这条射线的切片 \(\phi(\eta)=f(\mathbf p-\eta\nabla f)\),以及它在 \(\eta=0\) 处的切线(斜率恰好是 \(-\|\nabla f\|^2\))。步子够小,\(f\) 一定下降;步子太大,会冲过谷底,甚至更高。
- 选一个小步长,让 \(f(\mathbf p')\) 比 \(f(\mathbf p)\) 小,并且与一阶预测几乎重合。
- 把步长加大,直到 \(f(\mathbf p')\) 反而比 \(f(\mathbf p)\) 更大。方向明明是下降方向,为什么?(提示:曲率,3.5 节会回答。)
5再看数学
提示:把鼠标悬停在公式中带底色的符号上,FIG 1 中对应的元素会被高亮。
梯度与方向导数
设 \(f:\R^n\to\R\) 可微。梯度是把全部偏导数(3.1 节)排成的列向量:
其中 \(\|\mathbf u\|=1\)。用 3.1 节的一阶近似 \(f(\mathbf p+h\mathbf u)\approx f(\mathbf p)+\nabla f\cdot(h\mathbf u)\) 代入,立刻得到
不等式就是柯西–施瓦茨不等式(点积的绝对值不超过长度之积)。等号在 \(\mathbf u\) 与梯度同向或反向时成立,所以:梯度方向是最陡上升方向,最大坡度 \(=\|\nabla f\|\);负梯度方向是最陡下降方向。注意 \(\mathbf u\) 必须是单位向量,否则方向导数要先除以 \(\|\mathbf u\|\)。特别地,取 \(\mathbf u=\mathbf e_j\) 得 \(D_{\mathbf e_j}f=\partial f/\partial x_j\):偏导数是方向导数的特例。
梯度垂直于等高线
设 \(\mathbf c(t)\) 是一条等高线(水平集 \(f=c\))上的光滑曲线,则 \(f(\mathbf c(t))\equiv c\)。两边对 \(t\) 求导,用链式法则(2.2 节):
曲线的速度 \(\mathbf c'\) 就是等高线的切向,所以梯度垂直于等高线(在 \(\nabla f\neq\mathbf 0\) 的地方)。等高线越密,说明 \(\|\nabla f\|\) 越大。
沿负梯度走一步
只要 \(\nabla f\neq\mathbf 0\),对足够小的 \(\eta\),\(f\) 一定下降。余项 \(O(\eta^2)\) 由曲率决定(Hessian,3.5 节),它决定"足够小"到底是多小。这就是 6.3 节梯度下降的全部起点。
与雅可比、链式法则的关系
对标量函数,雅可比(3.3 节)只有一行:\(J_f=\nabla f^\top\)。梯度是列,雅可比是行,只差一个转置,但它们在"什么空间里"的意义不同:梯度是输入空间里的向量,雅可比是把输入变化映到输出变化的线性映射。链式法则也因此有梯度版本。若 \(c(\mathbf q)=g(F(\mathbf q))\),\(F:\R^n\to\R^m\)、\(g:\R^m\to\R\),则
例如机械臂 IK 的代价 \(c(\boldsymbol\theta)=\tfrac12\|F(\boldsymbol\theta)-\mathbf t\|^2\)(\(F\) 是正运动学),\(\nabla g=F-\mathbf t\),于是 \(\nabla c=J^\top(F-\mathbf t)\)。沿负梯度走一步就是 \(\alpha J^\top(\mathbf t-F)\),也就是 3.4 节"转置法"的更新 \(\alpha J^\top\mathbf e\)(那里误差定义为 \(\mathbf e=\mathbf t-F\))。
例题
\(f(x,y)=x^2y\),点 \(\mathbf p=(1,2)\),方向 \(\mathbf u=(3,4)/5\)。\(\nabla f=(2xy,\;x^2)=(4,\;1)\),\(\|\nabla f\|=\sqrt{17}\approx4.12\)。方向导数 \(D_{\mathbf u}f=(4\cdot3+1\cdot4)/5=3.2\),小于最大值 \(4.12\)。最陡上升方向是 \((4,1)/\sqrt{17}\),沿等高线的方向是 \((1,-4)/\sqrt{17}\)(与梯度的点积 \(4-4=0\))。
6机器人中的它:人工势场导航
经典的局部避障方法(Khatib, 1986)给环境造一个标量"势能" \(U(\mathbf x)\):目标处是山谷(吸引势),障碍物周围是陡峭的山丘(排斥势)。机器人只做一件事:沿着负梯度走,\(\dot{\mathbf x}=-\nabla U(\mathbf x)\),就像一颗小球滚下山。
下图用的就是这个势场。拖动绿色目标、蓝色起点和红色障碍物,机器人的轨迹由真实的 \(-\nabla U\) 积分得到。只改排斥强度 \(k_r\):太弱会撞上障碍物,太强会把狭窄通道也堵死。
- 让机器人绕过障碍物,到达目标且不进入任何障碍物。
- 把两个障碍物并排放在起点与目标的连线上,中间只留一条窄缝,让机器人卡在局部极小(\(\nabla U=0\) 但没到目标)。怎样才能让它脱困?
局部极小是势场法的老毛病:梯度为零不等于到了目标。实际系统常把势场与全局规划器配合(全局路径给出"航点",局部势场负责避障),或者使用没有局部极小的导航函数、距离场(SDF)梯度。轨迹优化(CHOMP 等)把障碍代价写成沿轨迹的积分,也靠 SDF 的梯度把轨迹从障碍物里"推"出来。操作空间里,末端受到的"虚拟力"\(-\nabla U\) 再用 3.4 节的 \(\boldsymbol\tau=J^\top\mathbf F\) 变成关节力矩,就是经典的势场控制。
7常见误区
梯度只是局部最陡的方向。在狭长的山谷里,梯度几乎垂直于谷底方向,指向对面谷壁而不是最低点(FIG 3 把 \(a\) 调大就能看到)。这正是梯度下降会"之"字形前进的原因(6.3 节)。
\(D_{\mathbf u}f=\nabla f\cdot\mathbf u\) 只对 \(\|\mathbf u\|=1\) 成立。如果直接拿 \(\mathbf u=(1,1)\) 点乘,会得到 \(\sqrt2\) 倍的答案,那是"沿 \((1,1)\) 走一个单位的参数时的变化率",而不是"每走一米的变化率"。
"最陡"依赖于你怎么量距离。如果状态向量里一个分量是米、另一个是弧度,或者把某个轴的单位从米改成毫米,梯度的方向就变了(因为"走一步"的含义变了)。机器人里把位置和角度放进同一个优化变量时,要么先缩放变量,要么使用考虑尺度的度量(预条件)。
\(\nabla f=\mathbf 0\) 的点叫驻点,可能是极小、极大,也可能是鞍点(FIG 2 的"鞍面")。FIG 4 中的局部极小同样是梯度为零。区分它们要看二阶信息:Hessian(3.5 节)。
8小练习
9延伸阅读
- Khan Academy, Multivariable Calculus — Grant Sanderson(3Blue1Brown)主讲的梯度与方向导数视频
- G. Strang, Calculus (MIT OpenCourseWare) — 梯度、方向导数与等高线
- S. Boyd & L. Vandenberghe, Convex Optimization, Appendix A.4 & Ch. 9 — 梯度的定义,以及梯度下降的收敛性
- O. Khatib, Real-Time Obstacle Avoidance for Manipulators and Mobile Robots, Int. J. Robotics Research 5(1), 1986 — 人工势场法的经典论文
- S. LaValle, Planning Algorithms, Ch. 5 — 势场、导航函数与局部极小