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

多变量:偏导数与梯度

直到现在,你的函数只接收一个输入,你也只量一个斜率。但真实世界同时有许多旋钮——温度同时取决于纬度和经度,利润同时取决于价格和数量。[[derivative-calculus|导数]]依然管用;你只是一次量一个方向,再把这些斜率打包成一支单一的箭头,叫做[[gradient|梯度]],它笔直指向上坡的方向。

从一条曲线到一片地貌

一个单变量函数 y = f(x) 画出一条曲线:一个输入,一个输出。现在放进两个输入——比如 z = f(x, y)——图像就从纸面升起,变成一个曲面,像一片悬在平坦 (x, y) 地面之上的起伏丘陵。高度 z 就是地面在点 (x, y) 之上立得有多高。山峰、谷地、山脊、鞍部:一个双变量函数实实在在就是一片地貌。

在曲线上只有一个变化率:那个斜率。但站在山坡上,「斜率」就含糊了——往哪个方向的斜率?往东走,地面也许陡升;转身往北走,它也许完全是平的,甚至往下塌。从前那一个数,分裂成了一整把扇形的斜率,你每能迈出的一个方向都对应一个。为了抓住它,我们先只量其中两个。

偏导数:冻住其他所有旋钮,只动一个

窍门美妙地简单:要量沿 x 方向的斜率,就把 y 完全按住不动,只让 x 变化。当 y 被冻结成一个常数,f(x, y) 就变成了一个关于 x 的普通单变量函数——而你已经会对它求导了。结果就是 f 关于 x 的偏导数,写作带弯钩的 df/dx,或者更常用下面那个特殊符号。它回答的是:当我朝东迈出一小步、同时停留在同一条南北线上时,高度变化得有多快?

f(x, y) = x^2 + 3*x*y + y^2

  partial f / partial x :  treat y as a constant
      ->  2x + 3y          (the y^2 term has no x, so it vanishes)

  partial f / partial y :  treat x as a constant
      ->  3x + 2y          (the x^2 term has no y, so it vanishes)
每个偏导数都只对一个变量求导,同时把另一个当成冻住的常数——还是那些普通的求导法则,一次只动一个旋钮。

从几何上看,partial f / partial x 是沿着平行于 x 轴切出的一片切面所量到的曲面斜率——你用一个竖直平面把山坡切开,读出切口上露出的那条曲线的斜率。求导本身没有任何新东西要学:你练过的每一条导数法则(幂法则、乘积法则、链式法则)都原封不动地适用。唯一要守的纪律,是记清楚哪些字母是「活的」、哪些是暂时冻住的。

梯度:把这些斜率打包成一支箭头

现在你在每一点上都有两个数:东西方向的斜率,和南北方向的斜率。梯度就只是把它们收进一支向量里,写作 grad f,或用那个倒三角:grad f = ( partial f / partial x , partial f / partial y )。这不只是记账。那支小小的箭头,携带着关于这片地貌的一条了不起的信息。

重点来了:在任意一点,梯度这支箭头指向最陡上升的方向——曲面爬升最快的那唯一一个罗盘方位——而它的长度告诉你这个最陡的攀登有多陡。正好沿着梯度迈步,你升高得最快;正好朝它的反方向迈步,你下降得最快;与它成直角迈步,你保持水平——这正是为什么梯度永远垂直于前面那些等高线。一支箭头同时编码了最佳方向和变化速率。

f(x, y) = x^2 + y^2          (a bowl, lowest at the origin)

  grad f = ( 2x , 2y )       (the two partials, bundled)

  at (3, 4):  grad f = (6, 8)
      direction = straight away from the center (steepest uphill)
      length    = sqrt(6^2 + 8^2) = sqrt(100) = 10  (the steepness there)
在碗形 f = x^2 + y^2 上,(3,4) 处的梯度指向外侧——朝上坡、远离最低点——而它的长度 10 量出了那里碗壁升得有多陡。

为什么机器钟爱梯度

大多数时候我们想往下走,而不是往上:去找一个成本、一个误差、一个损失的最低点。既然梯度指向最陡的上坡,它的反方向就指向最陡的下坡。于是一个蒙着眼的登山者,可以靠一条蠢得不能再蠢的规则找到谷底——感觉哪个方向下坡最陡(即负梯度),朝那个方向迈一小步,然后重复。这就是梯度下降,它是训练几乎每一个现代机器学习模型背后的主力。

  1. 在地貌上随便从哪里出发——给输入随便猜一个起点(在机器学习里,就是模型的初始权重)。
  2. 在那里算出梯度——损失关于每个输入的那些偏导数。这就是上坡方向。
  3. 朝它的反方向迈步:新位置 = 旧位置 - (步长)* 梯度。那个小小的步长(即「学习率」)让你不至于冲过头。
  4. 重复,直到梯度缩向零——地面变平,意味着你已经落进了一个谷底(一个极小值,至少是局部的)。