JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

梯度、方向导数与黑塞矩阵

站在山坡上,问三个问题:哪个方向最陡,若我朝那个方向走、地面倾斜得多快,以及这一处是峰、是谷、还是垭口?梯度、方向导数和黑塞矩阵回答了这全部三个问题——它们是多元函数的一阶与二阶导数,打包得恰好能彼此咬合。

从偏导数到一支箭头

第一卷给了你偏导数:冻结除一个之外的所有变量,像回到单变量微积分那样去求导。对函数 f(x, y),偏导数 d f/d x 和 d f/d y 量度你正朝东、正朝北行走时曲面的斜率。麻烦在于,东和北只是你可以行走的无穷多方向中的两个,而山坡并不在乎你的地图恰好指向哪边。自然的下一个问题才是诚实的那个:从某点出发,沿一个任意方向,地面有多陡?回答它,会把两个偏导数拢成一个对象,它指向函数最想去的方向。

把偏导数收进一个向量,你就得到[[gradient-steepest-ascent|梯度]],记作 nabla f = (d f/d x, d f/d y, ...)。这里 nabla 是del 算子——把它读作一条指令:「取所有一阶偏导数,把它们叠成一个向量」。在第一卷里你把 nabla f 当作一串数字;如今的飞跃,是要把它的方向和长度当作几何来认真对待。梯度不只是偏导数的记账。它是一支箭头,栖居在定义域的每一点;它指向何方、有多长,将原来承载着这个函数全部的一阶信息。

为了把「任意方向上的陡度」说精确,取一个单位向量 u——一个长度恰好为一的方向——并问 f 沿 u 迈步时的变化率。这个变化率就是[[calc-directional-derivative|方向导数]],记作 D_u f。你可以照第一卷定义任何导数的方式来定义它:作为一个极限,D_u f = lim as h -> 0 of (f(point + h u) - f(point)) / h。这恰恰是当你用一个沿方向 u 竖立的平面切开曲面、再看平面切山所得曲线时,你读到的那个斜率。朝东走、u = (1, 0),便还原出 d f/d x;朝北走、u = (0, 1),便还原出 d f/d y。偏导数不过是两个特殊的方向导数,而现在我们有了其余所有的方向。

梯度指向最陡的上坡方向

下面是核心的恒等式,它是全部应用数学里最有用的方程之一:对一个可微函数,方向导数不过是梯度与你所选方向的点积,D_u f = nabla f . u。这一个公式就是整台引擎。沿坐标轴方向走,复现偏导数;沿任何别的 u 走,你只需把梯度投影到 u 上。计算无穷多个斜率,坍缩为一支箭头和一次点积。(一句诚实的提醒:这个干净的公式假定 f 在该点是真正可微的,而不只是偏导数存在——一个函数可以两个偏导数都存在,却仍沿某条对角线撕裂或起棱,那时这条点积法则就失效了。前一篇关于多元可微性的指南,正是这个区别所在之处。)

现在从点积里榨出几何来。把它写成 nabla f . u = |nabla f| |u| cos(theta),其中 theta 是梯度与你的方向之间的夹角。由于 u 是单位向量,|u| = 1,于是 D_u f = |nabla f| cos(theta)。你唯一能掌控的是 theta——而 cos(theta) 在 theta = 0 时最大、等于 1,也就是你与梯度同方向行走时。所以梯度指向最陡上升的方向,而你在那一点任何地方能找到的最陡斜率,恰恰是 |nabla f|,即梯度的长度。掉头(theta = 180 度,cos = -1),你得到最陡的下降,斜率为 -|nabla f|——以最快的方式指向山下。这正是机器学习那个主力算法被称作梯度下降的缘由:要尽可能快地下坡,就朝梯度的相反方向迈步。

还有第三个方向值得单独成行:当 theta = 90 度,cos(theta) = 0,于是 D_u f = 0。恰好垂直于梯度行走时,函数到一阶为止根本不变——你正沿着山坡等高地走,既不爬升也不下降。这组零变化的方向,正是某条等高线的切向,而它直接引出下一个观念。

与水平集垂直

水平集(等高线、等值线、等势线)是 f 保持某个单一常值的点的集合——地形图上那些闭合的圈,每一圈描出一个固定的海拔。钉住一个事实,大量几何便随之而来:梯度在每一点都垂直于过该点的水平集。论证正是我们刚刚留意到的那件事。如果你沿一条水平集移动,按定义 f 保持常值,所以它沿那个方向的变化率为零,于是对任何与等高线相切的方向 u,D_u f = nabla f . u = 0。一个非零的梯度,若它与每一个切向的点积都消失,就必定与它们全部正交——它笔直地从等高线里戳出来。梯度就是等高线的法向。

这正是整套等高线地图语言背后的秘密,值得让它沉淀下来。等高线挤得越密,梯度越长(地面越陡——一小步水平就跨过许多海拔层);等高线铺得越开,梯度越短(地面越缓)。梯度总是以直角穿过等高线,这就是为什么在山坡上松开的玻璃珠会垂直于等高线滚落,也是为什么河流寻求最陡下降时是横切等高线、而非沿其流淌。同一个事实一字不差地升级到更高维:对函数 f(x, y, z),水平是曲面,而 nabla f 是那张曲面的法向量——这是为隐式地由 f(x, y, z) = 常数 定义的曲面找切平面最干净的办法,而那恰恰是隐函数定理(下一篇指南)所立足之处。

二阶:黑塞矩阵与碗

梯度是一阶导数;要彻底理解一个点,你需要二阶。回想第一卷里的单变量泰勒展开:f(a + h) 约等于 f(a) + f'(a) h + (1/2) f''(a) h^2,即取值,加一个线性倾斜,再加一个二次弯曲。多变量版本恰好保持这个形状,只是每个导数都长大了。常数仍是一个数。一阶项变成梯度与步长的点积:nabla f . h。而二次项需要一只新生物,因为在多变量里,二阶导数不是一个数,而是一整张网格——每个偏导数的每个偏导数。那张网格就是[[calc-hessian-matrix|黑塞矩阵]] H,二阶偏导数构成的矩阵,在两个变量下 H = [d^2f/dx^2, d^2f/dxdy; d^2f/dydx, d^2f/dy^2]。

Single variable     f(a + h) = f(a)  +  f'(a) h        +  (1/2) f''(a) h^2  + ...

Several variables   f(a + h) = f(a)  +  (nabla f . h)   +  (1/2) h^T H h     + ...
                               value      gradient term       Hessian term
                                          (1st derivative)    (2nd derivative)

Hessian   H = [ f_xx   f_xy ;        gradient   nabla f = ( f_x , f_y )
                f_yx   f_yy ]        ( H is symmetric:  f_xy = f_yx  when f is C^2 )

h^T H h  is a number: it measures the curvature of f felt along the step h.
一阶与二阶泰勒展开并排摆放:梯度替换了 f',黑塞矩阵替换了 f''。二次项 h^T H h 是把步长 h 喂进黑塞矩阵、产出一个单一的数——沿方向 h 望去所见的曲率。

现在读这个二阶泰勒展开 f(a + h) 约等于 f(a) + nabla f . h + (1/2) h^T H h,留意每一块各司其职得多么干净。常数说出你在哪儿;梯度项让逼近曲面倾斜(它就是你早已从线性逼近认得的切平面);而黑塞项 h^T H h 把它弯成一只碗、一座穹顶或一个鞍。记号 h^T H h 的意思是:取你的步长 h,乘以黑塞矩阵,再与 h 点积一次——结果是一个单一的数,即你沿 h 望去时函数显出的曲率。一处值得诚实点出的微妙:对二次连续可微的函数,混合偏导数相等,d^2f/dxdy = d^2f/dydx(克莱罗定理),所以黑塞矩阵是对称的。这种对称不是装饰——它正是黑塞矩阵拥有我们即将用到的那套干净曲率谱的缘由。

读懂曲率:峰、谷,还是垭口

黑塞矩阵在这里挣得了它的工钱。在一个驻点——nabla f = 0 的点,单变量里 f'(x) = 0 之处的多元类比——梯度项消失,整个局部形状由二次项 (1/2) h^T H h 决定。于是「这是极大、极小,还是都不是?」这个问题,纯粹变成关于黑塞矩阵的问题:h^T H h 是恒正、恒负,还是当你把方向 h 转一圈时变号?对称矩阵的这个性质就是它的定性(定号性)。若对每个非零 h 都有 h^T H h > 0,黑塞矩阵是正定的:曲面在每个方向上都向上弯,此点是一只碗、一个局部极小。若是负定(每个方向都向下弯),则是局部极大。若 h^T H h 在某些方向为正、在另一些方向为负,此点便是[[saddle-point|鞍点]]——一个方向上坡、横切的方向下坡,像一道山口或马鞍的坐处。

怎样不去检查无穷多个方向 h 就判定定号性?因为黑塞矩阵是对称的,它有实特征值,而那些特征值就是沿着碗最纯净的那些相互垂直的特殊方向上的曲率。符号法则再干净不过:特征值全正即正定(极小),全负即极大,符号混杂即鞍点。对一个 2×2 的黑塞矩阵,这归结为熟悉的二阶导数判别法:算行列式 D = f_xx f_yy - (f_xy)^2。若 D > 0 且 f_xx > 0,你有一个极小;若 D > 0 且 f_xx < 0,是极大;若 D < 0,是鞍点。那个行列式不过是两个特征值的乘积,所以 D < 0 意味着它们异号——这恰恰是乔装打扮的鞍点条件。

把三者合在一起

退一步,看看这三个对象咬合得多么紧密,因为这种连贯正是本章真正的奖赏。梯度是函数的一阶导数——一支箭头,通过点积编码了每一个方向上的斜率,指向最陡的上坡,并垂直于水平集。黑塞矩阵是函数的二阶导数——一个对称矩阵,通过 h^T H h 编码了每一个方向上的曲率,并在驻点处裁定峰、谷还是垭口。方向导数是桥梁:它是你如何从这些「整体导数」对象里、沿你乐意的任意方向,读出一个单一的数——一个斜率,或配上黑塞矩阵则是一个曲率。一阶导数、二阶导数,再加上对它们采样的配方:多变量函数的全部局部几何,尽在这三个相伴的观念之中。

  1. 算梯度 nabla f,即一阶偏导数的向量。它的方向是最陡上升,它的长度 |nabla f| 是最陡的斜率,而它垂直于过该点的水平集。
  2. 要任意一个所选单位方向 u 上的斜率,就取点积 D_u f = nabla f . u;它等于 |nabla f| cos(theta),沿梯度最大、横切梯度为零。
  3. 要分类一个驻点(nabla f = 0 之处),构造二阶偏导数的黑塞矩阵 H,并经由特征值的符号、或对 2×2 经由 D = f_xx f_yy - (f_xy)^2 来检验它的定号性。
  4. 读出答案:曲率全正是极小,全负是极大,符号混杂是鞍点;某个特征值为零使判别失效,那就去看更高阶的项。

这三件套不是故事的终点,而是它的发射台。紧接着的下一篇指南,会拿「梯度即法向」的观念和局部线性图景,证明你能把 f(x, y) = 常数 解出一个变量用其余变量表示——隐函数定理与反函数定理。再下一级的多元优化,整个就栖居于此:令 nabla f = 0 找候选点,读黑塞矩阵把它们分类,并沿 -nabla f 下坡,在梯度下降最速下降中真正抵达一个极小。从训练神经网络、到塑造机翼、到用最小二乘拟合数据,底下都是一台计算梯度、检视黑塞矩阵的机器。你刚刚造好了那台机器的两个齿轮,以及连接它们的轴。