文章目录
1. ADMM原理
1.1. 数学形式
我们要解的优化问题长这样:
min x ∈ R n , z ∈ R m f ( x ) + g ( z ) subject to A x + B z = c . \min_{x \in \mathbf{R}^n,\; z \in \mathbf{R}^m} \quad f(x) + g(z) \quad\text{subject to}\quad A x + B z = c. x∈Rn,z∈Rmminf(x)+g(z)subject toAx+Bz=c.
这意味着我们想同时让 f ( x ) f(x) f(x) 和 g ( z ) g(z) g(z)尽可能小,但它们又要满足一个线性约束 A x + B z = c A x + B z = c Ax+Bz=c。
- x x x 和 z z z分别是不同的变量,
- f f f 和 g g g都是凸函数(这保证了算法更容易收敛),
- A A A 和 B B B 是已知的矩阵,
- c c c 是已知的常量。
为什么要分成 x x x 和 z z z 两组变量?通常是因为 f f f 和 g g g 可能各自有特殊结构,例如一个是稀疏正则项( L 1 L_1 L1 范数),另一个可能是平方和之类的简单函数。要是把它们混在一起难以统一求解,就可以“拆开”来做。
1.2. 传统“乘子法”和它的不足
在最经典的拉格朗日乘子法里,我们会先把约束放进一个“增强过”的目标函数里,称为“增广拉格朗日函数”(augmented Lagrangian),它一般长这样:
L ρ ( x , z , y ) = f ( x ) + g ( z ) + y T ( A x + B z − c ) + ρ 2 ∥ A x + B z − c ∥ 2 2 , L_\rho(x, z, y) = f(x) + g(z) + y^T(Ax + Bz - c) + \frac{\rho}{2}\|Ax + Bz - c\|_2^2, Lρ(x,z,y)=f(x)+g(z)+yT(Ax+Bz−c)+2ρ∥Ax+Bz−c∥22,
其中 y y y 是所谓的“对偶变量”或者“拉格朗日乘子”, ρ > 0 \rho>0 ρ>0 是个参数(它决定惩罚力度)。
在传统乘子法里,每次迭代要同时对 x x x 和 z z z 都做一个“联合最小化”(joint minimization):
( x k + 1 , z k + 1 ) = arg min x , z L ρ ( x , z , y k ) , (x^{k+1}, z^{k+1}) = \arg\min_{x,z} \; L_\rho(x, z,\, y^k), (xk+1,zk+1)=argx,zminLρ(x,z,yk),
然后再更新对偶变量
y k + 1 = y k + ρ ( A x k + 1 + B z k + 1 − c ) . y^{k+1} = y^k + \rho\bigl(Ax^{k+1} + Bz^{k+1} - c\bigr). yk+1=yk+ρ(Axk+1+Bzk+1−c).
这样做当然可以,但如果 f f f 和 g g g的形式比较复杂,或者维度较大,那这个“联合最小化”就不好算(可能很耗时,或者甚至求不出来)。
1.3. ADMM 的核心思想:分步做
ADMM(Alternating Direction Method of Multipliers,“交替方向乘子法”)最主要的特色就是不再让 x x x 和 z z z 同时做大的联合求解,而是“先算 x x x,再算 z z z”的交替方式。它的三步更新如下:
-
x x x-更新:固定住旧的 z k z^k zk 和 y k y^k yk,只对 x x x 做一个最优更新:
x k + 1 = arg min x L ρ ( x , z k , y k ) . x^{k+1} = \arg\min_x \; L_\rho(x,\; z^k,\; y^k). xk+1=argxminLρ(x,zk,yk).
由于 z k 、 y k z^k、y^k zk、yk 不变,这一步就是在一个比较“简化了”的函数里找最优 x x x。 -
z z z-更新:拿到更新后的 x k + 1 x^{k+1} xk+1,再固定它和 y k y^k yk,对 z z z 做最优更新:
z k + 1 = arg min z L ρ ( x k + 1 , z , y k ) . z^{k+1} = \arg\min_z \; L_\rho\bigl(x^{k+1},\; z,\; y^k\bigr). zk+1=argzminLρ(xk+1,z,yk). -
对偶变量 y y y 更新:有了新的 x k + 1 x^{k+1} xk+1 和 z k + 1 z^{k+1} zk+1,再更新对偶变量 y y y:
y k + 1 = y k + ρ ( A x k + 1 + B z k + 1 − c ) . y^{k+1} = y^k + \rho\bigl(Ax^{k+1} + Bz^{k+1} - c\bigr). yk+1=yk+ρ(Axk+1+Bzk+1−c).
这样一来,每一步都只是对一个变量做最小化,问题规模往往更小,如果 f ( x ) f(x) f(x) 和 g ( z ) g(z) g(z) 还是那种可以分开处理的“友好”函数,求解起来也更容易、更快。
1.4. Scaled Form of ADMM
在 Scaled Form 里,我们把对偶变量 换一种等价的表示。为了方便,我们先定义一个所谓的残差(residual):
r = A x + B z − c . r = Ax + Bz - c. r=Ax+Bz−c.
同时,定义“缩放后的对偶变量”(scaled dual variable) u u u:
u = 1 ρ y . u = \frac{1}{\rho}y. u=ρ1y.
这样,原先的项 y T r + ρ 2 ∥ r ∥ 2 y^T r + \frac{\rho}{2}\|r\|^2 yTr+2ρ∥r∥2可以用 u u u 来重写成
( ρ / 2 ) ∥ r + u ∥ 2 2 ⏟ 重新打包 − ( ρ / 2 ) ∥ u ∥ 2 2 ⏟ 校正 . \underbrace{(\rho/2)\|\,r + u\,\|^2_2}_\text{重新打包} \;-\; \underbrace{(\rho/2)\|u\|^2_2}_\text{校正}. 重新打包
(ρ/2)∥r+u∥22−校正
(ρ/2)∥u∥22.
这个结论的得来类似于高中学到的凑平方项。
“用 u = 1 ρ y u = \tfrac{1}{\rho}y u=ρ1y 替换后,线性和二次项可以组合到一个“ ρ 2 ∥ r + u ∥ 2 \frac{\rho}{2}\|r + u\|^2 2ρ∥r+u∥2”形式里,看起来更整洁。”
在这个新的记号下,ADMM 的迭代过程可以写成(省去常数项):
-
x x x-更新:
x k + 1 = arg min x ( f ( x ) + ρ 2 ∥ A x + B z k − c + u k ∥ 2 2 ) . x^{k+1} = \arg\min_x \Bigl(f(x) \;+\; \frac{\rho}{2}\,\bigl\|\;Ax \;+\; Bz^k \;-\; c \;+\; u^k\bigr\|_2^2\Bigr). xk+1=argxmin(f(x)+2ρ Ax+Bzk−c+uk 22). -
z z z-更新:
z k + 1 = arg min z ( g ( z ) + ρ 2 ∥ A x k + 1 + B z − c + u k ∥ 2 2 ) . z^{k+1} = \arg\min_z \Bigl(g(z) \;+\; \frac{\rho}{2}\,\bigl\|\;A x^{k+1} \;+\; Bz \;-\; c \;+\; u^k\bigr\|_2^2\Bigr). zk+1=argzmin(g(z)+2ρ Axk+1+Bz−c+uk 22). -
u u u-更新:
u k + 1 = u k + ( A x k + 1 + B z k + 1 − c ) . u^{k+1} = u^k \;+\; \bigl(Ax^{k+1} + Bz^{k+1} - c\bigr). uk+1=uk+(Axk+1+Bzk+1−c).
你会发现,现在对偶更新变得很简单,直接是对旧的 u u u 加上“残差” r = A x + B z − c r = Ax + Bz - c r=Ax+Bz−c。而在 unscaled form 里则是
y k + 1 = y k + ρ r k . ⟺ u k + 1 = u k + r k , 因为 u = 1 ρ y . y^{k+1} = y^k + \rho\,r^k. \quad\Longleftrightarrow\quad u^{k+1} = u^k + r^k, \quad\text{因为 }u=\tfrac{1}{\rho}y. yk+1=yk+ρrk.⟺uk+1=uk+rk,因为 u=ρ1y.
也就是说,两个形式做的事情完全一样,只是在对偶变量上做一个因子 1 ρ \tfrac{1}{\rho} ρ1 的缩放。
1.5. 迭代过程中主要检查的两大残差
两个残差(residual):
-
主(primal)残差
r k + 1 = A x k + 1 + B z k + 1 − c . r^{k+1} \;=\; A\,x^{k+1} \;+\; B\,z^{k+1} \;-\; c. rk+1=Axk+1+Bzk+1−c.
这是用来度量“原约束 A x + B z = c A x + B z = c Ax+Bz=c”在迭代第 k + 1 k+1 k+1 步时的偏差。若 r k + 1 r^{k+1} rk+1 越接近 0,说明越接近可行。 -
对偶(dual)残差
s k + 1 = ρ A T B ( z k + 1 − z k ) . s^{k+1} \;=\; \rho\,A^T\,B\,(z^{k+1} - z^k). sk+1=ρATB(zk+1−zk).
这是用来度量对偶可行性。若 s k + 1 s^{k+1} sk+1 越接近 0,说明越接近对偶可行。
在 ADMM 中,你会看到在每次迭代完 x k + 1 , z k + 1 x^{k+1}, z^{k+1} xk+1,zk+1 后,会“顺手”计算这两个残差,用来判断收敛程度。
1.6. 怎么设置停止准则(Stopping Criteria)?
一个常见且实用的做法就是直接对主残差和对偶残差设置阈值:
∥ r k ∥ 2 ≤ ε pri and ∥ s k ∥ 2 ≤ ε dual , \|r^k\|_2 \;\le\; \varepsilon_{\text{pri}} \quad\text{and}\quad \|s^k\|_2 \;\le\; \varepsilon_{\text{dual}}, ∥rk∥2≤εpriand∥sk∥2≤εdual,
- ε pri > 0 \varepsilon_{\text{pri}} > 0 εpri>0(主可行性余量)
- ε dual > 0 \varepsilon_{\text{dual}} > 0 εdual>0(对偶可行性余量)
只要这两个残差都小于各自阈值,就认定收敛。
但是,上述设置也会存在如下问题:
- 如果问题中 ∥ c ∥ \|c\| ∥c∥、 ∥ A x k ∥ \|A x^k\| ∥Axk∥、 ∥ B z k ∥ \|B z^k\| ∥Bzk∥ 值很大,仅仅用一个小绝对值判断误差会显得“吹毛求疵”,或者数值上不稳定;
- 如果问题中变量本身特别小,仅用相对误差也可能不够;
所以可以采用下面一个典型设置:
ε pri = p ε abs + ε rel max { ∥ A x k ∥ 2 , ∥ B z k ∥ 2 , ∥ c ∥ 2 } , ε dual = n ε abs + ε rel ∥ A T y k ∥ 2 , \varepsilon_{\text{pri}} =\sqrt{p}\,\varepsilon_{\text{abs}} \;+\; \varepsilon_{\text{rel}}\, \max\,\{\,\|A x^k\|_2,\;\|B z^k\|_2,\;\|c\|_2\},\\ \varepsilon_{\text{dual}} =\sqrt{n}\,\varepsilon_{\text{abs}} \;+\; \varepsilon_{\text{rel}}\, \|A^T y^k\|_2, εpri=p