城市边上有家化工厂,利润越高,排放越大。环保局的规矩很简单:想排?可以,每吨排污交一笔“税”。这就是拉格朗日对偶的思路——把约束变成价格。可工厂精打细算后说:税钱比多赚的还少,那就照排不误。环保局很生气,决定把税率提到天文数字(纯惩罚法),结果罚是罚住了,税单却没法精确计算,工厂也叫苦连天,局面僵住。 后来环保局换了思路:不涨单价,而是让工厂先交一笔“押金”,押金按超标排放量的平方计算——超标越多,每多超一吨的代价越重;同时每季度派人实测排放,按实际超标量把“单价”往上涨一点。这就是增广拉格朗日法:在原来的拉格朗日函数里加一个二次惩罚项(押金),再逐轮更新乘子(单价)。押金让优化问题变得更光滑、更好解,单价让约束最终被精确满足。于是有限税率也能达到“无穷大罚款”的效果,工厂心服口服,城市重归蓝天。

岗位关联

增广拉格朗日是约束优化里“既保对偶可分、又保精确收敛”的利器。掌握它,你才能把带约束的 AI 问题(资源调度、联邦学习、碳排放优化)真正落地。

目录
  1. 可视化演示
  2. 对偶裂缝
  3. 二次惩罚
  4. 乘子更新
  5. 罚法对比
  6. 等式约束
  7. 不等式约束
  8. 分布式应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示增广拉格朗日的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

增广拉格朗日:增广拉格 增广拉格朗日函数形式与二次惩罚 增广拉格朗日方法与纯惩罚函数法 核心机制可视化 增广拉格朗日整体架构与关键组件

对偶裂缝

环保局最初的如意算盘是“定价制”:给每吨排放定一个单价 λ,剩下的交给工厂自己权衡。工厂是个精明的生意人,它盯着的是“税后总成本”——多排一吨,多赚一份利润,也多交一份税。只要税钱低于利润,它就照排。环保局反复调价,却发现无论单价怎么变,工厂的决策总是差那么一口气:要么少排太多浪费产能,要么多排一点破了限额,好像永远踩不准那条红线。

技术上,这就是“拉格朗日对偶”的结构性问题。原始问题写作 min f(x) 加上约束 h(x) ≤ 0 或 h(x) = 0,拉格朗日函数把约束“买”进目标:L(x, λ) = f(x) + λh(x)。对每个 λ,工厂算出一个最优值 g(λ),这就是对偶函数;环保局再反过来挑一个让 g 最大的 λ。问题是“先最小化再最大化”和“先满足约束再最小化”并不是一回事,两者之间永远隔着一条缝——对偶间隙。

这条缝能小能大。问题是凸且光滑时,缝隙通常为零;可一旦目标函数非凸、约束复杂,缝隙就变得可观。用拉格朗日对偶的老办法,光靠调 λ 永远填不上这条缝,收敛也慢得让人着急。

环保局终于明白:只靠“税”这一根杠杆,永远填不满对偶间隙。必须再加一根杠杆——押金。

g(λ)=min⁡x(f(x)+λh(x)),d∗=max⁡λg(λ)≤p∗=f(x∗)\displaystyle g(\lambda)=\min_{x}\left(f(x)+\lambda h(x)\right),\qquad d^{*}=\max_{\lambda}g(\lambda)\le p^{*}=f(x^{*})
对偶函数 g(λ) 是工厂在给定单价下的最优总账,d* 是环保局能收到的最好结果,但它总是小于等于真正的约束最优 p*——中间那条缝就是“对偶间隙”。
  1. 税费进成本把约束按单价 λ“买”进目标函数,工厂只看总账。
    f(x)+λh(x)f(x)+\lambda h(x)
  2. 对偶函数对每个单价 λ 让工厂算最优总账,得到凹函数 g(λ)。
    g(λ)=min⁡x(f(x)+λh(x))g(\lambda)=\min_{x}\left(f(x)+\lambda h(x)\right)
  3. 间隙不等式先最小化再最大化的结果,永远赶不上先严格满足约束再优化。
    d∗=max⁡λg(λ)≤p∗=f(x∗)d^{*}=\max_{\lambda}g(\lambda)\le p^{*}=f(x^{*})

二次惩罚

环保局出台新政:除了按超标量收税,每吨超标排放还要多交一份“押金”。押金的算法很特别——按超标量 h 的平方计算。超标 1 吨,押金成本是 1 份;超标 2 吨,押金成本是 4 份;超标 3 吨,就变成 9 份。平方让“越界”的边际代价越来越大,工厂再精,也不敢得寸进尺。

在数学上,这份押金就是二次惩罚项 (ρ/2)h(x)²,其中 ρ 是押金强度。把它加进拉格朗日函数,就得到增广拉格朗日函数 L_ρ。二次项的最大贡献是:它给目标函数在约束方向上补上了“曲率”。原来的拉格朗日函数沿着约束方向可能是平的、甚至凹的,不好解;加了平方项之后,子问题变成强凸问题——就像在滑溜的冰面上撒了一层沙,梯度法、牛顿法都能稳稳地走了。

需要强调的是,二次惩罚项的作用是“拉近”而不是“钉死”。固定单价 λ 时,工厂会在税费与押金的权衡点上停下,这个点离红线很近,但终究差一点。它把解从“完全无视约束”拉到了“靠近约束”,而最后那一小步,要交给下一节的乘子更新。

押金的妙处在于:它不追求一步到位,而是把讨价还价变得“有话好好说”——问题强凸了,每轮迭代都稳稳前进一步。

Lρ(x,λ)=f(x)+λh(x)+ρ2h(x)2\displaystyle L_{\rho}(x,\lambda)=f(x)+\lambda h(x)+\frac{\rho}{2}h(x)^{2}
这个式子就是把“税费”和“按平方计算的押金”一起写进成本。押金让问题的几何形状变得更“圆润”、更好解,但还不能让人精确踩线。
  1. 原成本工厂自己的生产目标,比如利润的反面。
    f(x)f(x)
  2. 税费按超标量线性收费,单价 λ。
    λh(x)\lambda h(x)
  3. 押金超标量的平方乘上 ρ/2,让越界越远、代价增长越快。
    ρ2h(x)2\frac{\rho}{2}h(x)^{2}

乘子更新

押金解决了“平滑”,但没解决“精确”。每季度环保局派人实测排放:若 h 还大于零(仍在超标),就说明单价定低了,该涨;若 h 小于零(排少了),就说明单价定高了,该降。于是诞生了最关键的更新规则:λ ← λ + ρh(x)。实测超标多少,单价就按比例涨多少。

为什么这个更新能让解最终精确踩线?想象押金把解拉到红线附近的一个点,这个点之所以没到线上,是因为“税费的拉力”不够。更新 λ 后,线性项 λh 的方向发生了改变,相当于在押金曲线下方垫了一块斜坡,把“最低点”往红线方向推。下一轮再解子问题,解又前进一截;再更新 λ,再前进一截……直到 h 变成 0,单价不再变化,整个过程戛然而止,解恰好停在红线上。

这条公式里,ρ 同时出现在两个地方:子问题里的押金强度和更新里的放大倍数。它就像一根套索的松紧:ρ 太小,每轮只挪一小步;ρ 太大,步子太猛容易震荡。但只要 ρ 固定为一个有限的正数,这套“押金+调价”的组合就能让约束被精确满足——这正是增广拉格朗日区别于纯惩罚法的灵魂。

环保局终于凑齐了两根杠杆:押金让每一步走得稳,单价让方向始终指向红线。两者一配合,有限罚金也能完成“无穷大罚款”才能做到的事。

λk+1=λk+ρ h(xk)\displaystyle \lambda_{k+1}=\lambda_{k}+\rho\,h(x_{k})
环保局不拍脑袋定价,而是“实测多少就涨多少”:新单价 = 老单价 + ρ × 实测超标量。这就是“给对偶加惩罚”里“加惩罚”的完整含义。
  1. 老单价上一轮谈判定下的税费单价。
    λk\lambda_{k}
  2. 涨价幅度实测超标量 h(x_k) 乘上押金强度 ρ,超标越多涨得越狠。
    ρ h(xk)\rho\,h(x_{k})
  3. 新单价老单价加涨价幅度,得到下一轮使用的乘子。
    λk+1=λk+ρ h(xk)\lambda_{k+1}=\lambda_{k}+\rho\,h(x_{k})

罚法对比

有人会问:既然押金这么好,那直接把押金强度加到无穷大,不就把工厂死死按在红线上了吗?这正是“纯惩罚法”的思路:每一步只加押金、不动单价。听起来简单,实则有两个大坑。

第一个坑是精度。纯惩罚法里没有乘子这条腿,约束违规量只能靠 ρ 硬压:ρ 越大,h 越小,但真要让 h 严格趋向 0,必须 ρ 趋于无穷。可 ρ 一大,第二个坑就来了——数值病态。子问题的海森矩阵会出现从 1 到 ρ 跨度巨大的特征值,条件数随 ρ 线性恶化。用梯度法求解时,目标函数像一条又长又窄的峡谷,走一步就会撞到崖壁,迭代步履维艰。而且即便压住了违规,纯惩罚法也永远不知道真正的乘子 λ* 是多少——它把“价格信号”这个宝贵信息白白扔掉了。

增广拉格朗日则把两件事分开:ρ 固定在一个有限的、友好的值(比如 1 到 10),负责把子问题变得强凸好解;λ 逐轮更新,负责吸收违规量、保证最终精确。押金管稳定性,乘子管精确性,各司其职,谁也不为难谁。

聪明的环保局不再盲目加码,而是“押金保稳、乘子保准”。同样的预算,换来精确得多的结果。

xk+1=arg⁡min⁡x(f(x)+ρk2h(x)2),ρk→∞\displaystyle x_{k+1}=\arg\min_{x}\left(f(x)+\frac{\rho_{k}}{2}h(x)^{2}\right),\qquad \rho_{k}\to\infty
纯惩罚法只靠押金单腿走路,必须把 ρ 加到无穷大才精确,代价是问题变得病态难解。增广拉格朗日加了一条“调价”的腿,ρ 就不用上天了。
  1. 无乘子的子问题只有押金没有税费,乘子角色完全缺位。
    f(x)+ρk2h(x)2f(x)+\frac{\rho_{k}}{2}h(x)^{2}
  2. 每轮解子问题反复求解“罚过”的无约束问题,取最优解。
    xk+1=arg⁡min⁡x(f(x)+ρk2h(x)2)x_{k+1}=\arg\min_{x}\left(f(x)+\frac{\rho_{k}}{2}h(x)^{2}\right)
  3. 罚金上天ρ_k 必须趋于无穷,违规量才趋于零,但海森矩阵随之病态。
    ρk→∞\rho_{k}\to\infty

等式约束

有些场合的约束苛刻到“恰好等于”:比如配额规定总排放量必须正好 100 吨,超排违规,欠排也违规(因为别的工厂需要这部分配额)。这时约束写作 h(x) = 0,违规量可正可负,乘子 λ 也就可以正可以负——正 λ 是罚款,负 λ 相当于补贴,都是为了把排放量精确推向配额。

增广拉格朗日处理等式约束时有一个漂亮的代数性质——配方恒等式:

这个式子告诉我们:税费与押金合在一起,等价于一个“零刻度被平移”的押金——原本押金在 h = 0 处取最小值,平移后最小值出现在 h = -λ/ρ 处。每轮更新 λ,就是在移动押金的最小值点;当 λ 收敛到 λ* 时,这个点恰好落在 h = 0 上,于是约束被精确满足。收敛之后再看增广拉格朗日的梯度,押金项 ρh∇h 因为 h = 0 而自动消失,剩下的正是经典 KKT 条件 ∇f + λ∇h = 0。也就是说,解的精确性完全不依赖 ρ 的大小,只依赖乘子是否收敛。

想一想:如果没有配方这一步,押金永远只能靠近约束,却说不清“差多少”;有了配方,差量被编码进乘子里,成为下一轮修正的方向。这等于是把“押金造成的偏移”反过来变成了“修正的指针”。

等式约束下,环保局既能罚超排也能奖欠排,靠着配方平移的机制,把“恰好等于”这个苛刻要求变成了可操作的迭代。

λh+ρ2h2=ρ2(h+λρ)2−λ22ρ\displaystyle \lambda h+\frac{\rho}{2}h^{2}=\frac{\rho}{2}\left(h+\frac{\lambda}{\rho}\right)^{2}-\frac{\lambda^{2}}{2\rho}
∇xLρ(x∗,λ∗)=∇f(x∗)+λ∗∇h(x∗)+ρh(x∗)∇h(x∗)\displaystyle \nabla_{x}L_{\rho}(x^{*},\lambda^{*})=\nabla f(x^{*})+\lambda^{*}\nabla h(x^{*})+\rho h(x^{*})\nabla h(x^{*})
在最优解处 h(x*) = 0,所以押金项的梯度自动归零,剩下的正是经典 KKT 条件。押金在终点“功成身退”。
  1. 配方展开税费加押金合并成一个完全平方项,押金的零刻度被乘子平移了。
    λh+ρ2h2=ρ2(h+λρ)2−λ22ρ\lambda h+\frac{\rho}{2}h^{2}=\frac{\rho}{2}\left(h+\frac{\lambda}{\rho}\right)^{2}-\frac{\lambda^{2}}{2\rho}
  2. 平移量-λ/ρ 是押金“标尺”的移动距离,乘子每更新一次,标尺就动一次。
    h+λρh+\frac{\lambda}{\rho}
  3. KKT 自动满足收敛点处 h = 0,押金项消失,梯度条件退化为经典 KKT。
    ρh(x∗)∇h(x∗)=0\rho h(x^{*})\nabla h(x^{*})=0

不等式约束

现实中更常见的是“不超过”:排放量 ≤ 配额,记作 g(x) ≤ 0。超排才是坏事,达标了就不该受罚,更不能罚出负的税(那等于奖励超标企业)。这个“只罚超、不罚达”的直觉,写进增广拉格朗日只需要一次截断。

标准的处理有两种。第一种是引入非负松弛变量 s ≥ 0,把 g(x) + s = 0 变成等式约束,然后套用前面等式约束的全部工具。第二种更直接:更新乘子时先按老规矩算 λ + ρg(x),如果结果是负数,就把乘子归零。合起来就是截断更新 λ ← max(0, λ + ρg(x))。这个 max 操作在几何上等价于“投影”——把更新后的乘子投影到非负半轴上。

为什么非负截断是对的?因为不等式约束的最优解满足互补条件 λ g(x) = 0:超标时 g > 0,乘子才为正、才有罚金;达标时 g < 0,乘子被压到 0,不再收费。这跟环保局的直觉完全一致:你达标了,我凭什么还罚你?你超排了,我才有理由涨价。截断更新恰好保证了这一点——乘子永远不会变成负数,永远不会出现“越减排越赚钱”的怪象。

一次简单的截断,就把“只罚超标”的人情味写进了冷冰冰的算法里。不等式约束从此不再是增广拉格朗日的软肋。

λk+1=max⁡(0,  λk+ρ g(xk))\displaystyle \lambda_{k+1}=\max\left(0,\;\lambda_{k}+\rho\,g(x_{k})\right)
环保局先按老规矩“实测超标量涨价”,但如果算出来的新单价是负的(等于倒贴),就直接归零——达标的企业不该被罚,更不该被倒贴。
  1. 预更新先把不等式假装成等式,按实测超标量涨一次价。
    λk+ρ g(xk)\lambda_{k}+\rho\,g(x_{k})
  2. 非负截断结果小于零就取零,等价于把乘子投影到非负区域。
    max⁡(0,  ⋅)\max\left(0,\;\cdot\right)
  3. 完整更新只在超标时产生正罚金,达标时乘子停在 0。
    λk+1=max⁡(0,  λk+ρ g(xk))\lambda_{k+1}=\max\left(0,\;\lambda_{k}+\rho\,g(x_{k})\right)

分布式应用

故事到了这里,环保局要面对的不再是一家工厂,而是一个工业区:几十家工厂各有各的利润函数,总排放却共享一个全局上限。让每家独立优化,总量必然爆表;把所有数据汇总集中优化,通信与隐私又都吃不消。增广拉格朗日正好派上用场——它天生就是分布式优化的骨架。

思路是把耦合约束写成 h(x) = Ax + Bz - c = 0,其中 x 是各家工厂自己的变量,z 是全局协调量。增广拉格朗日函数里,x 和 z 通过二次惩罚项耦合在一起,如果直接同时最小化,依然是集中式问题。但如果我们“交替”来:先固定 z 和 λ,让每家工厂并行解自己的 x 子问题;再固定新的 x,解 z 的子问题;最后中央更新 λ。这样每一步都只碰局部数据,这就是著名的 ADMM(交替方向乘子法)。

从环保局的角度看,这套流程就像分治管理:每家工厂关起门来算自己的账,只把“生产计划”报给中央;中央汇总后检查全局违规量,更新单价,再把新价格广播回去。押金让每个子问题强凸、好解,乘子把全局约束的信息编码成价格信号,传递到每个角落。收敛后,全局违规量归零,每家工厂的局部最优恰好拼成全局最优。

增广拉格朗日这位“传令官”,靠押金让局部问题个个好解,靠乘子把全局约束传遍四方。分布式优化的旗帜,就这样插在了对偶的山头。

xk+1=arg⁡min⁡xLρ(x,zk,λk),zk+1=arg⁡min⁡zLρ(xk+1,z,λk),λk+1=λk+ρ(Axk+1+Bzk+1−c)\displaystyle x_{k+1}=\arg\min_{x}L_{\rho}(x,z_{k},\lambda_{k}),\qquad z_{k+1}=\arg\min_{z}L_{\rho}(x_{k+1},z,\lambda_{k}),\qquad \lambda_{k+1}=\lambda_{k}+\rho\bigl(Ax_{k+1}+Bz_{k+1}-c\bigr)
一场全局大戏,却让每家工厂只算自己的账,中央只负责调价——ADMM 用“交替”两个字,把增广拉格朗日从集中式变成了分布式。
  1. x 步固定 z 和 λ,每家工厂并行解自己的子问题,只碰本地数据。
    xk+1=arg⁡min⁡xLρ(x,zk,λk)x_{k+1}=\arg\min_{x}L_{\rho}(x,z_{k},\lambda_{k})
  2. z 步固定刚算出的 x,解协调变量 z 的子问题,把全局耦合对齐。
    zk+1=arg⁡min⁡zLρ(xk+1,z,λk)z_{k+1}=\arg\min_{z}L_{\rho}(x_{k+1},z,\lambda_{k})
  3. 乘子步中央检测全局违规量,更新单价,把约束信息广播回各家。
    λk+1=λk+ρ(Axk+1+Bzk+1−c)\lambda_{k+1}=\lambda_{k}+\rho\bigl(Ax_{k+1}+Bz_{k+1}-c\bigr)

AI 应用场景

云数据中心资源调度

阶段:系统级资源优化

解决的问题:传统贪心或启发式调度在 CPU、内存、带宽等多资源约束下容易“拆东墙补西墙”,某个瓶颈资源反复告警,整体利用率上不去。增广拉格朗日把每个应用看作一家“工厂”,资源配额写成约束,乘子就是资源的价格信号——应用算自己的最优,中央按违规量调价。

具体案例:某云平台 5000 台服务器,业务方随时提交负载需求,约束是每台机器的 CPU 配额。调度器用 ADMM 每 10 秒跑一轮:每个业务并行算自己的最优分配,中央更新资源价格,15 轮内收敛到全局均衡,集群平均利用率提升约 8%。

联邦学习中的全局一致性约束

阶段:分布式模型训练

解决的问题:各客户端数据不共享,但要求本地模型参数与全局模型保持一致(等式约束)。增广拉格朗日的乘子给“不一致”标了价格,二次惩罚让本地子问题稳定可解,从而在保护隐私的同时让模型收敛。

具体案例:三家银行联合建模反欺诈模型,各自持有约 100 万条样本,但数据不能出域。采用增广拉格朗日式联邦优化(类似 FedADMM),每轮本地训练 3 个 epoch 后上传参数,中央按全局偏差更新乘子。相比 FedAvg,达到同样精度所需的通信轮数减少约 40%。

碳排放配额下的利润优化

阶段:运筹优化决策

解决的问题:传统做法要么忽略环保约束,要么用无穷大罚金导致数值病态。增广拉格朗日在“总排放 ≤ 配额”的不等式约束下,一边保持每个分厂子问题好解,一边通过乘子更新精确卡住总配额,让利润损失最小。

具体案例:某钢铁集团 4 个分厂共享 120 万吨年度碳排放配额。用增广拉格朗日分布式求解各分厂产量与减排投资分配,约束在 30 轮内精确满足,测算利润损失比纯惩罚法少了约 12%。

Python 演示

python41 行
import numpy as np def solve_subproblem(rho, lam):    # 最小化 x^2 + 4y^2 + lam*(x+y-1) + (rho/2)*(x+y-1)^2    # KKT 线性方程组:    #   (2+rho)x + rho*y = rho - lam    #   rho*x + (8+rho)y = rho - lam    A = np.array([[2.0 + rho, rho],                  [rho, 8.0 + rho]])    b = np.array([rho - lam, rho - lam])    return np.linalg.solve(A, b)  def augmented_lagrangian(rho=0.5, max_iter=60, tol=1e-10):    lam = 0.0    xy = np.zeros(2)    history = []    for k in range(max_iter):        xy = solve_subproblem(rho, lam)        h = xy[0] + xy[1] - 1.0        lam = lam + rho * h        history.append(dict(iter=k, x=xy[0], y=xy[1], viol=h, lam=lam))        if abs(h) < tol:            break    return history  def main():    hist = augmented_lagrangian()    print("iter        x        y      h(x)     lambda")    for rec in hist[::5]:        print("%4d %8.5f %8.5f %8.2e %8.5f" % (rec["iter"], rec["x"], rec["y"], rec["viol"], rec["lam"]))    print("---")    print("final x, y   = %.5f, %.5f" % (hist[-1]["x"], hist[-1]["y"]))    print("true optimum = 0.80000, 0.20000")    print("multiplier   = %.5f (理论值 -1.6)" % hist[-1]["lam"])    print("iterations   = %d" % (hist[-1]["iter"] + 1))  if __name__ == "__main__":    main()
目的:演示增广拉格朗日法的完整迭代——解子问题、测违规量、更新乘子,直到约束被精确满足。把 rho 换成很大的数(比如 1e6)跑一遍,你就能亲身体会纯惩罚法的病态。
  1. def solve_subproblem(rho, lam):每轮迭代的核心子问题:把税费和押金都算进成本,找个最优产量。
  2. A = np.array([[2.0 + rho, rho],增广后的海森矩阵,押金强度 ρ 直接改变了问题的曲率。
  3. b = np.array([rho - lam, rho - lam])右端项里同时出现 ρ 和 λ,“税费 + 押金”的合力由此体现。
  4. return np.linalg.solve(A, b)对二次函数,子问题有闭式解,一步到位。
  5. xy = solve_subproblem(rho, lam)先用当前单价解出工厂的最优决策。
  6. h = xy[0] + xy[1] - 1.0实测违规量:排放总量离配额 100 吨还差多少。
  7. lam = lam + rho * h乘子更新:实测超标多少,单价就涨多少,这是整篇文章的灵魂一行。
  8. if abs(h) < tol:合规判停:违规量足够小就收工,约束被精确满足。

常见误区

误区既然要加惩罚,那我把 ρ 调得很大很大,约束自然就满足了,这不就是增广拉格朗日吗?

正解增广拉格朗日的精髓是“押金 + 调价”两条腿走路。只调大 ρ 而从不更新乘子,那是纯惩罚法:ρ 必须趋于无穷才精确,而且海森矩阵病态。增广把 ρ 固定在有限值,靠 λ 的逐轮更新吸收违规量——所谓“有限罚金完成无限惩罚”,功劳一大半在乘子。

为何常见:名字里带“惩罚”,二次项里又确实有 ρ,初学者很容易只盯着 ρ 这一个旋钮。

误区押金越高,约束满足得越快,所以 ρ 越大越好,最好一步到位。

正解ρ 过大会让增广子问题变得“刚硬”:海森矩阵的条件数随 ρ 增大,梯度法每走一步都像在悬崖边挪动,数值误差被放大。实践中 ρ 通常从 1 附近开始,若收敛太慢再小步上调。宁可多迭代几轮,也别让子问题病态。

为何常见:直觉上“罚得多就改得快”,忽略了数值稳定性这个隐形天花板。

误区二次惩罚项要求 h(x) = 0 才消失,不等式约束没法直接套用。

正解有两种标准做法:一是引入非负松弛变量把不等式变成等式;二是直接把乘子更新换成截断形式 λ ← max(0, λ + ρg(x))。收敛时互补条件 λg = 0 自动成立——超标才罚、达标不罚。不等式约束不是障碍,只是加一层 max 投影。

为何常见:教材总是先讲等式约束,讲完不给不等式“续集”,读者就容易以为不等式要另起炉灶。

误区二次惩罚项 ρ/2 h² 里含有别人的变量,把问题耦合在一起,没法拆开并行计算了。

正解增广项确实把变量“拴”在一起,但 ADMM 用交替方向恢复了可分解性:x 步和 z 步先后解,每步只碰本地数据,只有乘子 λ 需要中央汇总。这也是 ADMM 名字里带“乘子”的原因——它正是增广拉格朗日在可分结构上的正确打开方式。

为何常见:看到平方项里出现别的变量,就以为必须整体求解,忘了“交替”这个破局动作。

面试题

Q1. 增广拉格朗日法相对纯惩罚法最核心的改进是什么?

单选题 · easy

  • A.把惩罚系数直接设为无穷大
  • B.保留二次惩罚并逐轮更新乘子← 正确答案
  • C.完全去掉约束条件
  • D.把目标函数改为线性

答案:B。增广拉格朗日的精髓是“押金 + 调价”两条腿走路。A 是纯惩罚法的做法,C 和 D 显然不成立。正确答案是 B:保留二次惩罚保证子问题好解,同时逐轮更新乘子保证精确收敛。

Q2. 二次惩罚项的正确数学形式是下列哪个?

单选题 · easy

  • A.λ·h(x)
  • B.(ρ/2)·h(x)²← 正确答案
  • C.ρ·|h(x)|
  • D.h(x)²/λ

答案:B。二次惩罚项按“违规量的平方”计费,即 (ρ/2)h(x)²。A 是线性税费项;C 是绝对值罚(不可导);D 把 ρ 放到了分母上,方向和量纲都不对。押金越远越贵,正是平方项的直觉。

Q3. 增广拉格朗日法收敛时,约束违反量 h(x_k) 会怎样?

单选题 · easy

  • A.保持常数不变
  • B.趋于 0← 正确答案
  • C.趋于无穷
  • D.随机波动

答案:B。收敛时约束被精确满足,h(x_k) 趋于 0。这正是乘子更新的功劳:每轮按实测违规量调整单价,把解一点点推向约束线,最终停在线上。环保局的“实测调价”机制保证了这一点。

Q4. 等式约束 h(x) = 0 下,乘子更新的标准写法是?

单选题 · mid

  • A.λ ← λ + ρ·h(x)← 正确答案
  • B.λ ← ρ·h(x)
  • C.λ ← λ + h(x)/ρ
  • D.λ ← λ·ρ·h(x)

答案:A。新单价 = 老单价 + ρ × 实测违规量。B 丢了老单价,等于每轮重新定价;C 把 ρ 放到了分母上,方向反了;D 是乱乘。A 是标准公式,也是“给对偶加惩罚”的点睛之笔。

Q5. 关于惩罚强度 ρ 的取值,下列说法正确的有?

多选题 · mid

  • A.ρ 越大越好,因为罚金越高约束越严
  • B.ρ 过大会让子问题海森矩阵病态← 正确答案
  • C.ρ 过小会导致收敛缓慢← 正确答案
  • D.ρ 与乘子更新完全无关

答案:BC。ρ 是押金力度,不是越大越好。过大让海森矩阵条件数剧增、数值病态(B 对),过小则每轮只挪一小步、收敛缓慢(C 对)。A 是典型误区,D 忽略了 ρ 同时出现在子问题和乘子更新里。

Q6. 为什么纯惩罚法需要 ρ 趋于无穷?

单选题 · mid

  • A.因为对偶函数不存在
  • B.因为没有乘子帮忙“吸收”违规量,只能靠罚金把违规量压到 0← 正确答案
  • C.因为目标函数必须线性
  • D.因为约束必须是等式

答案:B。纯惩罚法没有乘子这条腿,缺少“调价”机制去吸收违规量,只能靠押金强度硬压,ρ 不趋于无穷就无法让 h 严格归零。A、C、D 都与问题的本质无关。

Q7. 关于增广拉格朗日法的正确理解有哪些?

多选题 · mid

  • A.乘子初值必须设成很大的数
  • B.乘子初值可以设为 0← 正确答案
  • C.二次惩罚让子问题性质更好(如强凸)← 正确答案
  • D.该方法只对等式约束有效

答案:BC。乘子从 0 开始完全可行,逐轮更新会自然把它带到正确值(B 对)。二次惩罚给目标函数补上曲率,让子问题强凸、更稳定(C 对)。A 是常见误区,D 忽略了不等式约束的截断处理和分布式扩展。

Q8. 不等式约束 g(x) ≤ 0 的乘子更新应写为?

单选题 · hard

  • A.λ ← max(0, λ + ρ·g(x))← 正确答案
  • B.λ ← min(0, λ + ρ·g(x))
  • C.λ ← |λ + ρ·g(x)|
  • D.λ ← λ + ρ·g(x),不做任何限制

答案:A。不等式约束只在超标侧收罚,乘子必须非负,所以先按老规矩预更新,再截断到非负:max(0, λ + ρg(x))。B 截到了负数侧,方向反了;C 取绝对值把达标区间也罚了;D 不截断会出现负价格,等于奖励超标。

Q9. 处理不等式约束的常用等价手段包括?

多选题 · hard

  • A.引入非负松弛变量把不等式转成等式← 正确答案
  • B.对乘子做非负截断← 正确答案
  • C.把不等式约束直接丢掉
  • D.把罚金系数改成负数

答案:AB。A 是把不等式“降级”为等式约束再套成熟工具;B 是直接在更新里加 max 截断,两者都正确。C 直接丢约束等于没约束,D 罚金变负等于奖励超标,都违背问题的初衷。

Q10. ADMM 与增广拉格朗日的关系是什么?

单选题 · extreme

  • A.ADMM 是增广拉格朗日对 x、z 做交替最小化得到的算法← 正确答案
  • B.ADMM 与增广拉格朗日完全无关
  • C.ADMM 不需要乘子
  • D.ADMM 只用于无约束问题

答案:A。ADMM 的本质就是在可分结构上对增广拉格朗日做 Gauss-Seidel 式交替更新:先 x 步、再 z 步、最后乘子步。B、C、D 都与基本定义矛盾。理解“交替”二字,就理解了分布式优化的钥匙。