md_files/科研/交替方向乘子法(ADMM).md

235 lines
5.5 KiB
Markdown
Raw Normal View History

2025-03-18 12:46:59 +08:00
# 交替方向乘子法ADMM
**Alternating Direction Method of Multipliers (ADMM)** 是一种用于求解大规模优化问题的高效算法,结合了拉格朗日乘子法和分裂方法的优点。
---
## 基本概念
- **优化问题分解**
ADMM 的核心思想是将复杂优化问题分解为多个较简单的子问题,通过引入辅助变量将原问题转化为约束优化问题,使子问题独立求解。
- **拉格朗日乘子**
利用拉格朗日乘子处理约束条件,构造增强拉格朗日函数,确保子问题求解时同时考虑原问题的约束信息。
- **交替更新**
通过交替更新子问题的解和拉格朗日乘子,逐步逼近原问题的最优解。
---
## 算法流程
1. **问题分解**
将原问题分解为两个子问题。假设原问题表示为:
$\min_{x, z} f(x) + g(z) \quad \text{s.t.} \quad Ax + Bz = c$
2025-03-18 12:46:59 +08:00
其中 $f$ 和 $g$ 是凸函数,$A$ 和 $B$ 为给定矩阵。
2. **构造增强拉格朗日函数**
引入拉格朗日乘子 $y$,构造增强拉格朗日函数:
$L_\rho(x, z, y) = f(x) + g(z) + y^T(Ax+Bz-c) + \frac{\rho}{2}\|Ax+Bz-c\|^2$
2025-03-18 12:46:59 +08:00
其中 $\rho > 0$ 控制惩罚项的权重。
3. **交替更新**
- **更新 $x$**:固定 $z$ 和 $y$,求解 $\arg\min_x L_\rho(x, z, y)$。
- **更新 $z$**:固定 $x$ 和 $y$,求解 $\arg\min_z L_\rho(x, z, y)$。
- **更新乘子 $y$**:按梯度上升方式更新:
$y := y + \rho(Ax + Bz - c)$
2025-03-18 12:46:59 +08:00
4. **迭代求解**
重复上述步骤,直到原始残差和对偶残差满足收敛条件(如 $\|Ax+Bz-c\| < \epsilon$)。
## 例子
下面给出一个简单的数值例子,展示 ADMM 在求解分解问题时的迭代过程。我们构造如下问题:
$$
\begin{aligned}
\min_{x, z}\quad & (x-1)^2 + (z-2)^2 \\
\text{s.t.}\quad & x - z = 0.
\end{aligned}
$$
**注意**:由于约束要求 $x=z$,实际问题等价于
$$
\min_{x} (x-1)^2 + (x-2)^2,
$$
其解析最优解为:
$$
2(x-1)+2(x-2)=4x-6=0\quad\Rightarrow\quad x=1.5,
$$
因此我们希望得到 $x=z=1.5$。
**构造 ADMM 框架**
将问题写成 ADMM 标准形式:
-
$$
f(x)=(x-1)^2,\quad g(z)=(z-2)^2,
$$
- 约束写为
$$
x-z=0,
$$
即令 $A=1$、$B=-1$、$c=0$。
增强拉格朗日函数为
$$
L_\rho(x,z,y)=(x-1)^2+(z-2)^2+y(x-z)+\frac{\rho}{2}(x-z)^2,
$$
其中 $y$ 是拉格朗日乘子,$\rho>0$ 是惩罚参数。为简单起见,我们选取 $\rho=1$。
**ADMM 的更新公式**
针对本问题可以推导出三个更新步骤:
1. **更新 $x$**
固定 $z$ 和 $y$,求解
$$
x^{k+1} = \arg\min_x\; (x-1)^2 + y^k(x-z^k)+\frac{1}{2}(x-z^k)^2.
$$
对 $x$ 求导并令其为零:
$$
2(x-1) + y^k + (x-z^k)=0 \quad\Rightarrow\quad (2+1)x = 2 + z^k - y^k,
$$
得到更新公式:
$$
x^{k+1} = \frac{2+z^k-y^k}{3}.
$$
2. **更新 $z$**
固定 $x$ 和 $y$,求解
$$
z^{k+1} = \arg\min_z\; (z-2)^2 - y^kz+\frac{1}{2}(x^{k+1}-z)^2.
$$
注意:由于 $y(x-z)$ 中关于 $z$ 的部分为 $-y^kz$(常数项 $y^kx$ 可忽略),求导得:
$$
2(z-2) - y^k - (x^{k+1}-z)=0 \quad\Rightarrow\quad (2+1)z = 4 + y^k + x^{k+1},
$$
得到更新公式:
$$
z^{k+1} = \frac{4+y^k+x^{k+1}}{3}.
$$
3. **更新 $y$**
按梯度上升更新乘子:
$$
y^{k+1} = y^k + \rho\,(x^{k+1}-z^{k+1}).
$$
这里 $\rho=1$,所以
$$
y^{k+1} = y^k + \bigl(x^{k+1}-z^{k+1}\bigr).
$$
**数值迭代示例**
**第 1 次迭代:**
- **更新 $x$**
$$
x^1 = \frac{2+z^0-y^0}{3}=\frac{2+0-0}{3}=\frac{2}{3}\approx0.667.
$$
- **更新 $z$**
$$
z^1 = \frac{4+y^0+x^1}{3}=\frac{4+0+0.667}{3}\approx\frac{4.667}{3}\approx1.556.
$$
- **更新 $y$**
$$
y^1 = y^0+(x^1-z^1)=0+(0.667-1.556)\approx-0.889.
$$
---
**第 2 次迭代:**
- **更新 $x$**
$$
x^2 = \frac{2+z^1-y^1}{3}=\frac{2+1.556-(-0.889)}{3}=\frac{2+1.556+0.889}{3}\approx\frac{4.445}{3}\approx1.4817.
$$
- **更新 $z$**
$$
z^2 = \frac{4+y^1+x^2}{3}=\frac{4+(-0.889)+1.4817}{3}=\frac{4-0.889+1.4817}{3}\approx\frac{4.5927}{3}\approx1.5309.
$$
- **更新 $y$**
$$
y^2 = y^1+(x^2-z^2)\approx -0.889+(1.4817-1.5309)\approx -0.889-0.0492\approx -0.938.
$$
---
**第 3 次迭代:**
- **更新 $x$**
$$
x^3 = \frac{2+z^2-y^2}{3}=\frac{2+1.5309-(-0.938)}{3}=\frac{2+1.5309+0.938}{3}\approx\frac{4.4689}{3}\approx1.4896.
$$
- **更新 $z$**
$$
z^3 = \frac{4+y^2+x^3}{3}=\frac{4+(-0.938)+1.4896}{3}\approx\frac{4.5516}{3}\approx1.5172.
$$
- **更新 $y$**
$$
y^3 = y^2+(x^3-z^3)\approx -0.938+(1.4896-1.5172)\approx -0.938-0.0276\approx -0.9656.
$$
---
从迭代过程可以看出:
- $x$ 和 $z$ 的值在不断调整,目标是使两者相等,从而满足约束。
- 最终随着迭代次数增加,$x$ 和 $z$ 会收敛到约 1.5,同时乘子 $y$ 收敛到 $-1$(这与 KKT 条件相符)。
## 应用领域
- **大规模优化**
在大数据、机器学习中利用并行计算加速求解。
- **信号与图像处理**
用于去噪、压缩感知等稀疏表示问题。
- **分布式计算**
在多节点协同场景下求解大规模问题。
---
## 优点与局限性
| **优点** | **局限性** |
| ------------------ | ---------------------- |
| 分布式计算能力 | 小规模问题可能收敛较慢 |
| 支持稀疏性和正则化 | 参数 $\rho$ 需精细调节 |
| 收敛性稳定 | — |