md_files/科研/交替方向乘子法(ADMM).md
2025-03-21 13:56:48 +08:00

235 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 交替方向乘子法ADMM
**Alternating Direction Method of Multipliers (ADMM)** 是一种用于求解大规模优化问题的高效算法,结合了拉格朗日乘子法和分裂方法的优点。
---
## 基本概念
- **优化问题分解**
ADMM 的核心思想是将复杂优化问题分解为多个较简单的子问题,通过引入辅助变量将原问题转化为约束优化问题,使子问题独立求解。
- **拉格朗日乘子**
利用拉格朗日乘子处理约束条件,构造增强拉格朗日函数,确保子问题求解时同时考虑原问题的约束信息。
- **交替更新**
通过交替更新子问题的解和拉格朗日乘子,逐步逼近原问题的最优解。
---
## 算法流程
1. **问题分解**
将原问题分解为两个子问题。假设原问题表示为:
$$\min_{x, z} f(x) + g(z) \quad \text{s.t.} \quad Ax + Bz = c$$
其中 $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$$
其中 $\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)$$
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$ 需精细调节 |
| 收敛性稳定 | — |