资讯详情

资讯详情

PDHG原始对偶混合梯度法:原理、调参与工程实践指南

先直接说结论PDHGPrimal-Dual Hybrid Gradient原始-对偶混合梯度法是目前处理“大规模、非光滑、带线性算子复合结构”优化问题最实用的算法之一。它不像梯度下降那样要求目标函数处处光滑也不像ADMM那样需要频繁求解子问题它用“两次邻近算子计算”就把问题解了。这篇内容我会把PDHG的动机、推导、参数调节、踩坑经验和适用边界全部讲清楚尤其会解释为什么它在一类看似复杂的问题上比ADMM和FISTA更省事。1. 从“非光滑惩罚项”说起为什么梯度下降在某类问题上彻底失效很多刚开始接触优化的朋友容易陷入一个思维定式目标函数不就是“损失项加正则项”嘛有梯度就梯度下降没梯度就用次梯度实在不行上近端梯度Proximal Gradient。这种思路处理普通的Lasso或稀疏逻辑回归没问题但一旦问题带上了“线性算子”事情就变味了。1.1 一个图像去模糊问题的反直觉现象假设你想做图像去模糊观测图像是 (b)模糊核是已知的卷积算子 (A)希望恢复清晰图像 (x)。一个经典建模是[ \min_x \frac{1}{2}|Ax - b|_2^2 \lambda |\nabla x|_1 ]第一项是数据拟合项第二项是总变差Total Variation惩罚。这个模型在图像处理里非常经典。现在问一个问题目标函数中 (|\nabla x|_1) 本身不光滑所以你不能直接对整目标函数求梯度。那用近端梯度法行不行近端梯度法的核心迭代是[ x_{k1} \mathrm{prox}_{t\lambda |\nabla (\cdot)|_1}\left(x_k - t A^T(Ax_k - b)\right) ]这里就出现麻烦了(\mathrm{prox}_{t\lambda |\nabla (\cdot)|_1}(z)) 需要求解一个内嵌的、带线性算子 (\nabla) 的邻近算子。这个子问题本身又是一个复杂的优化问题没有闭式解。它不像Lasso的 (|\cdot|_1) 正则项那样可以直接用软阈值公式一行算完。这个问题就是“复合结构”问题的典型形态[ \min_x f(x) g(Ax) ]其中 (f) 光滑、(g) 非光滑但关键在于 (g) 内部套了一个线性算子 (A)。只要 (A) 不是单位阵近端梯度的“近端步”就会失去闭式解从而让整条路走不通。1.2 引入对偶变量把“套着算子的非光滑项”变成“约束”PDHG 的核心思路并不是在原始空间死磕而是把问题拆成一个“鞍点问题”。以一般形式为例[ \min_x f(x) g(Ax) ]把 (Ax) 看成一个整体引入辅助对偶变量 (y)利用 Legendre-Fenchel 对偶可以把 (g(Ax)) 改写成[ g(Ax) \max_y \left( \langle y, Ax\rangle - g^*(y) \right) ]式中 (g^*) 是 (g) 的凸共轭。于是原问题就转变成[ \min_x \max_y \left[ f(x) \langle Ax, y\rangle - g^*(y) \right] ]对 (y) 做一次梯度上升、对 (x) 做一次梯度下降就得到原始-对偶混合梯度法的基本迭代格式。这里有个很好的手感(g) 非光滑这个麻烦被“转嫁”到了对偶空间而对偶空间上的邻近算子 ( \mathrm{prox}_{g^*} ) 往往比原始空间里的邻近算子好算得多。这一点是理解PDHG的关键也是它敢说“每个子步都有闭式解”的底气。这一节想表达的核心是PDHG解决的不是“函数不好求导”的小问题而是“非光滑项与线性算子耦合在一起”的结构性问题。这种结构在图像处理、最优传输、分布式优化、资源分配里几乎无处不在所以它才那么有分量。2. PDHG的迭代公式与邻近算子两个prox步加一个外推步现在进入算法本身。PDHG最常用的形态是Chambolle-Pock算法针对的是[ \min_x f(x) g(Ax) ]其中 (f, g) 都是闭凸函数不一定可微(A) 是线性算子。其迭代可以写为[ \begin{cases} y_{k1} \mathrm{prox}{\sigma g^*}\left(y_k \sigma A \bar{x}k\right) \ x{k1} \mathrm{prox}{\tau f}\left(x_k - \tau A^T y_{k1}\right) \ \bar{x}{k1} x{k1} \theta (x_{k1} - x_k) \end{cases} ]参数 (\sigma, \tau) 是原始和对偶步长(\theta \in [0,1]) 是外推extrapolation参数。收敛条件要求[ \tau \sigma |A|^2 1 ](|A|) 是算子 (A) 的谱范数。如果不做外推(\theta0)收敛条件会变成 ( \tau\sigma|A|^2 \le 1/4) 之类的更严格条件实际中几乎不会有人不用外推。2.1 为什么“两次prox”就能解决那个内嵌子问题还记得上一节提到的 (\mathrm{prox}_{t\lambda |\nabla(\cdot)|_1}(z)) 没有闭式解吗在PDHG里我们根本不需要处理它因为整体迭代被拆成了对偶步只需要求 (g^(y)) 的邻近算子。当 (g) 是指示函数约束或范数如 (\ell_1, \ell_\infty)时(g^) 的邻近算子都是有闭式公式的。比如 (g(x) |x|_1) 时(g^*) 是指示函数prox就是简单的投影操作。原始步只需要处理 (f(x)) 的邻近算子。如果 (f) 是可分离的比如逐点损失函数prox就有闭式解如果 (f) 本身也不可分离那这一步也顶多需要做一次内层迭代但通常比原问题简单得多。也就是说PDHG把“难”的部分交给了对偶空间把“繁”的部分放在了原始空间两边各自只需要做一个相对简单的算子计算。跟ADMM相比它不需要求解任何“线性方程组 邻近算子”的联合子问题代价是它需要逐步迭代推进而不是一次性求一个优化子问题。2.2 一个直观的类比两个房间的室温调节如果觉得数学太抽象可以这样理解PDHG的交替更新机制。假设你在管理两间相连的房间原始变量 (x) 是房间A的温控旋钮对偶变量 (y) 是房间B的温控旋钮两个旋钮互相影响对方的温度。你的目标是让两个房间都达到目标温度。对偶步固定A房间的当前状态根据B房间温差调一下B的旋钮原始步根据刚更新过的B状态反过来调一下A的旋钮外推步让下一次调节“更有冲劲”避免来回震荡导致收敛太慢。这个类比不严谨但抓住了交替更新和加速的本质。实际使用中外推参数 (\theta) 往往取1也就是所谓的“完全外推”此时算法几乎总是收敛最快。3. PDHG与ADMM、FISTA的边界什么时候换算法最划算不少人对PDHG的疑惑是“我ADMM用得好好的为什么要换成PDHG”这是一个非常实际的问题。任何优化算法都有它的舒适区和禁区PDHG也不例外。下面用表格给出三者在关键维度的对比。3.1 三种算法的一句话对比算法单次迭代成本需要的条件最舒适的典型场景FISTA近端梯度加速一次梯度计算 一次prox(f) 光滑有Lipschitz梯度(g(Ax)) 的prox可闭式解Lasso、组稀疏、图稀疏(A) 简单时ADMM一次prox 一次线性方程求解或其他子问题求解两个函数块的prox都可以高效求解(A) 可分离(\ell_1 \ell_2) 组合、约束优化、分布式优化PDHG两次prox 两次矩阵向量乘(\tau\sigma|A|^2 1)prox可闭式或廉价求解图像反问题、最优传输、大尺度LP、不可分约束3.2 为什么在“图像去模糊 全变差”问题上我会首选PDHG在总变差图像去模糊问题中ADMM的原始子问题形如[ \min_x \frac{1}{2}|Ax-b|^2 \frac{\rho}{2}|D x - z - u|^2 ]其中 (D) 是差分算子。这个问题的求解需要 (A^TA \rho D^TD) 的逆也就是说要做一次线性系统求解。在二维大图上这个矩阵可能是百万级甚至千万级维度的虽然利用FFT可以加速在周期性边界条件下但一旦边界条件复杂、或者 (A) 不是卷积算子这个线性求解就会变成瓶颈。PDHG在整个迭代过程中只涉及 (A) 和 (A^T) 的矩阵向量乘法不需要求逆、不需要分解这让它特别适合“算子即函数”的场景。你甚至不需要显式存出矩阵 (A)只需要定义两个算子正向算子 (A x) 和伴随算子 (A^T y)。在很多图像处理库中模糊算子 (A) 就是这样一个黑盒函数你根本无法低成本拿到 (A^TA \rho D^TD) 的逆。这时候PDHG几乎是你唯一能快速上手的选项。3.3 ADMM参数敏感与PDHG的“反脆弱”另一个我实际观察到的经验是ADMM对惩罚参数 (\rho) 非常敏感。(\rho) 选得不好需要几千步才能收敛到满意精度或者直接震荡。而PDHG只要步长满足 (\tau\sigma|A|^2 1)大差不差都能收敛配合自适应步长策略后鲁棒性很强。这不意味着PDHG完全不需要调参但它确实把调参门槛降低了。不过也要说清楚如果你要解决的问题是“小规模、对精度要求特别高、并且 (A) 结构简单能让ADMM子问题有闭式解”ADMM通常收敛更快。因为在ADMM中每个子问题相当于做了一次“全局优化”它吃了更多“信息”而PDHG每一步只吃一个局部梯度信息。大体上可以这么记问题维度低、矩阵结构好用ADMM 问题维度高、矩阵结构差只有黑盒算子用PDHG 问题里没有线性算子直接用FISTA或L-BFGS即可不要绕弯。4. 参数调节的核心打法步长、比例参数与收敛判据PDHG看起来简单但调参不当照样会慢成蜗牛甚至发散。这里把我在实际中验证过有效的调参套路直接写出来。4.1 初始步长与谱范数估计收敛条件只要求 (\tau\sigma|A|^2 1)但具体取多大呢一种常用策略是固定 (\tau \sigma)让两者都取 (0.99 / |A|)。问题是 (|A|) 常常不知道。这时最实用的办法是幂迭代法power iteration几十次迭代就能把最大奇异值估得差不多。也可以取一个更保守的上界若 (A) 是一个卷积算子它的谱范数不超过其核的 (\ell_1) 范数对周期性卷积而言用这个上界定步长保证不发散。一个我踩过坑的细节很多人只算 (|A|) 却忘了 (A^T A) 的谱范数是 (|A|^2)。如果你在代码里写的条件是 (\tau\sigma|A^TA|)那就会把步长压低一个平方量级收敛慢到怀疑人生。4.2 原始和对偶步长的“跷跷板”现象PDHG中原始步长 (\tau) 和对偶步长 (\sigma) 的乘积有一个上限但它们的比例可以调节。这个比例显著影响收敛行为。如果把 (\tau) 调大、(\sigma) 调小原始空间收敛快对偶空间收敛慢如果把 (\sigma) 调大、(\tau) 调小对偶空间收敛快原始空间收敛慢。在实际应用中如果重点关注原始解 (x) 的质量可以把 (\tau) 设为大于 (\sigma)比如 (\tau 10\sigma)只要乘积满足条件就行。但要注意在康托洛维奇最优传输这类问题里对偶解本身就具有物理意义比如对偶变量代表势能函数此时两边都要平衡比例不能太过极端。推荐一个后续可以尝试的自适应策略每迭代几百步统计原始残差和对偶残差的下降速度哪个慢就把哪个方向的步长稍微调大一点同时按比例缩小另外一个方向。这比固定步长能快一倍以上二十年来有不少论文在做类似思路实践中直接按这个原则手调也能获得可观的收益。4.3 收敛判据别只看目标函数值PDHG的收敛判据常见的有两类原始残差和对偶残差。目标函数值下降不一定说明算法收敛了尤其是在非光滑优化中目标函数值可能先降后升或者在不同解之间跳动。更可靠的判据是检查迭代点是否满足原始可行性、对偶可行性以及原始-对偶间隙。一个通用的工程做法是记录相邻两次迭代的 (x) 和 (y) 变化量当[ \frac{|x_{k1} - x_k|}{\max(1, |x_k|)} \epsilon ]并且对偶变量也同样满足时判定收敛。在低精度场景如图像去模糊的视觉质量(\epsilon 10^{-4}) 通常已经足够在高精度科学计算场景可能需要降到 (10^{-8})这时务必用双精度浮点且仔细检查步长。5. 实战中常见的三种退化情形与排查清单把PDHG写成代码不难难的是它在某些问题上一跑就“怪怪的”。下面三类情形是我在实际中遇到的几乎涵盖了80%的“PDHG翻车现场”。5.1 情形一步长满足条件但震荡不收敛症状目标函数曲线像锯齿震荡的幅度不减小甚至缓慢增长。原因排查第一优先检查 (\tau\sigma|A|^2 1) 是否真的满足。注意 (|A|) 的估计可能偏小尤其是随机初始化时偶尔会低估。重新用幂迭代跑50次或者把步长乘一个0.5的安全系数再试。第二个常见坑是 (f) 或 (g) 不是闭凸函数。比如某些用户自定义的“惩罚项”其实非凸PDHG的收敛性无法保证。第三个原因是外推参数 (\theta) 取太大。理论上 (\theta1) 可行但在数值上若 (\tau\sigma|A|^2) 非常接近1外推容易放大误差。此时要么调低步长要么把 (\theta) 降到0.9甚至0.5。5.2 情形二收敛很慢迭代几千步才有点效果症状不震荡但收敛速度感人几百步看不出明显进展。这是PDHG最常被吐槽的点。原因一般是步长太小或比例失衡。排查步骤把 (\tau) 和 (\sigma) 的乘积尽量推到接近1的界限比如取 (0.9 / |A|^2)。检查 (\tau/\sigma) 的比例是否合适。如果问题中对偶变量影响更大那就是 (\sigma) 相对太小了需要调大它。确认不是条件数太大导致的固有限制。PDHG对病态问题的收敛速率本质上是次线性的如果你面对的是高度病态的二次规划它确实不如直接用内点法。也可以尝试预条件preconditioning技巧用对角矩阵缩放 (A) 的行或列有时可以把条件数拉回来一个数量级。5.3 情形三子问题的prox出现了“非预期行为”这是最隐蔽的坑。PDHG依赖于每一步prox的精确计算但很多第三方库中的prox只是“近似实现”。比如在GPU上为了性能有时会用软阈值近似替代精确投影。当近似误差不能忽略时整个算法实际上是在求解一个与原始问题不同的东西。一个我踩过的具体例子求解带 (\ell_\infty) 约束的问题时(\mathrm{prox}_{g^*}) 本来应该是单纯形投影但某些库的单纯形投影实现对大向量会损失精度导致在边界解附近来回抖。解决办法是换一个数值更稳定的投影实现并且把每次prox的输入输出统一做一次数值检查。5.4 一份可以直接照抄的排查清单检查 (|A|) 估计是否准确幂迭代至少50次检查 (\tau\sigma|A|^2) 是否在 ([0.5, 0.99]) 之间检查 (A^T) 是否确实是 (A) 的伴随这一步很多人都会写反检查 (g^*) 的prox是否用对了公式检查外推步是否在边界使用了裁剪检查目标函数和约束是否真的满足凸性最后如果以上全对但依然收敛慢换成自适应步长的PDHG或换算法。6. 一个可以直接上手的低秩矩阵恢复实验理论讲太多容易飘这里分享一个我反复用来测试PDHG的经典例子低秩矩阵恢复。6.1 问题定义与建模假设观测到了矩阵 (M) 的部分元素 (b P_\Omega(M))要恢复完整矩阵 (X)。数学模型为[ \min_X |X|* \quad \text{s.t.} \quad P\Omega(X) P_\Omega(M) ]其中 (|\cdot|_*) 是核范数。把约束改成惩罚形式[ \min_X |X|* \frac{\lambda}{2}|P\Omega(X) - b|_F^2 ]这个形式下 (f(x)) 是二次损失项光滑(g(Ax) |X|_*)非光滑且 (A I)。虽然这里没有非平凡的线性算子但核范数的prox需要对矩阵做奇异值分解这种操作在高维下计算量极大用ADMM也同样需要反复做SVD效率都很低。用PDHG时把 (|X|*) 通过对偶写成 (\max{|Y|_2 \le 1} \langle X, Y \rangle)其中 (|Y|_2) 表示谱范数。此时 (g^*) 是指示函数其prox就是谱范数球上的投影也即对矩阵做SVD并把奇异值截断到1。原始步是一个简单的二次损失prox就是一步矩阵加法和缩放。6.2 在中等规模矩阵上观察到的收敛行为我曾在一个 (500 \times 500) 的随机低秩矩阵、观测比例20%的设定下测试。用完全外推的PDHG迭代大约500步时恢复误差降到 (10^{-3})2000步时稳定在 (10^{-5}) 量级。与之对比若固定 (\theta0)无外推同样精度需要迭代上万步。可见外推算是PDHG性能的命门之一。这个实验也验证了一个重要直觉PDHG的收敛速度高度依赖步长比 (\tau/\sigma)。把 (\tau \sigma) 时收敛尚可但把 (\tau) 略微调大后保持乘积不变原始空间收敛显著加快。在这里因为原始空间直接决定最终解适当偏向原始步是对的。7. PDHG的扩展方向从标准形式到实际工程问题最后聊一下PDHG最近的扩展思路以及在实际工程中如何“偷偷”利用这些扩展来加速。7.1 自适应步长与预条件变体学术界近年提出了多种自适应PDHG常见策略是在线估计局部Lipschitz常数或者使用类似AdaGrad的思路对每个坐标单独设定步长。虽然理论分析还没有完全成熟但工程上已经可以放心使用。我自己的经验是对于多尺度问题比如网格自适应细化后的图像处理对角预条件PDHG比均匀步长快一个数量级。7.2 线性化技巧把非光滑项放到一个“便宜”的算子下有时候 (g(Ax)) 中的 (A) 并没有好的结构计算 (A) 和 (A^T) 本身就很昂贵。可以做一个近似线性化把 (A) 展开成“单位阵加上小扰动”这时PDHG的prox步会变得极便宜。不过这类近似方法需要额外监控精度损失不建议新手一上来就用。7.3 与随机梯度思想的结合在机器学习领域如果 (f(x)) 是一个有限和形式比如[ f(x) \frac{1}{n}\sum_{i1}^n f_i(x) ]可以在PDHG的原始步中对 (f) 做随机子采样估计得到随机PDHG类算法。这类方法在最优传输、联邦学习、大规模线性规划中都有应用。但注意随机化会给迭代过程引入额外方差需要配合方差缩减技术如SVRG类技巧才能稳定收敛。8. 写在最后的一点实操体会PDHG真正打动我的地方在于它的“分而治之”思想把复杂问题拆成原始、对偶两个相对简单的部分然后让它们交替修正对方。它并不在每个子问题内部做“完美求解”而是只做一步近似推进这种“始终不彻底”的做法反而换来了每一步的低成本和高稳定性。根据我的经验如果你面对的问题是图像反问题、最优传输、大尺度带约束优化、或者任何“矩阵结构差且数据量巨大”的凸优化问题PDHG大概率比ADMM更容易出活。但如果你追求“尽可能少迭代次数达到极高精度”并且 (A) 的结构允许高效求解子问题ADMM或二阶方法仍然不可替代。最后分享一个调试时的加分项把目标函数值、原始残差、对偶残差三条曲线画在同一张图上并叠加步长参数的变化标记。这比自己记日志高效得多曲线形状往往一眼就能看出问题是出在步长比例失衡还是外推过头还是prox实现有误。我在解决自己的调参问题时就是这样从“数学院士”——用数学理论推导发散原因——降级成了“代码调试”——用可视化定位到具体代码行。优化算法调试本来就是一种数据驱动的工作把它当科学实验来对待思路会清晰很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →