刚开始推梯度下降收敛性那几天,我一直觉得证明里的那个二次函数像是“凭空蹦出来”的。明明面前是一个任意凸光滑函数,怎么一到推导时,它就被一个带 (L/2) 系数的二次函数从上方压住,还要刚好压在切平面上方一点点?后来才反应过来,这个不等式不是某种局部近似,而是 Lipschitz 光滑性本身的一种等价刻画。它有一个专门的称呼——二次上界引理,整个机器学习笔记之优化算法系列里,它的出场率大概能排进前三。
这篇文章就围绕这个引理展开:它到底在说什么,为什么成立,怎么用它推出梯度下降的收敛性,以及我踩过的几个理解上的坑。如果你正在补凸优化基础、读 SGD 收敛性证明,或者纯粹想搞明白“为什么是 (L/2) 而不是 (L)”,这篇笔记应该帮得上忙。
1. 为什么先讲光滑性:比凸性更基础的假设
1.1 梯度 Lipschitz 连续的直观含义
很多初学者最先接触的概念是凸性,因为凸函数保证局部最优就是全局最优。但真正动手推收敛性的时候,你会发现几乎所有一阶方法的证明里,第一个写出的条件往往不是凸性,而是“梯度是 L-Lipschitz 连续的”,也就是:
[ |\nabla f(x) - \nabla f(y)| \le L |x - y|, \quad \forall x, y ]
这个式子的意思是:梯度这个向量场的变化速度是有上限的。你可以把梯度看作地形图上的坡度方向,Lipschitz 条件就是在说,坡度不会从一个地方到另一个地方“突变”,它的变化率被常数 (L) 控制住。
为什么这个条件重要?因为如果没有它,梯度下降走一步之后会发生什么,我们完全没法预测。你根据当前点的梯度往山下走了一步,结果下一处的坡度是更陡了还是更缓了,是上坡还是下坡?没有光滑性,这些都没有保证。有了 Lipschitz 条件,我们至少能对函数值的变化范围做一个全局的、可计算的约束,这就是二次上界引理的出发点。
1.2 L 是什么:不是学习率,是曲率上界
这里的 (L) 经常被误认为是学习率,其实它是函数本身的几何属性。对于二次函数 (f(x) = \frac{1}{2}x^T A x),梯度是 (Ax),于是:
[ |\nabla f(x) - \nabla f(y)| = |A(x - y)| \le |A|_2 |x - y| ]
所以 (L) 至少可以取矩阵 (A) 的最大奇异值,也就是最大特征值(对对称矩阵而言)。换句话说,(L) 刻画的是函数曲面“最多能弯到什么程度”,它是曲率的一个全局上界。
在机器学习里,线性回归的最小二乘损失 (f(w) = \frac{1}{2}|Xw - y|^2) 的梯度是 (X^T(Xw - y)),它的 Lipschitz 常数就是 (X^TX) 的最大特征值,也就是数据矩阵最大奇异值的平方。特征值越大,说明损失曲面在某方向上越陡峭,优化时一步能迈的步子就越小,否则容易震荡甚至发散。这也是为什么很多优化库会预先计算或估计这个常数来设置步长上限的原因。
1.3 光滑性和凸性为什么要搭配出现
单纯凸性只告诉了你最小值在哪里,却没有告诉你怎么快速到达那里。单纯光滑性保证了函数行为可控,但如果没有凸性,你可能只是平稳地下滑到一个局部极小值或者鞍点。两者搭配起来,才能既保证“有最优解”又保证“能高效地找到它”。
更妙的是,当函数同时满足凸性和光滑性时,函数图像会被夹在两条曲线之间:下方是切平面(由凸性保证),上方是切平面加上二次项(由光滑性保证)。这个“夹逼”结构,是后面几乎所有收敛性证明的几何基础。
2. 二次上界引理到底在说什么
2.1 引理的标准表述
二次上界引理(Quadratic Upper Bound Lemma)可以写成下面这个非常简洁的形式:
若 (f: \mathbb{R}^n \to \mathbb{R}) 可微,且梯度是 (L)-Lipschitz 连续的,则对任意 (x, y) 有:
[ f(y) \le f(x) + \langle \nabla f(x), y - x \rangle + \frac{L}{2} |y - x|^2 ]
注意,这里并没有要求 (f) 是凸函数,只要求梯度 Lipschitz。很多人在这一步就开始混淆,以为这个引理是凸函数的专属性质,其实不是。凸性只是让这个上界变得“有用”而不是“仅仅成立”。
2.2 每一项的几何意义
逐项拆解一下。
第一项 (f(x)),是当前点的函数值。
第二项 (\langle \nabla f(x), y - x \rangle),是以 (x) 为原点的切平面在 (y) 处的取值,也就是用当前梯度做的线性预测。
第三项 (\frac{L}{2} |y - x|^2),是对线性预测误差的“最坏情况补偿”。它说的是:当从 (x) 走到 (y) 时,真实函数值最多比切平面预测高出这么多。
合在一起,引理声称的是:对于任意一个梯度变化不太剧烈的函数,它的图像永远不会越过“过切点的一个开口向上的抛物面”。这个抛物面就是 (f(x) + \langle \nabla f(x), y-x\rangle + \frac{L}{2}|y-x|^2)。
用一元函数来理解更直接。对 (f(x) = \cos x),它的导数是 (-\sin x),而导数本身是 1-Lipschitz 连续的。于是这个引理告诉我们:
[ \cos y \le \cos x - \sin x (y - x) + \frac{1}{2}(y - x)^2 ]
随便代入几个点验证一下,你会发现确实成立。这正是“泰勒展开带拉格朗日余项”的粗略形式,只不过这里的系数用的是全局常数 (L),而不是在某个点处具体计算的二阶导数值。
2.3 从证明中能得到的更强结论
如果你继续往下推,实际上会得到一个比上界更强的结果:上界和下界同时成立。
[ |f(y) - f(x) - \langle \nabla f(x), y - x \rangle| \le \frac{L}{2} |y - x|^2 ]
也就是说,切平面预测的误差,不管是正偏差还是负偏差,都被同一个二次函数控制住。这有点像把函数图像装进一个“隧道”里,隧道的中轴线是切平面,隧道的半径是 (\frac{L}{2}|y-x|^2)。
这个“上下夹逼”的视角,在后面推导强凸函数的下界时特别有用,因为强凸条件本质上就是在说:函数图像不仅有一个二次上界,还有一个二次下界。两者一夹,收敛速度就能从次线性提升到线性。
3. 证明拆解:从微积分基本定理到辅助函数
3.1 方法一:积分中值定理直接放缩
最直接的证明思路是用微积分基本定理,把函数从 (x) 到 (y) 的变化量写成积分形式:
[ f(y) - f(x) = \int_0^1 \langle \nabla f(x + t(y - x)), y - x \rangle dt ]
然后减去切平面那一项:
[ f(y) - f(x) - \langle \nabla f(x), y - x \rangle = \int_0^1 \langle \nabla f(x + t(y - x)) - \nabla f(x), y - x \rangle dt ]
到这里,就只需要处理被积函数的内积了。利用柯西-施瓦茨不等式和梯度 Lipschitz 条件:
[ \langle \nabla f(x + t(y - x)) - \nabla f(x), y - x \rangle \le |\nabla f(x + t(y - x)) - \nabla f(x)| \cdot |y - x| ]
[ \le L |t(y - x)| \cdot |y - x| = L t |y - x|^2 ]
代回原式:
[ f(y) - f(x) - \langle \nabla f(x), y - x \rangle \le \int_0^1 L t |y - x|^2 dt = \frac{L}{2} |y - x|^2 ]
引理得证。整个过程没有绕过任何弯子,核心就三步:积分表示、柯西-施瓦茨、积分计算。如果你之前对“为什么是二分之一”有疑问,答案就藏在 (\int_0^1 t dt = \frac{1}{2}) 里,而不是什么高深的技巧。
3.2 方法二:化成一元辅助函数
第二种证明更优雅,也更符合“做优化的人看问题的方式”。固定 (x, y),定义一元函数:
[ \phi(t) = f(x + t(y - x)), \quad t \in [0, 1] ]
那么 (\phi(0) = f(x)),(\phi(1) = f(y)),并且
[ \phi'(t) = \langle \nabla f(x + t(y - x)), y - x \rangle ]
又因为梯度的 Lipschitz 性质,可以推出:
[ |\phi'(s) - \phi'(t)| \le L |y - x|^2 |s - t| ]
也就是说,(\phi'(t)) 本身也是一个 Lipschitz 连续函数,常数是 (L|y-x|^2)。于是问题变成了一元微积分问题:
[ \phi(1) - \phi(0) - \phi'(0) = \int_0^1 (\phi'(t) - \phi'(0)) dt \le \int_0^1 L|y-x|^2 t dt = \frac{L}{2}|y-x|^2 ]
这个证法的好处是直观:它把高级的多元函数放缩,变成了“导数变化速率有界”这一元函数性质的直接推论。很多关于梯度方法的证明,其实都隐含了这种“降维”思想。我在做笔记时常提醒自己,看到一个多元不等式先别急着暴力展开,试着固定两个点、沿连线方向拉成一元函数,往往几步就能看清本质。
3.3 两种方法的适用场景
积分法更适合推广到带约束或者需要具体常数估计的场景;辅助函数法更适合理解结构、快速推导。这两种写法都要会,因为后续在证明强凸下界、随机梯度收敛性时,经常会混着用。例如强凸函数的下界证明中,你会看到类似的结构只是不等号方向反转;而随机梯度里,积分法配合期望的线性性质可以直接得到期望形式的二次上界。
4. 从引理到梯度下降的收敛性:一次完整的推导
4.1 充分下降:每次迭代函数值必然下降多少
现在来看这个引理最经典的应用场景:证明梯度下降的收敛性。考虑迭代格式:
[ x_{k+1} = x_k - \frac{1}{L} \nabla f(x_k) ]
步长取 (1/L),这是理论分析里最方便也最保守的选择。把 (x = x_k)、(y = x_{k+1}) 代入二次上界引理:
[ f(x_{k+1}) \le f(x_k) + \langle \nabla f(x_k), x_{k+1} - x_k \rangle + \frac{L}{2} |x_{k+1} - x_k|^2 ]
代入迭代格式本身:
[ x_{k+1} - x_k = -\frac{1}{L} \nabla f(x_k) ]
于是:
[ f(x_{k+1}) \le f(x_k) - \frac{1}{L} |\nabla f(x_k)|^2 + \frac{L}{2} \cdot \frac{1}{L^2} |\nabla f(x_k)|^2 ]
整理一下:
[ f(x_{k+1}) \le f(x_k) - \frac{1}{2L} |\nabla f(x_k)|^2 ]
这个不等式叫“充分下降条件”(sufficient decrease)。它保证函数值每一步至少下降一个与梯度范数平方成正比的数量。为什么是梯度范数平方?因为二次上界假设的误差是 ((\text{步长})^2) 级别的,而梯度下降的步长本身正比于梯度范数,乘起来就是平方项。
4.2 两个辅助不等式:梯度范数和函数值差的关系
接下来需要两个辅助结论。第一个是从上界引理直接推出来的:对任意 (x),令 (\bar{x} = x - \frac{1}{L}\nabla f(x)),利用二次上界和最优值 (f^*) 的关系:
[ f^* \le f(\bar{x}) \le f(x) - \frac{1}{2L}|\nabla f(x)|^2 ]
移项得到:
[ |\nabla f(x)|^2 \le 2L (f(x) - f^*) ]
这个不等式说明:当函数值接近最优值时,梯度范数也必定趋近于零。它的方向(梯度平方被函数值差上界控制)和很多人直觉中的“梯度大说明离最优点远”是一致的,但它提供了定量版本。
第二个辅助结论是迭代点列到最优点 (x^*) 的距离不增。由凸性,有:
[ \langle \nabla f(x_k), x_k - x^* \rangle \ge f(x_k) - f^* \ge 0 ]
再结合上面这个梯度范数控制式,可以推出:
[ |x_{k+1} - x^|^2 \le |x_k - x^|^2 ]
这个式子说明梯度下降不会“跑远”,始终待在初始点与最优点形成的球内。于是记 (R^2 = |x_0 - x^|^2),对所有 (k) 都有 (|x_k - x^| \le R)。
4.3 O(1/k) 收敛率的完整推导
把凸性、柯西-施瓦茨和距离有界合起来:
[ f(x_k) - f^* \le \langle \nabla f(x_k), x_k - x^* \rangle \le |\nabla f(x_k)| \cdot |x_k - x^*| \le |\nabla f(x_k)| R ]
即:
[ |\nabla f(x_k)| \ge \frac{f(x_k) - f^*}{R} ]
代入充分下降条件:
[ f(x_{k+1}) - f^* \le f(x_k) - f^* - \frac{1}{2L}|\nabla f(x_k)|^2 ]
令 (\delta_k = f(x_k) - f^*),则有:
[ \delta_{k+1} \le \delta_k - \frac{\delta_k^2}{2LR^2} ]
这就是一个标准的递推不等式。设 (c = \frac{1}{2LR^2}),令 (s_k = c\delta_k),则:
[ s_{k+1} \le s_k - s_k^2 ]
如果 (s_k \le \frac{1}{k+2}),那么:
[ s_{k+1} \le \frac{1}{k+2} - \frac{1}{(k+2)^2} = \frac{k+1}{(k+2)^2} \le \frac{1}{k+3} ]
所以通过归纳法,最终得到:
[ f(x_k) - f^* \le \frac{2LR^2}{k+2} ]
这就是教科书上最常见的结论:Lipschitz 光滑凸函数上,步长取 (1/L) 的梯度下降,函数值误差以 (O(1/k)) 的速度收敛。
整套推导没有一步是“拍脑袋”的,所有关键不等式都来自二次上界引理。回头看,你会发现那个二次上界不仅是理解光滑性的工具,更是整个证明链条里最底层的燃料。
5. 同一个思想的三张面孔:MM、近端梯度与 Bregman 变体
5.1 MM 算法:把困难问题替换成容易的最小化
二次上界引理还能换一个角度理解:在每次迭代中,我们不是在最小化原函数,而是在最小化一个原函数的“上界代理”。这就是 MM 算法(Majorization-Minimization,先构造上界函数再最小化)的核心思想。
具体来说,在 (x_k) 处定义代理函数:
[ u(x; x_k) = f(x_k) + \langle \nabla f(x_k), x - x_k \rangle + \frac{L}{2}|x - x_k|^2 ]
它满足两个关键性质:一是 (u(x_k; x_k) = f(x_k)),也就是在当前点两者相等;二是对所有 (x),(u(x; x_k) \ge f(x)),也就是代理函数始终压在真实函数上方。对这个 (u) 做精确最小化:
[ x_{k+1} = \arg\min_x u(x; x_k) ]
因为 (u) 是二次函数,最小值点可以直接解出来,结果正好是 (x_k - \frac{1}{L}\nabla f(x_k)),又回到了梯度下降。这揭示了梯度下降的一个深层身份:它其实是“用二次上界代理原函数,并对代理函数做精确最小化”的 MM 算法特例。
5.2 近端梯度:给上界留一个不可微的接口
如果目标函数不只是光滑的 (f),而是 (f + g),其中 (g) 是不可微的(比如 L1 正则项),我们没法直接对整个目标函数做梯度下降。但是可以只对光滑部分用二次上界代理,不可微部分原样保留。于是每一步求解:
[ x_{k+1} = \arg\min_z \left[ g(z) + f(x_k) + \langle \nabla f(x_k), z - x_k \rangle + \frac{L}{2}|z - x_k|^2 \right] ]
整理后,忽略常数项,这个优化可以写成:
[ x_{k+1} = \arg\min_z \left[ g(z) + \frac{L}{2}\left| z - \left(x_k - \frac{1}{L}\nabla f(x_k)\right)\right|^2 \right] ]
这就是近端梯度更新公式。换句话说,它是在用二次上界把光滑部分线性化,然后让不可微部分通过近端算子来处理。整个过程之所以能保证收敛,本质上仍然依赖二次上界引理——因为只有知道了光滑部分的函数值被二次函数控制住,你才敢放心地用这个代理模型去迭代。
5.3 Bregman 变体:把欧氏距离换成更合适的度量
进一步看,二次上界里的 (\frac{L}{2}|y-x|^2) 其实是在用欧氏距离度量“当前点和新点的远近”。但有些问题里,欧氏距离并不合适。比如概率单纯形上做优化,或者某些函数沿特定方向弯曲程度差异很大,这时候可以引入一个强凸函数 (h),用 Bregman 散度替换欧氏距离:
[ f(y) \le f(x) + \langle \nabla f(x), y - x \rangle + L \cdot D_h(y, x) ]
这里 (D_h(y,x) = h(y) - h(x) - \langle \nabla h(x), y - x \rangle)。当 (h(x) = \frac{1}{2}|x|^2)时,Bregman 散度退化为 (\frac{1}{2}|y-x|^2),引理也回到原来的形式。这个推广对应的方法就是镜像梯度(Mirror Descent),它在某些几何结构下的收敛常数比梯度下降好得多。
三张面孔如下:
| 方法 | 代理模型 | 更新形式 | 适用场景 |
|---|---|---|---|
| 梯度下降 | 二次函数 | (x - \frac{1}{L}\nabla f(x)) | 光滑凸问题 |
| 近端梯度 | 二次函数 + 非光滑项 | 近端映射 | L1 正则、约束优化 |
| 镜像梯度 | 线性函数 + Bregman 散度 | 镜像映射 | 概率单纯形、特殊流形 |
6. 最容易踩的三个坑
6.1 把 L-smooth 和 L-Lipschitz 连续搞混
这是一个高频错误。一个函数满足 (L)-Lipschitz 连续指的是 (|f(x) - f(y)| \le L|x-y|),限制的是函数值的变化;而二次上界引理的前提是梯度本身满足 Lipschitz 条件,限制的是梯度的变化,差别很大。
最典型的反例是绝对值函数 (f(x) = |x|)。它本身是 1-Lipschitz 连续的,但在 0 点不可导,根本谈不上梯度 Lipschitz。反过来,二次函数 (f(x)=x^2) 在任何有界区域内都不满足函数值的全局 Lipschitz 连续(因为当 (x,y) 很大时函数值差可能远大于线性增长),但它的梯度是 (2x),满足 2-Lipschitz 连续。两种性质完全不同,使用时必须看清楚条件写的是哪一个。
6.2 把二次上界当作局部泰勒展开
另一个容易犯的错是把 ({f(x) + \langle \nabla f(x), y-x\rangle + \frac{L}{2}|y-x|^2}) 当成目标函数在 (x) 附近的二阶泰勒展开,然后用 Hessian 的局部信息替换 (L)。
泰勒展开 (f(y) \approx f(x) + \langle \nabla f(x), y-x\rangle + \frac{1}{2}(y-x)^T \nabla^2 f(x)(y-x)) 是局部近似,只在 (y) 离 (x) 很近时误差小;而二次上界是一个全局不等式,要求对任意 (x, y) 都成立。把 (L) 换成某个点的 Hessian 谱半径,可能在这个点附近成立,走远了就完全失效。
正确理解是:二次上界里的 (L) 是一个全局常数,它刻画的是“最坏情况下的曲率”,而不是某个局部点处的实际曲率。这有点像一个城市路段的限速标志:限速 60 不代表你每时每刻都开在 60,而是任何时刻都不能超过 60。分析收敛性时需要的是这个上限,而不是某个时刻的实际速度。
6.3 只记上界,忽略强凸配对的二次下界
有些读者背下了二次上界,却忘了强凸函数还有一个配对的二次下界:
[ f(y) \ge f(x) + \langle \nabla f(x), y-x\rangle + \frac{\mu}{2}|y-x|^2 ]
其中 (\mu) 是强凸参数。这个下界不是可有可无的补丁,它是证明线性收敛率的关键。只有上界时,你得到的 O(1/k) 是梯度下降的“普通速度”;有了下界,收敛速度才能提升到 ((1 - \frac{\mu}{L})^k) 这样的线性收敛。
如果把二次上界比作天花板,那么强凸条件就是地板。天花板和地板之间的距离 (\kappa = L/\mu),恰是条件数——它决定了优化问题的难易程度。条件数越大,说明函数越像一个很扁的碗,梯度下降在其中来回震荡,收敛就越慢。只看天花板不看地板,自然没法解释为什么同一个算法在不同的函数上表现天差地别。
7. 顺着引理再走一步:强凸、加速与随机版本
7.1 强凸情形下的线性收敛
引入强凸下界之后,梯度下降的分析可以做得更精细。结合二次上界和二次下界,可以得到步长取 (1/L) 的梯度下降每一轮都会有:
[ f(x_{k+1}) - f^* \le \left(1 - \frac{\mu}{L}\right)(f(x_k) - f^*) ]
反复迭代后,收敛率就是 ((1 - \frac{\mu}{L})^k)。这个结果说明,当函数既光滑又强凸时,条件数 (\kappa = L/\mu) 直接出现在指数上,条件数越大收敛越慢。这也解释了为什么实际优化中要做预处理(preconditioning):本质上是想降低 (L/\mu),让碗变得更圆一些。
7.2 Nesterov 加速
Nesterov 加速梯度法(AGD)表面上是在梯度下降的基础上加了一个动量项,但更深层的理解方式是:它在利用二次上界构造代理模型的同时,借鉴了历史点的信息,让迭代不再局限于当前梯度方向。加速方法的收敛率是 (O(1/k^2)),达到了一阶方法的最优下界。这里不展开公式,但记住一点:如果没有二次上界引理先把“步长不能超过 (1/L)”这个上限固定住,加速方法中的外插步长根本没法安全地选取。
7.3 随机梯度下降里的期望形式
在随机梯度下降(SGD)中,我们用无偏的随机梯度 (\tilde{g}(x)) 代替真实梯度。此时确定性版本的二次上界条件变成取期望后成立:
[ \mathbb{E}[|\tilde{g}(x) - \tilde{g}(y)|] \le L|x-y| ]
于是可以得到期望形式的充分下降条件:
[ \mathbb{E}[f(x_{k+1})] \le f(x_k) - \eta |\nabla f(x_k)|^2 + \frac{L\eta^2}{2} \mathbb{E}|\tilde{g}(x_k)|^2 ]
注意,这里出现了 (\eta^2) 项,它是随机梯度的方差带来的。为了让下降项占主导,步长 (\eta) 必须小于 (1/L),这也是实践中学习率不能太大、并且常常需要衰减的数学原因。很多人只知道“学习率太大不收敛”,却不知道这个结论正是从二次上界引理加方差项推出来的。
回到我自己的学习体会:这个引理最值得记住的地方,不是它那个简短的式子,而是它提供了一种“二次思维”——遇到一个复杂的光滑函数,先看看能不能用一个二次函数把它框住。只要框得住,后面就能用统一的套路推出算法行为。有了这种视角,再看梯度下降、近端梯度、镜像梯度这些方法时,就不再是一个个孤立的公式,而是一棵从同一个根长出来的树。