想象你是一家餐厅的老板,今天要同时准备五十道菜。如果只靠一个厨师从头做到尾,他既切菜又炒菜又摆盘,手忙脚乱还容易出错。聪明的做法是把后厨拆成三个岗位:切菜师傅、炒菜师傅和传菜员。切菜师傅只负责把食材切成合适的形状,炒菜师傅只负责下锅调味,传菜员则负责在两人之间传递半成品、同步进度。三个人各干各的活,反而比一个人全包干得更快、更好。 ADMM(交替方向乘子法,Alternating Direction Method of Multipliers)就是这种“后厨分工”思路在数学上的精确版本。一个复杂的优化问题——比如既要拟合数据,又要让模型稀疏、还要满足各种约束——单独求解非常困难。ADMM 的做法是:把这个大问题拆成两个小问题,各自单独求解,然后用一个“传菜员”(对偶变量)在两者之间来回协调,交替迭代,最终逼近全局最优解。它特别适合分布式计算环境,是解决 Lasso、图像去噪、共识优化等大规模问题的利器。
对 AI 从业者而言,ADMM 是处理分布式优化和大规模机器学习问题的核心工具。掌握它,你就拥有了把“不可能一口气算完”的问题拆成“每个节点能并行算完”的能力,这是工业级系统的必备技能。
可视化演示
展示ADMM交替方向乘子法的x/z/y三步迭代循环、目标函数O(1/k)收敛曲线,以及Lasso问题稀疏化解过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
三步迭代:x/z/y交替更新 x-up: 固定z,y最小化关于x的增广拉格朗日 z-up: 用新x固定y最小化关于z y-up: 对偶变量梯度上升更新 L_\u03c1 = f(x)+g(z)+y\u1d40(Ax-Bz)+\u03c1/2\u2016Ax-Bz\u2016\u00b2
问题拆解思路
想象后厨里,切菜师傅和炒菜师傅各有各的拿手绝活,但他们必须配合完成一道菜:切好的食材总量和炒完的菜量必须一致,否则不是浪费就是不够。老板的目标是让整桌菜最美味,可如果让老板直接去指挥每一个切菜动作和每一勺调味,他根本顾不过来。聪明的老板把总目标拆成两个独立的子目标:切菜师傅只操心“怎么切最好”,炒菜师傅只操心“怎么炒最香”,他们之间只通过一个传菜窗口交换信息。
在数学世界里,这个“拆”的过程有严格的形式。ADMM 要解决的优化问题长这样:min f(x) + g(z),约束条件是 Ax + Bz = c。这里 x 和 z 是两组不同的变量,f 和 g 是两个独立的成本函数,它们通过线性等式约束耦合在一起。单独看 f(x),它只和 x 有关;单独看 g(z),它只和 z 有关——这就是“目标函数可分离”。麻烦的是那个等式约束 Ax + Bz = c,它像一根绳把 x 和 z 绑在一起。
为什么这种“带耦合约束的可分离问题”很难直接解?因为 x 和 z 在约束里纠缠在一起,你不能单独优化其中一个而不管另一个。ADMM 的天才之处在于:它不试图一口气解出所有变量,而是让 x 和 z 轮流上场,每次只解一个子问题,另一个先用上次的结果顶着。就像两位厨师轮流干活——甲切菜的时候乙在旁边待命,乙炒菜的时候甲已经切完了,两人通过传菜窗口不断对齐进度。问题分解是第一步,接下来需要一套协调机制,这就是对偶上升法登场的时刻。
- 目标函数 f(x)+g(z)总成本分成了两块,f 只管变量 x 的好坏,g 只管变量 z 的好坏,互不干扰。
- 约束条件 Ax+Bz=c这是把 x 和 z 绑在一起的那根绳,它要求两组变量通过线性变换后严格相等。
对偶上升法
传菜窗口里该放什么?老板的第一个想法是:放一张“进度单”,上面写着当前两人配合还差多少。如果切菜太慢了(约束不满足),进度单上就会标记一个“差量”,两位厨师看到后各自调整:甲多切一点,乙少炒一点。这个“差量”在数学上就是拉格朗日乘子(对偶变量)y。通过不断读取差量并反向传达调整信息,两位厨师能逐渐把配合误差缩小到零。
对偶上升法的核心逻辑正是如此。构造拉格朗日函数 L(x, z, y) = f(x) + g(z) + yᵀ(Ax + Bz − c),这里的 y 就是“差量”的价格标签。原始变量的更新规则是:固定 y,让 x 和 z 一起最小化拉格朗日函数;然后固定 x 和 z,沿差量的方向“上升”更新 y。反复循环,y 会稳定在某个值上,此时约束刚好满足,也就得到了最优解。
这个方法理论优美,但实际用起来有个大问题:第 2 步里 x 和 z 被放在同一个最小化问题里,仍然纠缠不清,而且对偶上升要求很强的条件才能收敛。它没有真正实现“交替干活”,更像让大家同时动工。要让两位厨师真正做到轮流作业且互不干扰,需要给拉格朗日函数加一个“弹簧”——这就是增广拉格朗日。
- 拉格朗日函数把约束条件变成一个惩罚项加进目标函数,y 是惩罚力度,它乘上约束残差 (Ax+Bz−c)。
- 固定 y 最小化原始变量给定 y 的价格,让 x 和 z 调整自身以最小化 L——这是“厨师响应价格做调整”。
- 更新对偶变量如果残差为正(菜少了),提高 y;如果残差为负(菜多了),降低 y。
增广拉格朗日
老板发现,光靠传菜窗口传“进度单”不够稳:厨师们可能把进度单上的差量看得很轻,行动迟缓。于是他在传菜窗口两端装了一根弹簧——如果两人进度差异太大,弹簧会把他们弹回来。这根弹簧的弹力系数记作 ρ,弹簧越硬(ρ 越大),两人越不敢偏离配合基线。弹簧的好处是让整个系统的“地貌”变得更圆滑,不容易卡在奇怪的地方。
增广拉格朗日就是在普通拉格朗日函数后面加一个二次罚项:(ρ/2)‖Ax + Bz − c‖²。这个罚项像一个抛物线形的碗,让约束残差越大时惩罚越重。有意思的是,加了它之后,原始问题不再需要严格的凸性假设就能保证收敛性,这让它能处理一大类此前无法用对偶上升解决的问题。
但这里还有个遗留问题:x 和 z 依然在同一个最小化表达式里。增广拉格朗日虽然让问题更稳定,却还没有实现“拆开”。ADMM 的最后一击是:把增广拉格朗日的最小化步骤按变量拆成两步——先固定 z 和 y 解 x,再固定 x 和 y 解 z。两个子问题互不干扰、轮流执行,这就像两位厨师终于被彻底分开,各自在自己的案板上干活,只靠弹簧和进度单协调。
- 二次罚项在拉格朗日函数上加了 (ρ/2) 乘约束残差的平方,残差为零时罚项为零,残差越大罚得越狠。
- 增广拉格朗日整体原目标 + 乘子项 + 二次罚项,三者组合后得到一个比原问题更“结实”的优化对象。
交替方向求解
现在后厨的分工终于成型了。第一拍:切菜师傅动手,此时炒菜师傅已经切好的菜还放在边上(z 固定),传菜窗口的样品菜也摆好了(y 固定),切菜师傅只需操心自己的案板。第二拍:切菜师傅退下,炒菜师傅上场,看到刚更新的 x,调整自己的菜量。第三拍:传菜员把两人当前的配合差量更新到进度单上(y 更新)。三拍一循环,每一拍都只解一个简单的小问题——这就是“交替方向”四个字的由来。
形式上,第 k 次迭代的三步更新如下。第一步,固定 z^k 和 y^k,求 x 使增广拉格朗日最小;第二步,固定刚算出的 x^{k+1} 和 y^k,求 z 使拉格朗日最小;第三步,按残差大小向上调整 y。注意每一步的拉格朗日函数用的是同一个 $L_\rho$,但视野不同:第一步只看 x,第二步只看 z。
在实际问题中,第一步往往对应一个带二次项的最小二乘问题(有高效解法),第二步常常对应一个带罚函数的问题(如软阈值算子),各有各的加速技巧。回看餐厅类比:切菜师傅只想着把食材切成最均匀的薄片,炒菜师傅只想着火候和调料,两人各自精进,不必关心对方怎么干活。传菜窗口的样品菜(y)越稳定,说明两人配合越默契——这就是 ADMM 交替求解的本质。
- x 子问题固定 z^k 和 y^k,把拉格朗日函数当作只关于 x 的优化问题来解。
- z 子问题固定刚求出的 x^{k+1} 和 y^k,把拉格朗日函数当作关于 z 的优化问题来解。
- 对偶上升y 沿残差方向做步长为 ρ 的上升更新——残差为零时 y 不再变动,算法收敛。
收敛性分析
老板要确认这套三拍流程真的能收尾,而不是无穷无尽地等下去。数学家帮他把条件列了出来:第一,f 和 g 必须都是凸函数(不能用凹凸不平的成本曲线);第二,问题必须有解(存在满足约束且让目标有限的点);第三,ρ 必须大于零(弹簧得装在窗口上)。满足这三个条件,ADMM 就能保证收敛到全局最优解。
ADMM 还有一个讨喜的性质:它不像梯度下降那样需要精心调节步长 α——对偶上升里那个 α 在 ADMM 中直接由 ρ 取代。这意味着你少了一个要调的旋钮,ρ 承担了“步长 + 弹簧刚度”双重角色。但也别高兴太早,收敛速度通常是线性的,不会像牛顿法那样二阶加速。餐厅里三位师傅配合再默契,也是每轮只前进一小步,好在每一步都算数、都稳定,最终总能上齐一桌菜。
- 凸性条件f 和 g 是凸函数,保证每个子问题有唯一的全局最小点,不会陷入局部极小。
- 残差趋于零算法迭代中,约束残差 Ax^k+Bz^k−c 的长度收敛到 0,即约束最终被满足。
- 目标值渐进最优每一步的 f+g 总和收敛到原始问题的最优值 p*。
惩罚参数调节
弹簧装硬一点还是软一点?这是实际操作中最让人挠头的问题。ρ 太大,弹簧太硬,残差被快速拉回零附近,但子问题的解会剧烈震荡,甚至数值不稳定——就像厨师被弹簧拽得菜刀乱飞。ρ 太小,弹簧太软,两位厨师配合松松散散,残差下降极慢——就像传菜窗口的样品菜半天才更新一次,整个厨房进度拖沓。
在实际系统中,ρ 往往不是固定不变的,而是自适应的:当残差下降太慢,就调大 ρ;当约束残差和原始残差差距太大,就按某个比例动态调整 ρ。这就像餐厅老板每周复盘,看到配合卡壳就换更粗的弹簧,看到配合畅通就换细弹簧。理解 ρ 的调节逻辑,是把 ADMM 从“能跑”调成“跑得快且稳”的关键手艺,也是面试官最爱追问的实战细节。
- ρ 增大二次罚项的权重增大,目标函数更接近一个陡峭二次碗,单步优化更贴近约束,但矩阵条件数变差。
- ρ 减小罚项变弱,子问题更像原始目标函数,迭代路径更平滑,但需要更久才能把残差压到零。
分布式共识优化
如果餐厅开成了连锁店,总店想把几十家分店的招牌菜口味统一起来,怎么办?分店各自的食材(f_i)千差万别,但总店要求最终端上桌的菜(z)完全一致。总店不可能亲自跑进每家分店的厨房手把手指导——通信成本太高了——它只需要每个分店自己算好“我该做什么调整”,把结果汇集到总店,总店做一次加权平均后再广播回去。这就是共识优化(Consensus Optimization)的思想,ADMM 天然适配这种结构。
用 ADMM 解这个问题的流水线是:每轮迭代中,各分店并行执行 x 更新——只解自己的局部问题,随后把 x_i 发到总店;总店把收到的 x_i 做加权平均得到新的 z(全局共识);再把 z 广播回去,各分店更新对偶变量。这个过程中,各分店之间从不直接通信,所有信息都通过总店这一个集散点中转,通信开销被压缩到最小。在整个机器学习产业链中,这就是“联邦学习”和“多机并行训练”的数学地基:数据不动模型动,各算各的梯度,再汇总出统一模型。
- 局部目标之和总目标 = 每个分店的成本函数 f_i 相加,每个 f_i 只和自己的 x_i 有关。
- 共识约束每个局部变量 x_i 必须等于统一全局变量 z,这是“标准化菜品”的约束。
Lasso回归应用
现在回到最经典的应用场景:Lasso 回归。假设你有大量的特征和稀疏的真实信号,想用线性模型拟合数据,同时希望大部分特征系数被压成零(稀疏性)。Lasso 的优化目标是 min (1/2)‖Ax − b‖² + λ‖x‖₁。第一个术语是拟合误差,第二个是 L1 正则项,它会把很多系数逼成零。单独解这个问题用梯度类方法也可以,但特征维度极高时,ADMM 的拆分优势就出来了。
把 Lasso 改写成 ADMM 的形式:f(x) = (1/2)‖Ax − b‖²,g(z) = λ‖z‖₁,约束 x = z。x 子问题是一个二次最小二乘——只需解一个线性方程组,可以预先用 Cholesky 分解加速;z 子问题是 λ‖z‖₁ 加上一个二次项,有闭式解——软阈值算子(soft-thresholding)。
回到餐厅比喻,Lasso 就像老板给厨师下了死命令:“每道菜的配料表最多只能用十样,多余的食材全部撤掉。”软阈值算子就是那个“撤食材”的动作:凡是用量低于标准的配料,一律不用——这保证了最终菜品(模型)干净利落,也方便运输(部署)。ADMM 保证“撤食材”这个操作和“炒菜”这个操作用不着混在一起算,各算各的,最后也能严丝合缝地对上。
- x 更新——线性方程最小化二次函数得到正规方程 (AᵀA+ρI)x = Aᵀb + ρ(z−y),涉及一次矩阵求逆(可预先分解)。
- z 更新——软阈值对 w = x+y 的每个元素做收缩:|w| ≤ λ/ρ 时归零,否则整体缩小 λ/ρ。
AI 应用场景
联邦学习与分布式模型训练
阶段:模型训练(分布式优化)
解决的问题:传统的集中式训练需要把所有数据汇集到一台机器上,这在数据量达 TB 级、或涉及用户隐私(医疗记录、金融交易)时根本无法实现。ADMM 驱动的共识优化让每台设备只在本地计算梯度子问题,仅上传模型参数而非原始数据,既保护隐私又能大规模并行。
具体案例:某银行在 30 个分行各自存储客户的本地交易数据,总行监管要求不得跨分行传输原始记录。采用共识 ADMM 后,每个分行只上传本地的模型参数快照 x_i,总行做加权平均得到全局模型 z 再广播,30 个模型在 50 轮内收敛,风控准确率与集中式训练仅差 0.3%,但训练时间缩短了 12 倍。
图像去模糊与压缩感知重建
阶段:数据预处理 / 信号重建
解决的问题:图像恢复问题通常是“模糊算子 + 稀疏正则”的组合,直接求解涉及超大矩阵求逆,内存和算力都吃不消。ADMM 将问题拆成“去模糊”(线性求解)和“去噪”(软阈值/小波收缩)两个子问题,各自有快速算法,交替迭代即可完成高质量重建。
具体案例:医学 MRI 成像中,为了缩短患者扫描时间,采样率常压到 20% 以下。工程师用 ADMM 做压缩感知重建:一次迭代先在 k 空间做数据一致性修正(线性子问题),再做小波域的稀疏收缩,15 次迭代即可生成临床可用的诊断级图像,单张重建时间从 8 分钟降到 40 秒。
大规模推荐系统的矩阵分解
阶段:模型训练 / 在线推理优化
解决的问题:推荐系统的矩阵分解目标函数包含大量用户项和物品项,全量梯度下降在亿级用户 + 千万物品的规模下无法收敛。把用户向量和物品向量分别当作 x 和 z,用户子问题和物品子问题各自并行迭代,ADMM 天然适配这种“双边交替”的结构。
具体案例:某视频平台在 500 台服务器上部署 ADMM 做矩阵分解。每台服务器负责一部分用户的向量更新(x 子问题),参数服务器汇总计算物品向量(z 子问题),每轮只需同步一次物品向量,训练 3 天即可完成以往 3 周才能完成的模型更新,线上 CTR 提升 7%。
Python 演示
import numpy as np def soft_threshold(w, kappa): """软阈值算子: 把绝对值小于 kappa 的元素置零, 其余收缩 kappa""" return np.sign(w) * np.maximum(np.abs(w) - kappa, 0.0) def admm_lasso(A, b, lam, rho=1.0, max_iter=100, tol=1e-4): """用 ADMM 求解 Lasso: min 0.5||Ax-b||^2 + lam*||x||_1""" m, n = A.shape x = np.zeros(n) z = np.zeros(n) y = np.zeros(n) # 预分解: (A^T A + rho I) 的 Cholesky 因式, 加速每轮 x 更新 AtA = A.T @ A L = np.linalg.cholesky(AtA + rho * np.eye(n)) Atb = A.T @ b history = [] for k in range(max_iter): # x 子问题: 解线性方程 (A^T A + rho I) x = A^T b + rho (z - y) rhs = Atb + rho * (z - y) x_new = np.linalg.solve(L.T, np.linalg.solve(L, rhs)) # z 子问题: 软阈值算子 z_new = soft_threshold(x_new + y, lam / rho) # 对偶变量更新 y_new = y + (x_new - z_new) # 记录原始残差和对偶残差 r_norm = np.linalg.norm(x_new - z_new) s_norm = np.linalg.norm(rho * (z_new - z)) history.append((r_norm, s_norm, np.linalg.norm(x_new, ord=1))) x, z, y = x_new, z_new, y_new if r_norm < tol and s_norm < tol: break return x, z, y, np.array(history) if __name__ == "__main__": np.random.seed(42) n, m = 200, 80 A = np.random.randn(m, n) true_x = np.zeros(n) true_x[:10] = np.random.randn(10) * 3 # 只保留 10 个非零信号 b = A @ true_x + 0.05 * np.random.randn(m) x_hat, z_hat, y_hat, hist = admm_lasso(A, b, lam=0.1, rho=1.0) print("最终目标值: ", 0.5 * np.linalg.norm(A @ x_hat - b) ** 2 + 0.1 * np.linalg.norm(x_hat, ord=1)) print("非零系数个数: ", np.sum(np.abs(z_hat) > 1e-3)) print("真实非零信号恢复误差: ", np.linalg.norm(z_hat[:10] - true_x[:10]) / np.linalg.norm(true_x[:10])) print("迭代轮数: ", len(hist))
L = np.linalg.cholesky(AtA + rho * np.eye(n))提前做 Cholesky 分解,每轮只需两次回代,避免反复求逆的巨额开销。x_new = np.linalg.solve(L.T, np.linalg.solve(L, rhs))x 子问题是一个线性方程组的解,利用预分解的三角矩阵快速求解。z_new = soft_threshold(x_new + y, lam / rho)z 子问题有闭式解:只需对 x+y 逐元素做软阈值,是 ADMM 高效的关键。y_new = y + (x_new - z_new)对偶变量按残差方向做步长 ρ 的上升更新,这是 ADMM 与增广拉格朗日的本质区别。r_norm < tol and s_norm < tol同时检查原始残差和对偶残差,两者都小于阈值才判定收敛,防止过早停止。
常见误区
误区“ADMM 不就是一种梯度下降吗?把目标函数求个导,沿负梯度方向走一步,反复迭代就行了。”
正解ADMM 和梯度下降有本质区别。梯度下降直接沿目标函数的负梯度方向移动,需要手动调步长;而 ADMM 把问题拆成子问题,每个子问题用各自的求解器完整求解,没有“步长”概念。它的更新步长由 ρ 隐含决定,而且适用于非光滑的凸问题(如 L1 范数)——梯度下降面对不可导的 L1 范数只能嗑磕绊绊,ADMM 的软阈值算子天然优雅。
为何常见:因为两者都是“迭代法”,都长着“反复更新变量”的外壳,初学者容易把一切迭代算法都划入梯度下降的筐里。
误区“目标函数必须可微才能用 ADMM,不然子问题没法求导就没法更新变量。”
正解恰恰相反,ADMM 的优势之一就是能处理非光滑项。Lasso 里的 L1 正则项在零点不可导,但 z 子问题通过软阈值算子直接给出闭式解,完全不需要求导。推广来说,只要每个子问题可以用某种方法(不管是否基于导数)高效求解,ADMM 就能套用。它是“问题分解框架”,不是“求导算法”。
为何常见:大多数人接触的第一批优化算法(梯度下降、牛顿法)都要求光滑可导,思维惯性让他们以为所有优化算法都依赖导数。
误区“ρ 设什么值都行,反正 ADMM 总会收敛,随便设个 1 就行了。”
正解ρ 虽然不改变收敛性(只要 ρ > 0),但极大地影响收敛速度。ρ 太小,残差下降缓慢;ρ 太大,子问题条件数变差甚至数值震荡。工业实现中常用自适应策略:当原始残差远大于对偶残差时增大 ρ,反之减小 ρ。它决定每一轮迭代“步子迈多大”,选不好可能跑几千轮还不收敛,选对了 50 轮就收工。
为何常见:教科书上说“对任意 ρ>0 收敛”,很多人把“理论收敛”误读为“实践高效”,忽略了收敛速度 p 的工程意义。
面试题
Q1. ADMM 的全称是什么?
- A.交替方向乘子法(Alternating Direction Method of Multipliers)← 正确答案
- B.自动微分矩阵法(Automatic Differentiation Matrix Method)
- C.加速数据建模法(Accelerated Data Modeling Method)
- D.近似离散最小值法(Approximate Discrete Minimum Method)
答案:A。ADMM 的英文全称是 Alternating Direction Method of Multipliers,中文即“交替方向乘子法”。其他选项都是干扰项,用“乘子”(Multiplier)指代拉格朗日乘子 y,这是理解 ADMM 的关键——y 扮演传菜窗口里样品菜的角色,协调各变量配合。
Q2. ADMM 中“交替”指的是什么?
- A.交替使用 CPU 和 GPU
- B.交替更新原变量 x 和 z 两组变量← 正确答案
- C.交替改变目标函数的正负号
- D.交替在训练集和测试集上迭代
答案:B。ADMM 的核心流程是:固定 z 解 x,再固定 x 解 z,然后更新对偶变量 y,如此循环。就像切菜师傅和炒菜师傅轮流上手,各自只在自己案板上干活。选项 B 精确描述了这个“轮流”过程,其他选项与此无关。
Q3. 对偶上升法解优化问题时,对偶变量 y 的更新公式是?
- A.y^{k+1} = y^k + α(Ax^{k+1} − b)← 正确答案
- B.y^{k+1} = α·y^k + (1−α)(Ax^{k+1})
- C.y^{k+1} = Ax^{k+1} − b
- D.y^{k+1} = y^k − α(Ax^{k+1} − b)
答案:A。对偶上升沿残差的正方向做步长为 α 的上升:如果约束残差 (Ax−b) 为正,说明原始约束被违反,需要增大 y 施加更大惩罚。选项 D 方向反了,选项 B 是动量更新的形式,选项 C 只是一个瞬时量而非迭代公式。餐厅比喻中,残差就是传菜窗口的差量,y 按比例上调,推动厨师加快配合。
Q4. ADMM 的增广拉格朗日函数相比普通拉格朗日函数多了哪一项?
- A.一次项 λ‖x‖₁
- B.二次罚项 (ρ/2)‖Ax + Bz − c‖²← 正确答案
- C.熵正则项 −H(x)
- D.动量项 ν(x − x_prev)
答案:B。增广拉格朗日在普通拉格朗日函数后面加了二次罚项 (ρ/2)‖Ax+Bz−c‖²,相当于在传菜窗口上装了一根弹簧:约束残差越大,被弹回的力越大。这个二次项让目标函数具有更好的凸性,放宽了对原函数强凸的要求,也是 ADMM 能稳定收敛的关键工程举措。
Q5. ADMM 求解 Lasso 问题时,z 子问题的闭式解是什么算子?
- A.ReLU 算子
- B.Sigmoid 算子
- C.软阈值算子(soft-thresholding)← 正确答案
- D.梯度投影算子
答案:C。Lasso 的 z 子问题涉及 L1 范数,其解是逐元素的软阈值算子:把绝对值小于 λ/ρ 的系数归零,其余整体收缩 λ/ρ。这就像厨师把用量低于标准的配料全部撤掉,实现稀疏化。ReLU 是神经网络激活函数,Sigmoid 是逻辑函数,都不对应 L1 范数的近端算子。
Q6. ADMM 的收敛条件包括哪些?
- A.f 和 g 都是凸函数← 正确答案
- B.问题存在可行解← 正确答案
- C.ρ 必须大于 0← 正确答案
- D.f 和 g 必须可微
答案:ABC。ADMM 收敛的充分条件是:f、g 为凸函数(保证子问题有唯一最小点)、原问题有解(保证存在最优目标值)、ρ>0(保证算法有稳定的“弹簧”)。可微性不是必需——L1 范数就不可微,但软阈值算子能直接处理。D 是典型的错误选项,ADMM 恰恰擅长处理非光滑项。
Q7. 与对偶上升法相比,ADMM 最重要的改进是什么?
- A.不再需要目标函数是凸函数
- B.将 x 和 z 从联合最小化拆成交替单独最小化,并加入二次罚项← 正确答案
- C.用随机梯度替代全量梯度
- D.自动调节学习率
答案:B。对偶上升法要求 x 和 z 一起做联合最小化,且收敛条件苛刻(要求强凸)。ADMM 把联合最小化解耦成两次单独的子问题更新(交替方向),同时引入二次罚项(增广拉格朗日),既让子问题更容易求解,又保证了收敛性。这就像把“两人同时干活”改成“轮流干活”,各自效率反而更高。
Q8. ADMM 适用于以下哪些场景?
- A.目标函数可分离为 f(x)+g(z) 且带线性耦合约束← 正确答案
- B.分布式多节点共识优化← 正确答案
- C.含 L1 稀疏约束的 Lasso 回归← 正确答案
- D.需要保证全局最优的非凸深度网络训练
答案:ABC。ADMM 的前提是目标函数可分离 + 线性约束(A),这天然适配分布式共识(B)和 Lasso(C)——每个节点算自己的 f_i,再汇总共识。但深度网络的目标函数是非凸的,ADMM 只保证凸问题的全局最优性,非凸场景下没有理论收敛保证,D 超出了 ADMM 的能力边界。
Q9. 共识优化中“共识”指的是什么?
- A.所有节点共享同一份完整数据集
- B.所有局部变量 x_i 最终收敛到同一个全局变量 z← 正确答案
- C.所有节点并行计算但结果取最大值
- D.所有节点使用完全相同的随机种子
答案:B。共识优化(Consensus Optimization)的目标就是让所有节点的局部变量 x_i 通过约束 x_i = z 最终达成一致,z 是全局共识。这就像一个连锁餐厅总店和分店最终端出口味统一的菜。共享数据集或随机种子都不涉及“达成一致”的数学约束,C 是操作而非目标。
Q10. ADMM 中惩罚参数 ρ 的作用是什么?
- A.控制正则化强度,ρ 越大模型越稀疏
- B.控制原始变量的维度
- C.决定对偶变量 y 的更新步长,并影响残差收敛速度← 正确答案
- D.控制迭代终止的具体阈值
答案:C。ρ 身兼两职:一是增广拉格朗日里二次罚项的权重(弹簧刚度),二是对偶变量 y 更新时的步长(y^{k+1} = y^k + ρ·残差)。它不直接控制稀疏性(那是 λ 的职责),也不改变问题维度或终止阈值。ρ 越大收敛步数越少但数值越不稳,这是工程调参的核心权衡。