AI 工程地基 18|凸优化:山谷只有一个,路还是要会走

「AI 工程地基」系列第十九篇。把 GitHub 上 58k star 的开源课 AI Engineering from Scratch(MIT 协议)一课一课啃完、核完、讲完。今天第 18 课:凸优化,Build 型,90 分钟,前置是微积分和梯度下降那两课。

目录
  1. AI 工程地基 18|凸优化:山谷只有一个,路还是要会走
  2. 一句很提气的广告
  3. 碗,以及怎么认出一只碗
  4. 那条保证,和它没保证的事
  5. 牛顿法:一步到位的代价
  6. 带墙的山谷
  7. 菱形的角,正好戳在轴上
  8. 对偶:问题的影子
  9. 非凸的世界为什么没塌
  10. 回到那条广告

AI 工程地基 18|凸优化:山谷只有一个,路还是要会走

「AI 工程地基」系列第十九篇。把 GitHub 上 58k star 的开源课 AI Engineering from Scratch(MIT 协议)一课一课啃完、核完、讲完。今天第 18 课:凸优化,Build 型,90 分钟,前置是微积分和梯度下降那两课。

一句很提气的广告

这门课开篇写了一句广告,说的是凸优化这个机器学习里唯一敢写保证书的领域:不需要重启,不需要学习率表,不用祈祷。

线性回归、逻辑回归、SVM、LASSO、岭回归,全在这个保险箱里。保证的内容也简单:整张损失地形只有一个山谷。任何往下走的算法,走到最后都是同一个谷底。

广告的前两句半是真的。最后一句,我们后面亲手测。

碗,以及怎么认出一只碗

凸函数就是碗。认碗有三招,从便宜到贵。

第一招看集合:一个集合是凸的,当且仅当任取里面两个点,连线整个都留在集合里。圆是凸的,甜甜圈不是——洞会吞掉一段线。好消息是凸集随便相交,交出来还是凸的。

第二招看弦:函数图上任意两点的连线,必须落在图的上方或贴着图。碗处处如此;sin 的弦在波谷处会沉到曲线下面,所以 sin 不凸。一维的判据更直接:二阶导数处处非负。x² 的二阶导是 2,凸;x³ 的二阶导是 6x,左半轴是负的,不凸。

第三招多维版本:把所有二阶偏导数排成方阵(Hessian 矩阵),它的特征值全非负,函数就是凸的。特征值可以理解为「沿某个方向弯得有多狠」的系数,全非负就是每个方向都往上弯。

课本拿来练手算 Hessian 的例子是 f(x, y) = x² + 3xy + y²。偏导算得很干净,Hessian 是 [[2, 3], [3, 2]]。但你把特征值一算:5 和 −1,一正一负。这个函数沿 (1,1) 方向是 5t² 往上翘,沿 (1,−1) 方向是 −t² 往下塌——它自己就是个鞍面。课本没说破,而它恰好就是下一页要讲的「特征值混合符号 = 鞍点」的现成例子。你刚学完全正才凸,手上这个例子就不凸。

那条保证,和它没保证的事

凸优化的中心定理一句话:局部最小就是全局最小。翻译成爬山语言——你在任何位置低头看到的下坡,一路走到底必然通向唯一的谷底。不存在「换个别的地方重新开始」的必要,初始化怎么选都行。这就是「不需要重启」。

「不用祈祷」呢?我把课本 Build It 环节那只碗拿来跑了梯度下降:f = 5x² + y²,Hessian 是 diag(10, 2),条件数才 5,非常温和的一只碗。学习率 0.25——第一步直接飞出屏幕,两步之内冲破 double 的上限变成 inf。上一门优化课讲过的那条红线 2/λmax = 0.2,在凸碗上原样有效,跨过去照样爆炸。学习率缩到 0.19,139 步到 10⁻¹⁰;调到最优的 1/6,37 步;缩到 0.01,684 步。同一只碗,同一个起点,步子不一样,命运差出一个数量级。

所以凸性向你保证的只有一件事:山谷只有一个。它没保证你的步子。步子太大,碗壁会把你弹上天;步子太小,你会在谷底前爬一下午。有意思的是,这门课自己推荐的实战工具是 L-BFGS-B——一个每一步都自带线搜索(先量一下再迈)的求解器。嘴上说不用祈祷,手上把祈祷交给了算法。这才是诚实的工程:保证「去哪」靠凸性,管住「怎么走」靠求解器。

牛顿法:一步到位的代价

梯度下降每步只用一阶信息(斜率),牛顿法多用二阶(曲率)。它把学习率换成了逆 Hessian:x_new = x − H⁻¹∇f。直觉是别用固定步长,让脚下的弯曲程度决定步子。

对二次函数,牛顿法是精确的:一步到零,不是近似,是零。拿刚才那只碗测,(10, 10) 出发,一步后 f = 0。

代价在规模。Hessian 是 n × n 的方阵,一百万个参数的网络对应 10¹² 个矩阵元素、10¹⁸ 次求逆运算。存不下也算不动,所以深度学习和它无缘。但在参数不太多的凸问题上,它是降维打击。课后练习 2 的函数是 50x² + y²,条件数 50,还是从 (10, 10) 出发:牛顿一步到零;梯度下降把学习率精确调到最优,357 步才到 10⁻¹⁰。一步对三百五十七步。

练习 5 有个安静的彩蛋。让你算 Rosenbrock 函数在 (1, 1) 和 (−1, 1) 两处的 Hessian 特征值,比较「最小值处」和「远处」的曲率。算出来两处的特征值一模一样:1001.6 和 0.399,条件数约 2500。但 (1, 1) 是全局最小点(梯度恰好为零),(−1, 1) 连驻点都不是——梯度是 (−4, 0),站那儿根本停不住。曲率只告诉你脚下的地弯成什么形状,是不是碗底,得问一阶导数。

带墙的山谷

真实问题往往带约束:预算有限、复杂度有上界。处理办法是拉格朗日乘子:把约束折进目标函数,配一个「价格」变量 λ,然后解无约束问题。

课本的例子算对了,三个偏导方程全部过检:最小化 x² + y²、约束 x + y = 1,解是 (0.5, 0.5)、λ = −1——原点到直线 x + y = 1 的垂足,几何意义严丝合缝。几何直觉值得记:谷壁碰到约束墙的时候,目标函数的梯度和墙的梯度平行。不平行,就说明还能沿着墙往下滑,你没到头。

不等式约束的完整版叫 KKT 条件,四条里最有趣的是互补松弛:每个约束在解处分两种命——要么贴在边界上(真的在管事),要么乘子为零(根本没用上)。SVM 的支持向量就是前一种:只有少数几个数据点的约束贴着边界(λ > 0),其余点的 λ 全是零、对决策面毫无贡献。模型的整个决策边界,真的只被那几个点撑着。

菱形的角,正好戳在轴上

LASSO 和岭回归的区别,用约束几何一眼看穿。岭回归等价于「在一个圆里找损失最低的点」:圆是光滑的,等高线椭圆随便在哪碰上它都行,权重整体缩小但都活着。LASSO 等价于菱形(|w₁| + |w₂| ≤ t,转了 45 度的方块):菱形有四个角,角恰好长在坐标轴上。椭圆撞上角的概率出奇地大,一撞角,对应的权重就精确归零。稀疏性不是 L1 的魔法,是几何的必然。

课后练习 4 我扫了数值解:最小化 (x−3)² + (y−2)²,约束 |x| + |y| ≤ 1。目标点 (3, 2) 明明两个坐标都想要,菱形只肯给一个——最优解是 (1, 0),y 严格为零。

对偶:问题的影子

每个约束优化问题都有个影子,叫对偶问题。凸的时候,影子与本体的最优值相同,这叫强对偶。课本正文写得干脆:凸问题,原问题和影子答案一样。术语表里补了一个条件:得满足 Slater 条件——可行域里要有一个点严格落在所有不等式约束的内部。正文又一次比字典说得满,这个系列读下来已经见怪不怪,读的时候多翻术语表,经常有惊喜。

对偶最漂亮的应用在 SVM。它的对偶形式里,整个问题只依赖数据点两两之间的点积 xᵢ·xⱼ。把点积换成核函数 K(xᵢ, xⱼ),不用显式造出高维特征就享受高维的可分性——这就是核技巧的全部机关。

顺带记一句课本括号里的诚实:「解是唯一的(除非有平坦区域)」。这个括号是活的。max(0, x) 是凸函数,但整条负半轴上函数值全为零——每个点都是全局最小。严格说,「唯一」属于更严格的凸(严格凸);普通凸函数的最小值可以是一整块平地。LASSO 在特征比样本还多的时候,解也可能不止一个。

非凸的世界为什么没塌

神经网络违反了凸性给的每一条好性质,但 SGD 照样天天找到好解。这课给了三个理由。

第一,高维空间里「坑」本身就是稀有物种。梯度为零的临界点,n 个 Hessian 特征值全为正(是局部极小)的概率大约是 2 的负 n 次方——百万维参数下,绝大多数临界点是鞍点而不是坑。而 SGD 自带的噪声恰好擅长从鞍点滑走。你怕的深坑,统计学上几乎不存在。

第二,过参数化(参数比训练样本还多)把地形磨得更平、更连通。反直觉,但实证一致。

第三,小批量的噪声偏爱平坦的谷底,「尖锐的极小过拟合、平坦的极小泛化好」——这个说法从九十年代流传至今,好用的经验法则,但要加一句:近年有研究找到反例,重新参数化能让一个解看起来任意地尖或任意地平,所以它还不是定理。

回到那条广告

练习 2 问:条件数增大时梯度下降会怎样。数字已经替它回答了。条件数从 5 涨到 50,最优学习率下的步数从 37 涨到 357。每步误差最多压缩 (κ−1)/(κ+1),条件数一大这个数就贴着 1——每迈一步几乎白走。这是凸问题,全地形最好的情况。

所以那句广告的正确读法是:山谷确实只有一个,重启确实不需要,学习率表也确实可以没有——只要你把步子交给带线搜索的求解器。下一个系列课是复数,从实数轴往两侧展开。下一课见。

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(0)

暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens