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

梯度下降与最小二乘

梯度不只定位平坦处——它把最陡的下坡路递到你手里,而一步步沿它走下去,正是训练几乎每一个机器学习模型的诚实引擎。把这同一个引擎对准一条拟合直线的误差,你便抵达最小二乘。

梯度指向最陡的下坡

在本台阶里,我们一直把梯度 nabla f 当作探测器:令它为零,便找到平坦处——候选的峰、坑与鞍点。但梯度不为零并非失败——它是一只罗盘。回想整道阶梯的核心事实:nabla f 指向 f 最陡上升的方向,而它的长度恰是那段攀爬有多陡。这就是[[gradient-steepest-ascent|梯度作为最速上升]]的含义。把它反过来,minus nabla f 指向相反方向——最陡下降的方向,即从你脚下出发 f 跌落最快的那唯一一个罗盘方位。

为什么那是最陡的方向,而不只是众多下坡方向中的一个?想象你站在雾中的山坡上。当你沿某个单位方向 u 迈步时 f 的变化率,就是方向导数;一个简短的计算表明它等于 nabla f 点乘 u——即梯度在你所选方位上的投影。点积在两个向量对齐时最大,所以当 u 恰好沿 nabla f 时攀爬最陡,当 u 恰好逆 nabla f 时下降最陡。其他每个方向都给出更缓的坡;与梯度垂直的方向则毫无变化,这正是它们描出水平集的缘由。

一步步走下坡

现在把罗盘变成一段旅程。你想要 f 的极小,却看不见整片地貌——你只能感觉脚下的坡度。于是采取能想到的最有耐心的策略:无论身在何处,沿最陡下坡方向迈一小步,然后再看,再迈。这就是[[steepest-descent|最速下降]],更新就是诚实的一行:x_new = x_old - t 乘 nabla f(x_old)。负号送你下坡,nabla f 给出方向与陡度,而正数 t——步长——说明在重新查看之前要迈出多远。

唯一最难的抉择就是那个步长。t 取得太小,你便寸寸前挪,要走上千个微步才横过一片缓坡。t 取得太大,你便一跃越过谷底、落在对面更高的坡上,也许每次弹得更宽,直到整个过程崩飞。经典最速下降以一次线搜索来解决:沿所选的射线,它暂时化为一个单变量问题,你挑选在那条射线上最小化 f 的那个 t——也就是你早在第一卷就熟知的单变量最小化。每这样一步都把你落在路径变平之处,从而逼得下一个方向必与这一个垂直。

这被迫的垂直,正是最速下降著名的弊病。在又长又窄的山谷里——一道横向远比纵向更陡的沟壑——每一步都横射过谷底、冲过了头,下一步又射回来,于是路径以微小的横步在谷中锯齿般下行,而不是顺谷长径直往下跑。收敛慢如蜗行。这不是可以打补丁抹去的缺陷;它内在于只跟随一阶坡度信息这件事,也正是它催生了更聪明的表亲——共轭梯度、动量,以及把曲率纳入考量的牛顿型方法。朴素的方法,是它们全体诚实的概念祖先。

梯度下降:机器真正如何学习

这里是与机器学习诚实的连接,不留半点魔法。训练一个模型,就是选取它的参数——比方说一个神经网络的权重——好让某种误差度量尽可能小。这个误差,看作所有权重一齐的函数,就是损失:一个单一的数,坐落在一片可能有数百万维(每个权重一维)的地貌之上。学习,不多不少,就是最小化这个损失,而干这活的主力就是[[calc-gradient-descent|梯度下降]]——正是你刚遇见的那个下坡步,被放大到了庞大的维度。

实用的梯度下降对教科书的理想作了两处务实的偏离。其一,它放弃了精确线搜索:在数百万个权重上哪怕只算一次梯度都已昂贵,所以你不再每步去求最佳的 t,而是固定一个小步长,称为学习率,记作 eta。更新写作 x_new = x_old - eta 乘 nabla f(x_old)。挑选 eta 是一门艺术——太小则训练拖上几天,太大则损失发散——而实用机器学习的很大一部分,坦白说,就是学会调它。其二,梯度本身由反向传播算出,那无非是把链式法则小心地沿网络各层逆向施用。

凸性:下坡何时就够了

梯度下降有一个深刻而诚实的局限:它永远只往下坡走,所以它停在路径碰巧抵达的那个低处——一个局部极小,未必是任何地方的最低点。这正是[[local-versus-global-optimum|局部最优与全局最优]]的核心。在一片满是凹坑的崎岖地貌上,你从哪里出发决定了你落进哪个凹坑,而算法无从知道是否有一道更深的谷就藏在下一道山脊之后。它看不见整张地图;它只感觉脚下的坡度。

有一种美丽的情形让这层忧虑彻底消失:当 f 是一个[[convex-function|凸函数]]时。凸函数就是图像能兜住水的函数——它像碗一样向上拱,图像上任意两点之间的直弦总落在图像之上或与之重合,从不在其下方。决定性的后果是一条值得背下来的定理:对凸函数,每个局部极小自动就是全局极小。没有可供困住人的虚假山谷,因为本质上只有一个山谷。那么任何诚实的下坡方法——包括梯度下降——都保证能找到真正最好的答案。

凸性有一个干净的判别,能接回本台阶前面的几篇。对光滑函数,f 凸当且仅当它的黑塞矩阵处处半正定——这是「曲面在每一点、每个方向上都向上弯(或至少绝不向下弯)」的多元说法。所以凸性不过是二阶导数判别法被推到全局且永久的版本:不只是某一个驻点处的一个碗,而是处处同时都是碗。但要诚实地面对这份保证的代价:大多数真正有趣的问题,尤其是神经网络训练,是剧烈非凸的。在那里干净的定理失效,一切保证都软化为仅仅局部的陈述,而梯度下降依然如此管用,一部分靠来之不易的工程,一部分靠经验上的好运气。

最小二乘:把拟合当作优化

现在把这整套机械对准应用科学中最常见的任务:用模型拟合数据。你有一团测得的点,想要那条「最接近」它们的直线,但没有哪一条单一的直线能全部命中——数据点比可调的旋钮(斜率与截距)多。诚实的做法是先界定「最接近」是什么意思,再去最小化它。[[calc-least-squares|最小二乘]]选取使直线与数据之间竖直间隙的平方和尽可能小的那条线。把间隙平方,会更重地惩罚大的偏差,让每个误差都保持为正而不致相消,并且——关键地——给出一个你能求导的光滑函数。

正是在这里,整道台阶咔嗒一声合拢。记斜率为 m、截距为 b;总平方误差 E(m, b) 就只是这两个变量的函数——一张铺在 (m, b) 平面上的曲面。而它是平方之和,所以是一只完美的开口朝上的碗:凸的,有唯一的全局极小,处处没有鞍点或虚假凹陷。要找最佳直线,我们做的恰是第一篇所教的:令偏导数为零,dE/dm = 0 与 dE/db = 0,求解。因为碗是凸的,那一个驻点保证就是全局最佳拟合。拟合一条直线不是另一门手艺——它就是穿着日常便装的多元优化。

令这两个导数为零,会产生一个小小的线性方程组——而写成矩阵形式,它就是著名的[[normal-equations|正规方程]]。把模型写作 A x = b,其中 A 装着输入,x 是未知参数,b 是数据;最小化残差 A x - b 的平方长度并令梯度为零,给出 A 的转置乘 A 乘 x = A 的转置乘 b。「正规」一词是几何性的:在最佳拟合处,残差被弄得与模型所能触及的空间垂直——法向——所以最小二乘解恰是数据到那个空间上的正交投影,剩下的误差以直角戳出去。把误差平方,便把对「接近」的含糊愿望,化成了你能一举求解的干净投影。

Fit a line  y = m x + b  to data points (x_i, y_i),  i = 1..N

  residual at point i :   r_i = (m x_i + b) - y_i
  squared error       :   E(m, b) = sum_i  r_i^2          (a convex bowl)

set both partials to zero:
  dE/dm = 2 sum_i x_i (m x_i + b - y_i) = 0
  dE/db = 2 sum_i    (m x_i + b - y_i) = 0

=> the normal equations (2 x 2 linear system in m and b):
  [ sum x_i^2 , sum x_i ;  sum x_i , N ] * [ m ; b ] = [ sum x_i y_i ; sum y_i ]

TWO routes to the SAME answer:
  closed form  ->  solve the 2x2 system directly       (one shot)
  iterative    ->  gradient descent on E(m,b)           (step downhill)
拟合一条直线就是多元优化:一只凸的平方误差碗,要么由正规方程闭式求解,要么由梯度下降迭代求解——两者都落在同一个极小处。

通向同一谷底的两条路

最小二乘此刻显出一个把本篇两半系在一起的小小奇迹。同一条最佳拟合直线,可以由两条截然不同的路抵达。正规方程一举给出它——一个闭式答案,解出线性方程组便大功告成。或者你可以完全不理那道公式,只在平方误差碗上跑梯度下降:从任意斜率与截距出发,反复把它们逆着 E 的梯度轻推,看着直线朝数据缓缓爬去。迭代够多次后,参数稳定在正规方程直接点名的那同一处。一条路是代数,另一条是往下坡走,而因为碗是凸的,它们不可能彼此相左。

既然有公式,何苦还选那条慢路?得对规模诚实。正规方程要求构造并求解一个尺寸随参数个数增长的方程组,而构造 A 的转置乘 A 还悄悄把问题对舍入误差的敏感度平方了,所以为了稳定,谨慎的软件宁取 QR 分解或奇异值分解,而非那道生公式。更具决定性的是,当模型有数百万个参数时——每一个现代模型都如此——那闭式形式大得无从拼装,而单独一个梯度步却依旧廉价。这才是迭代下降统治机器学习的真正缘由:不是精确答案未知,而是一次一个廉价小步地走到它那里,才是唯一能扩展的办法。

退后一步,看清本台阶的整道弧线。你从寻找梯度消失的平坦处、并用黑塞矩阵为之分类开始;你学会了用拉格朗日乘数在约束下优化;如今你又把梯度从探测器变成了载具,骑着它下坡去训练模型、去拟合数据。临界点、二阶导数判别法、约束、下降——这不是四样彼此分立的把戏——它们是同一套「寻找最优」的微积分,从四个角度讲述。那唯一的思想,一经放大,就是现代工程与机器学习共同的内在引擎。