最近在复习计算数学,看到求根这一章。讨论数值方法之前,得先确认根一定存在,于是我又把代数基本定理的证明过了一遍。这一次我忽然意识到一件事:这个定理问的是“方程有没有解”,证明却一句方程都没解。它做的事情是在复平面上找 ∣p(z)∣|p(z)| 的最低点,再说明最低点的高度只能是 0。

换句话说,这是一个最优化论证。

这篇文章想顺着这个观察往下走:求根和最优化可以互相改写,但改写之后,问题的“地形”会变。代数基本定理之所以成立,归根到底是因为复平面上 ∣p∣|p| 的地形好得出奇,除了零点以外没有别的坑。

读这篇文章需要的东西不多:复数的加减乘除、一元函数的导数,再加一点多元微积分里的偏导数。用到复分析的地方,我会先讲直观,再给结论。文中有两个交互实验,可以拖动和点击,建议边读边玩。

先搭好舞台:复平面和“地形”

复数 z=x+iyz=x+iy 可以看成平面上的点 (x, y)\left(x,\ y\right),横轴叫实轴,纵轴叫虚轴。它的模

∣z∣=x2+y2|z|=\sqrt{x^2+y^2}

就是这个点到原点的距离。后面最常用的是复数乘法的几何意义:两个复数相乘,模相乘,辐角(与正实轴的夹角)相加。所以“乘以一个复数”等于“先伸缩,再旋转”。特别地,乘以 ii 就是逆时针转 90 度,这也是 i2=−1i^2=-1 的几何含义:转两次 90 度,正好指向反方向。

一个 nn 次复系数多项式写作

p(z)=anzn+an−1zn−1+⋯+a1z+a0,an≠0.p(z)=a_nz^n+a_{n-1}z^{n-1}+\cdots+a_1z+a_0,\qquad a_n\ne0.

如果 p(z0)=0p(z_0)=0,就说 z0z_0 是 pp 的根。

定理代数基本定理

每个次数 n≥1n\ge1 的复系数多项式至少有一个复数根。

有了一个根 z1z_1,就能把 pp 写成 (z−z1)q(z)\left(z-z_1\right)q(z),再对 qq 重复,所以“至少一个根”推出“恰好 nn 个根(按重数计)”。真正要证明的只有“至少一个”。

现在换个角度看 pp。对平面上每个点 zz,算出一个非负实数 ∣p(z)∣|p(z)|,把它当成这一点的“高度”。整个复平面就变成了一张地形图:

  • 高度永远不小于 0;
  • 高度等于 0 的地方,恰好就是根。

于是“pp 有没有根”变成了“这张地形图上有没有海拔为 0 的点”。下面这张图就是本文主角 p(z)=z3−2z+2p(z)=z^3-2z+2 的地形,可以拖动旋转。

这个交互图需要启用 JavaScript。

三个蓝点是三个根,地形在那里降到 0,像三个漏斗。橙色曲线是地形沿实轴的截线,后面会反复用到。

几个最优化的词

在继续之前,先把要用的最优化词汇说清楚。设 ff 是平面上的实值函数。

定义全局最小与局部最小

若对所有 zz 都有 f(z0)≤f(z)f(z_0)\le f(z),称 z0z_0 是 ff 的全局最小点。若只在 z0z_0 的某个小邻域里有 f(z0)≤f(z)f(z_0)\le f(z),称 z0z_0 是局部最小点。

局部最小像山谷里的一个小坑:站在坑底往四周看,哪儿都比脚下高,但翻过山可能还有更深的谷。

梯度。 对两个变量的函数 f(x, y)f\left(x,\ y\right),梯度是由两个偏导数组成的向量

∇f=(∂f∂x, ∂f∂y).\nabla f=\left(\frac{\partial f}{\partial x},\ \frac{\partial f}{\partial y}\right).

它指向 ff 增长最快的方向,长度是那个方向上的增长率。反过来,−∇f-\nabla f 就是下坡最陡的方向。梯度下降就是反复沿这个方向走一小步:

zk+1=zk−η ∇f(zk),z_{k+1}=z_k-\eta\,\nabla f(z_k),

其中 η>0\eta>0 是步长。

驻点与鞍点。 梯度为零的点叫驻点,在那里地面是“平”的。光滑函数的局部最小点一定是驻点,因为只要梯度不为零,沿 −∇f-\nabla f 走一小步就能更低。但驻点不一定是最小点。最典型的反例是

f(x, y)=x2−y2.f\left(x,\ y\right)=x^2-y^2.

原点处梯度为零。沿 xx 方向看,它是一个坑底;沿 yy 方向看,它是一个坡顶。这样的点叫鞍点,形状像马鞍,也像两座山之间的山口。

最小值一定存在吗? 不一定。f(x)=xf(x)=x 在开区间 (0, 1)\left(0,\ 1\right) 上没有最小值,它无限接近 0,却碰不到;e−xe^{-x} 在 [0, ∞)[0,\ \infty) 上也没有最小值,越往右越低,永远到不了底。前一个例子漏掉了边界,后一个例子跑到了无穷远。把这两种情况排除,结论就成立了:

定理最值定理(Weierstrass)

在有界闭集上连续的函数,一定能取得最小值和最大值。

“闭”保证边界点也算在内,“有界”保证不会一路跑到无穷远。在平面上,闭圆盘 {z:∣z∣≤R}\{z:|z|\le R\} 就是有界闭集。

代数基本定理的证明,其实是一个最小化问题

有了这些词,证明可以讲成三步。目标函数取 f(z)=∣p(z)∣f(z)=|p(z)|。

第一步:远处很高。 当 ∣z∣|z| 很大时,首项 anzna_nz^n 的模远大于其余各项之和,所以 ∣p(z)∣→∞|p(z)|\to\infty。优化里管这种性质叫 coercive:越往外走越高,最低点不可能藏在无穷远处。

第二步:最低点存在。 取一个足够大的圆盘,使得圆盘外的高度都超过 ∣p(0)∣|p(0)|。圆盘是有界闭集,∣p∣|p| 连续,由最值定理,它在圆盘里有最小点 z0z_0。圆盘外的点都比 ∣p(0)∣|p(0)| 高,自然也比 ∣p(z0)∣|p(z_0)| 高,所以 z0z_0 是整个复平面上的全局最小点。

第三步:最低点的高度是 0。 这是整个证明的核心,靠的是下面这个引理。

引理达朗贝尔引理

若 pp 不是常数且 p(z0)≠0p(z_0)\ne0,则在 z0z_0 的任意小邻域里,都存在一点 zz 使 ∣p(z)∣<∣p(z0)∣|p(z)|<|p(z_0)|。

换成最优化的话说:不是根的点,一定不是局部最小点。

为什么?把 pp 在 z0z_0 附近展开成 w=z−z0w=z-z_0 的多项式。设 kk 是第一个系数不为零的正次项:

p(z0+w)=p(z0)+c wk+(更高次项),c≠0.p(z_0+w)=p(z_0)+c\,w^k+(\text{更高次项}),\qquad c\ne0.

ww 很小时,更高次项比 c wkc\,w^k 小得多,可以先忽略。要让 ∣p∣|p| 变小,就要让 c wkc\,w^k 这一项把 p(z0)p(z_0) 往原点方向拉,也就是让 c wkc\,w^k 指向 −p(z0)-p(z_0) 的方向。

这一步的关键是复数乘法的几何意义。写 w=reiθw=re^{i\theta},那么 wkw^k 的辐角是 kθk\theta,c wkc\,w^k 的辐角是 arg⁡c+kθ\arg c+k\theta。想让它等于 −p(z0)-p(z_0) 的辐角,只要解出 θ\theta 就行,而这总是解得出来的:转角除以 kk 而已。确定了方向,再取足够小的 rr,就得到

∣p(z0+w)∣≈∣p(z0)∣−∣c∣ rk<∣p(z0)∣.|p(z_0+w)|\approx|p(z_0)|-|c|\,r^k<|p(z_0)|.

看一个最简单的例子:p(z)=z2+1p(z)=z^2+1,z0=0z_0=0。这里 p(0)=1p(0)=1,k=2k=2,c=1c=1。要让 w2w^2 指向 −1-1,取 w=irw=ir 即可,因为 (ir)2=−r2(ir)^2=-r^2:

p(ir)=1−r2<1.p(ir)=1-r^2<1.

如果只允许实数 ww,这一步就做不到:实数的平方永远不是负数,p(w)=1+w2≥1p(w)=1+w^2\ge1。复数多出来的那个维度,正好提供了下坡的方向。这一点后面还会反复出现。

三步合起来:最低点存在,而不是根的点都不可能是最低点,所以最低点就是根。严格的估计(把更高次项控制住)我在复数那篇笔记里写过,这里不再重复。

这条路线有一段曲折的历史。达朗贝尔在 1746 年给出了这个引理,但他默认了最小值存在。高斯 1799 年的博士论文专门批评过包括达朗贝尔在内的早期证明。阿尔冈在 1806 年和 1814 年的工作里用“取 ∣p∣|p| 的最小值”把论证组织成今天的样子,柯西 1821 年的《分析教程》也沿用了它。可第二步依赖的最值定理,要等到十九世纪后半叶魏尔斯特拉斯的工作才算真正严格[1][1] H. D. Ebbinghaus, H. Hermes, F. Hirzebruch, M. Koecher, K. Mainzer, J. Neukirch, A. Prestel, and R. Remmert, Numbers. Springer, 1991. Chapter 4, R. Remmert, The Fundamental Theorem of Algebra., [2][2] B. Fine and G. Rosenberger, The Fundamental Theorem of Algebra. Springer, 1997.。也就是说,这个证明里最“分析”的一块,恰好是最优化里最基础的那条存在性定理。

两个方向的改写

一旦这样看,就会发现求根和最优化之间本来就有两座桥。

从求根到最优化。 要解方程组 F(x)=0F(x)=0,可以去最小化

ϕ(x)=12∥F(x)∥2.\phi(x)=\tfrac{1}{2}\|F(x)\|^2.

这里 ∥F∥\|F\| 是向量的长度,ϕ≥0\phi\ge0,而且 ϕ(x)=0\phi(x)=0 当且仅当 F(x)=0F(x)=0。所以只要最小值等于 0,最小点就是根。系数 12\tfrac{1}{2} 只是为了求导后好看。非线性最小二乘、Gauss–Newton 法都从这里出发。

从最优化到求根。 要最小化光滑函数 ff,前面说过,局部最小点一定满足

∇f(x)=0.\nabla f(x)=0.

这是一个方程组。费马在十七世纪三十年代就用类似的想法找极值。用 Newton 法做优化,其实就是对梯度 ∇f\nabla f 做 Newton 求根。

两座桥都通,但过桥之后,风景不一样。下面用一个具体的多项式来看。

一个例子:实数轴上的假坑

还是那个

p(x)=x3−2x+2.p(x)=x^3-2x+2.

它是数值分析课上的老朋友:Newton 法从 0 出发,会在 0 和 1 之间来回跳,永远不收敛。它有一个实根,约为 −1.7693-1.7693,另外两个是共轭复根 0.8846±0.5897i0.8846\pm0.5897i。

先只在实数轴上,用“最小化 p(x)2p(x)^2”来求根。p′(x)=3x2−2p'(x)=3x^2-2 在 x=±2/3≈±0.8165x=\pm\sqrt{2/3}\approx\pm0.8165 处为零。记 x0=2/3x_0=\sqrt{2/3},在这一点 pp 取得局部最小值,约为 0.911,不是 0。

这就是一个假坑:它是 p2p^2 的局部最小点,却不是根。在实数轴上做梯度下降,起点只要在 −0.8165-0.8165 右边,就会滑进这个坑出不来。只在实数里做最优化改写,丢掉了求根问题的本意。

同样的事情在 x2+1x^2+1 上更直白:它在实数轴上的最低点是 x=0x=0,高度为 1,而它根本没有实根。

上图是 |p(x)| 在实轴上的曲线,在 x≈-1.769 处降到 0,在 x0=√(2/3) 处有一个高约 0.911 的局部最小。下图过 x0 比较两个方向:沿实方向 |p| 向两侧升高,沿虚方向 |p| 向两侧降低。

上图是 |p(x)| 在实轴上的曲线,在 x≈-1.769 处降到 0,在 x0=√(2/3) 处有一个高约 0.911 的局部最小。下图过 x0 比较两个方向:沿实方向 |p| 向两侧升高,沿虚方向 |p| 向两侧降低。

上半张图是实轴上的 ∣p(x)∣|p(x)|:左边是真正的根,右边是假坑。下半张图过同一个点 x0x_0,比较沿实方向和沿虚方向走时 ∣p∣|p| 的变化,下一节就来解释它。

到了复平面,假坑变成了鞍点

现在把 x0x_0 放进复平面里看。在这一点 p′(x0)=0p'(x_0)=0,所以展开式里一次项消失,第一个非零项是二次项:

p(x0+w)≈0.911+2.449 w2.p(x_0+w)\approx 0.911+2.449\,w^2.

这正是达朗贝尔引理里 k=2k=2 的情形。沿实轴走,ww 是实数,w2>0w^2>0,∣p∣|p| 变大,所以在实轴上看它是坑底。可要让 2.449 w22.449\,w^2 指向负实轴,只需取 ww 为纯虚数。w=isw=is 时,

p(x0+is)≈0.911−2.449 s2,p(x_0+is)\approx 0.911-2.449\,s^2,

∣p∣|p| 变小了。

在实数轴上看是坑底,在复平面上看,它只是一个山口:沿实轴方向往上,沿虚轴方向往下,正是前面 x2−y2x^2-y^2 那种鞍点。回到上面的三维地形图,点“实轴截面”按钮:曲面沿实轴被切开,正面那条边就是实轴上的曲线,能看到 x0x_0 处的坑。再慢慢拖动旋转,就会发现坑的背后,曲面是往下走的。

x2+1x^2+1 也一样。在 z=0z=0 处,要让 w2w^2 指向 −1-1,取 w=±iw=\pm i。顺着虚轴往下走,正好走到它的两个根 ±i\pm i。

这让我对代数基本定理“为什么一定要在复数里讲”有了更具体的感觉。实数上的反例并不是偶然缺了几个根,而是地形里有坑;复数做的事情,是把每个坑都拆成一个鞍点。

为什么复平面上一个假坑都没有

上一节只看了一个点。要说明复平面上处处如此,需要一个更整体的工具:调和函数。

定义调和函数

二元实函数 u(x, y)u\left(x,\ y\right) 若满足

∂2u∂x2+∂2u∂y2=0,\frac{\partial^2u}{\partial x^2}+\frac{\partial^2u}{\partial y^2}=0,

就称 uu 是调和函数。

这个条件的直观含义很简单:xx 方向的弯曲和 yy 方向的弯曲正好相反。如果沿 xx 方向往上弯(二阶导数为正),沿 yy 方向就一定往下弯。而一个严格的局部最小点,需要在每个方向上都往上弯,这和调和条件矛盾。

另一个等价的说法叫平均值性质:调和函数在一点的值,等于它在以这点为圆心的任意小圆周上的平均值。如果某点比周围一圈都低,平均值就不可能等于它,所以调和函数(除非是常数)没有局部最小点,也没有局部最大点。

和本文有关的事实是:在 p(z)≠0p(z)\ne0 的地方,log⁡∣p(z)∣\log|p(z)| 是调和函数。原因是它局部上等于解析函数 log⁡p(z)\log p(z) 的实部,而解析函数的实部都满足上面的方程(这由 Cauchy–Riemann 方程直接推出)。log⁡\log 是递增函数,不改变哪里高、哪里低,所以:

  • ∣p∣|p| 在零点以外没有局部最小点。这就是复分析里的最小模原理;
  • ∣p∣|p| 的那些不是根的驻点,也就是 p′(z)=0p'(z)=0 而 p(z)≠0p(z)\ne0 的点,都只能是鞍点。

拿 x0x_0 验证一下:沿实轴,log⁡∣p∣\log|p| 的二阶导数是 p′′(x0)/p(x0)≈5.38>0p''(x_0)/p(x_0)\approx5.38>0,往上弯;调和条件立刻告诉我们,沿虚轴的二阶导数是 −5.38-5.38,往下弯。这和上一节的展开完全一致。

从这个角度看,达朗贝尔引理是一个更一般现象的局部版本:非常数的解析函数把每个小邻域映成一个包含 p(z0)p(z_0) 的开集(开映射定理),这个开集里自然有离原点更近的点。

把这件事落到算法上,可以做个实验。∣p∣2|p|^2 的梯度写成复数形式是

2 p′(z)‾ p(z),2\,\overline{p'(z)}\,p(z),

它只在根和 p′p' 的零点处为零。我在 [−2, 2]×[−2, 2][-2,\ 2]\times[-2,\ 2] 里随机撒了 2000 个起点,对 ∣p(z)∣2|p(z)|^2 做步长 η=0.002\eta=0.002 的梯度下降。跑完之后,2000 个起点全部收敛到了三个根之一,∣p∣|p| 的最大残差在 10−1410^{-14} 量级。实数轴上那个让大半起点卡住的坑,在复平面上一个都没留下。

下面这个实验可以自己试:点击平面上任意一点作为起点,看梯度下降怎么走。细线是 ∣p∣|p| 的等高线,越靠近根,背景的蓝色越浓;那条 8 字形的虚线是过鞍点 x0x_0 的等高线。

这个交互图需要启用 JavaScript。

推荐试两个预设起点:“1.7” 和 “1.7+0.04i”。只有一种情况会失败:起点恰好落在实轴上。pp 的系数都是实数,实轴上的梯度也是实数,迭代永远离不开实轴,于是会停在鞍点 x0x_0。往上或往下偏一点点,轨迹就绕过鞍点,落进复根。随机撒点几乎不可能恰好落在实轴上,这也是 2000 个起点全部成功的原因。

静态图:五条梯度下降轨迹

复平面上 |p(z)| 的等高线:三个根处等高线收成小圈,两个鞍点在实轴上。过 x0 的等高线呈 8 字形。四条蓝色下降轨迹都到达根;一条从实轴上 1.7 出发的橙色轨迹沿实轴停在鞍点 x0。

复平面上 |p(z)| 的等高线:三个根处等高线收成小圈,两个鞍点在实轴上。过 x0 的等高线呈 8 字形。四条蓝色下降轨迹都到达根;一条从实轴上 1.7 出发的橙色轨迹沿实轴停在鞍点 x0。

数值方法里的同一个想法

这层关系在数值方法里一直在用,只是平时不太点破。先简单回顾一下 Newton 法。

Newton 法。 在当前点 zkz_k 用切线近似 pp:p(z)≈p(zk)+p′(zk)(z−zk)p(z)\approx p(z_k)+p'(z_k)(z-z_k)。令右边等于零,解出下一个点

zk+1=zk−p(zk)p′(zk).z_{k+1}=z_k-\frac{p(z_k)}{p'(z_k)}.

对方程组 F(x)=0F(x)=0,导数换成 Jacobian 矩阵 JJ,也就是由所有偏导数 ∂Fi/∂xj\partial F_i/\partial x_j 排成的矩阵,Newton 步变成 xk+1=xk−J−1F(xk)x_{k+1}=x_k-J^{-1}F(x_k)。Newton 法离根近时收敛极快,离根远时却可能乱跳。

还是 p(z)=z3−2z+2p(z)=z^3-2z+2。纯 Newton 法从 0 出发:

0 → 1 → 0 → 1 → ⋯0\ \to\ 1\ \to\ 0\ \to\ 1\ \to\ \cdots

看看 ∣p∣|p| 的变化:∣p(0)∣=2|p(0)|=2,∣p(1)∣=1|p(1)|=1,再回到 2。从 1 跳回 0 的那一步让 ∣p∣|p| 翻了一倍。

价值函数与回溯。 一个自然的补救是给 Newton 法配一把尺子,用它判断“这一步有没有让情况变好”。这把尺子就是前面的 ϕ=12∣p∣2\phi=\tfrac{1}{2}|p|^2,在优化里叫价值函数(merit function)。做法是:先试整个 Newton 步;如果 ϕ\phi 没有下降足够多,就把步长减半再试,直到满意为止。这种做法叫回溯线搜索,配上它的 Newton 法叫阻尼 Newton 法。

它确实打破了循环:从 0 跳到 1,∣p∣|p| 从 2 降到 1,这一步被接受;从 1 想跳回 0 时,∣p∣|p| 会翻倍,回溯把步长缩成四分之一,落到 0.75。

但我实际跑下去,出现了新的问题。迭代一步步挤向 0.8165,正是前面那个假坑 x0x_0。那里 p′=0p'=0,Newton 步 p/p′p/p' 的长度趋于无穷,回溯只好把步长缩得越来越小,算法几乎原地不动。它在坑边停了十来步,最后是浮点舍入误差让某一步偶然迈了出去,才落到实根 −1.7693-1.7693。这算不上算法的功劳:只要全程用实数算,迭代就离不开实轴,而在实轴上这个坑是真的。

把起点挪到 0.01i0.01i,情况完全不同。迭代同样先靠近 x0x_0,随后沿虚方向滑下山口,15 步收敛到复根 0.8846+0.5897i0.8846+0.5897i。价值函数打破了循环,复平面多出来的那个方向化解了假坑。

在上面的实验里把方法换成“阻尼 Newton”或“纯 Newton”,用预设起点 “0” 和 “0.01i” 就能看到这两种结局。状态栏里的“步长比例”是回溯后实际采用的那部分 Newton 步。

静态图:Newton 法的三条路径

复平面局部放大图。纯 Newton 法在 0 和 1 之间循环,用上下两段虚线弧表示。从 0 出发的阻尼 Newton 迭代沿实轴挤到鞍点附近。从 0.01i 出发的阻尼 Newton 迭代在鞍点附近转向,向上走到复根 0.885+0.590i。

复平面局部放大图。纯 Newton 法在 0 和 1 之间循环,用上下两段虚线弧表示。从 0 出发的阻尼 Newton 迭代沿实轴挤到鞍点附近。从 0.01i 出发的阻尼 Newton 迭代在鞍点附近转向,向上走到复根 0.885+0.590i。

为什么用价值函数来约束 Newton 法是合理的?背后有一个很干净的事实。Newton 方向是 d=−J−1Fd=-J^{-1}F;价值函数的梯度是 ∇ϕ=JTF\nabla\phi=J^{\mathsf T}F。沿 Newton 方向的方向导数是两者的内积:

∇ϕTd=−FTJJ−1F=−∥F∥2<0.\nabla\phi^{\mathsf T}d=-F^{\mathsf T}JJ^{-1}F=-\|F\|^2<0.

只要还没到根,而且 JJ 可逆,Newton 方向就一定是 ϕ\phi 的下坡方向,只是一整步可能迈得太大,回溯负责把它缩短。反过来,这类方法真正会出问题的地方,正是 JJ 奇异的点:在那里 Newton 方向失去意义,迭代可能停在一个不是根的点上[3][3] J. Nocedal and S. J. Wright, Numerical Optimization, 2nd ed. Springer, 2006.。上面的 x0x_0 就是这样的点。

求根算法借最优化的尺子来量“有没有变好”,这和达朗贝尔引理的思路一样:不是根,就应该有路往下走。只是高维的方程组没有复平面那么幸运。∥F∥2\|F\|^2 可能有真正的假坑,也就是 JTF=0J^{\mathsf T}F=0 而 F≠0F\ne0 的局部最小点。Gauss–Newton 法和 Levenberg–Marquardt 法卡住的时候,往往就是掉进了这种坑。实数轴上的 x3−2x+2x^3-2x+2,是这件事最小的模型。

反过来不成立:不是每个求根问题都是最优化

两座桥并不对称。

从最优化到求根,得到的方程组总是某个函数的梯度 ∇f=0\nabla f=0。但反过来,一个向量场 FF 要能写成梯度 ∇f\nabla f,必须满足一个条件。以平面为例,若 F=(F1, F2)=∇fF=\left(F_1,\ F_2\right)=\nabla f,则

∂F1∂y=∂2f∂y ∂x=∂2f∂x ∂y=∂F2∂x,\frac{\partial F_1}{\partial y}=\frac{\partial^2f}{\partial y\,\partial x}=\frac{\partial^2f}{\partial x\,\partial y}=\frac{\partial F_2}{\partial x},

因为光滑函数的混合偏导数与求导顺序无关。换成矩阵的话说,FF 的 Jacobian 必须对称。在没有“洞”的区域(单连通区域)上,这个条件也是充分的。大多数方程组都不满足这一条,所以求根问题比“找驻点”宽得多。

最简单的反例来自博弈。设想两个玩家:一个控制 xx,想让 xyxy 尽量小;另一个控制 yy,想让 xyxy 尽量大。写成

min⁡xmax⁡y xy.\min_x\max_y\ xy.

均衡点是原点:谁单方面改变都占不到便宜。它也是方程组 F(x, y)=(y, −x)=0F\left(x,\ y\right)=\left(y,\ -x\right)=0 的根,其中第一个分量 yy 是 xyxy 对 xx 的偏导数,第二个分量是 xyxy 对 yy 的偏导数再取负号,因为 yy 玩家在往上走。这个 FF 的 Jacobian 是反对称的,不是任何函数的梯度。

最直接的算法是让两个玩家同时各走一步:xx 沿梯度下降,yy 沿梯度上升,叫梯度下降-上升:

xk+1=xk−η yk,yk+1=yk+η xk.x_{k+1}=x_k-\eta\,y_k,\qquad y_{k+1}=y_k+\eta\,x_k.

这其实是在把点 (xk, yk)\left(x_k,\ y_k\right) 旋转一个小角度,同时放大 1+η2\sqrt{1+\eta^2} 倍。取 η=0.1\eta=0.1 从 (1, 0)\left(1,\ 0\right) 出发,100 步后到原点的距离变成约 1.64,一圈一圈往外绕。这里没有“地形”可言,也就没有“往下走”。生成对抗网络(GAN)的训练本质上也是这样一个最小最大问题,它那些绕圈和震荡,有一部分原因就在这里。

所以更准确的说法是:最优化可以看成求根的一个特例(梯度场的求根),而求根问题又总能借 ∥F∥2\|F\|^2 改写成最优化,只是改写之后会多出原问题里没有的坑。

回到学习

我对这件事这么在意,一部分原因是它和现在的机器学习理论很像。

最优化里最省心的是凸函数:碗形的函数,局部最小就是全局最小,不会有假坑。可深度学习里的目标函数几乎都不是凸的,理论上随时可能卡在坏的局部最小点,实践中梯度下降却往往表现得很好。过去十年有一条研究线,专门找那些“非凸,但地形良性”的问题:所有局部最小都是全局最小,其余的驻点都是有下坡方向的鞍点。矩阵补全[4][4] R. Ge, J. D. Lee, and T. Ma, “Matrix Completion has No Spurious Local Minimum,” arXiv:1605.07272, 2016. https://arxiv.org/abs/1605.07272、字典学习和相位恢复[5][5] J. Sun, Q. Qu, and J. Wright, “When Are Nonconvex Problems Not Scary?,” arXiv:1510.06096, 2015. https://arxiv.org/abs/1510.06096都被证明属于这一类。再加上“梯度下降几乎不会停在严格鞍点上”这样的结果[6][6] J. D. Lee, M. Simchowitz, M. I. Jordan, and B. Recht, “Gradient Descent Converges to Minimizers,” arXiv:1602.04915, 2016. https://arxiv.org/abs/1602.04915,就能解释为什么简单的算法够用。前面实验里,只有恰好从实轴出发的轨迹会停在鞍点,就是这个结果的一个小例子:实轴在复平面里是一条线,随机起点落上去的概率是 0。

把这些论文的论证结构摊开,和阿尔冈的证明一模一样:目标函数在远处趋于无穷,所以最小值存在;任何不是全局最优的驻点都有下降方向,所以局部最优就是全局最优。

有一处细节反而是代数基本定理更强。机器学习里常要求鞍点是“严格”的:Hessian 矩阵(二阶偏导数组成的矩阵)至少有一个负特征值,也就是至少有一个方向往下弯,靠二阶信息就能找到下坡方向。可达朗贝尔引理里的 kk 可以是 3、4 或者更大。比如 p(z)=z3+1p(z)=z^3+1 在 z=0z=0 处,k=3k=3,那里的二阶导数全是零,像一个“猴鞍”(有三个下坡方向,给猴子的尾巴也留了位置),二阶信息看不出任何下降方向。引理直接用 kk 阶项和 kk 次方根找到了路。对一般函数,处理这种高阶退化的鞍点要难得多,但多项式的结构让它变得很简单。

结语

回头看,代数基本定理这个名字有点误导。它的证明几乎不用代数,用的是两样分析里的东西:有界闭集上的连续函数能取到最小值,以及复数能开 kk 次方。前者保证最低点存在,后者保证最低点之外总有下山的路。

第一次学的时候,我只把它当成“根一定存在”的前提,看完就翻过去了。现在再看,它其实已经把后面要讲的很多事情都预告了:求根可以变成找最低点;找最低点能不能成功,取决于地形里有没有假坑;而好的空间、好的结构,能让假坑消失。

参考文献

  1. [1] H. D. Ebbinghaus, H. Hermes, F. Hirzebruch, M. Koecher, K. Mainzer, J. Neukirch, A. Prestel, and R. Remmert, Numbers. Springer, 1991. Chapter 4, R. Remmert, The Fundamental Theorem of Algebra. ↩
  2. [2] B. Fine and G. Rosenberger, The Fundamental Theorem of Algebra. Springer, 1997. ↩
  3. [3] J. Nocedal and S. J. Wright, Numerical Optimization, 2nd ed. Springer, 2006. ↩
  4. [4] R. Ge, J. D. Lee, and T. Ma, “Matrix Completion has No Spurious Local Minimum,” arXiv:1605.07272, 2016. https://arxiv.org/abs/1605.07272 ↩
  5. [5] J. Sun, Q. Qu, and J. Wright, “When Are Nonconvex Problems Not Scary?,” arXiv:1510.06096, 2015. https://arxiv.org/abs/1510.06096 ↩
  6. [6] J. D. Lee, M. Simchowitz, M. I. Jordan, and B. Recht, “Gradient Descent Converges to Minimizers,” arXiv:1602.04915, 2016. https://arxiv.org/abs/1602.04915 ↩