近似梯度法在非光滑优化中的应用进阶题:处理L1范数正则化问题的复合优化
1. 题目描述
考虑一个复合优化问题,目标函数由可微部分与不可微部分叠加而成,具体形式如下:
\[\min_{x \in \mathbb{R}^n} \quad F(x) = f(x) + \lambda \|x\|_1 \]
其中:
- \(f: \mathbb{R}^n \to \mathbb{R}\) 是一个光滑函数,其梯度 \(\nabla f\) 是 Lipschitz 连续且已知(例如最小二乘损失 \(f(x) = \frac{1}{2} \|Ax - b\|^2\))。
- \(\|x\|_1 = \sum_{i=1}^n |x_i|\) 是 L1 范数,作为正则项引入以促进解的稀疏性。
- \(\lambda > 0\) 是正则化参数。
这个问题是典型的非光滑优化问题,因为 L1 范数在坐标为零的点不可微。本题要求使用近似梯度法(Proximal Gradient Method)求解,并分析其收敛行为。
2. 核心思想
近似梯度法(又称近端梯度法)的核心是将目标函数分解为两部分:
- 光滑部分: \(f(x)\),可计算梯度。
- 非光滑部分: \(g(x) = \lambda \|x\|_1\),通常结构简单,可以高效计算其近端算子(proximal operator)。
算法步骤:
- 在每一步,先对光滑部分 \(f\) 做梯度下降,得到一个中间点。
- 然后对非光滑部分 \(g\) 施加近端算子,将中间点映射回可行域,同时保留 \(g\) 的结构特性。
- 重复迭代直至收敛。
3. 详细推导与求解过程
步骤1:写出近端算子
对于 L1 范数,近端算子有一个闭式解,称为软阈值算子(soft-thresholding operator):
\[\text{prox}_{\alpha g}(y) = \arg\min_{z} \left\{ \lambda \|z\|_1 + \frac{1}{2\alpha} \|z - y\|^2 \right\} \]
这个优化问题可以按分量独立求解,结果对每个坐标 \(i\) 为:
\[[\text{prox}_{\alpha g}(y)]_i = \text{sign}(y_i) \cdot \max\left( |y_i| - \alpha\lambda, 0 \right) \]
其中 \(\alpha > 0\) 是步长。
步骤2:近似梯度法的迭代格式
给定当前迭代点 \(x^k\),步长 \(\alpha_k > 0\),迭代格式为:
\[x^{k+1} = \text{prox}_{\alpha_k g} \left( x^k - \alpha_k \nabla f(x^k) \right) \]
代入 L1 范数的近端算子,得到:
\[x_i^{k+1} = \text{sign}\left( x_i^k - \alpha_k [\nabla f(x^k)]_i \right) \cdot \max\left( \left| x_i^k - \alpha_k [\nabla f(x^k)]_i \right| - \alpha_k \lambda, 0 \right) \]
步骤3:步长的选择
为了确保收敛,步长 \(\alpha_k\) 通常需要满足:
- 恒定步长:若 \(\nabla f\) 是 Lipschitz 连续且 Lipschitz 常数为 \(L\),则 \(\alpha_k \in (0, 1/L]\)。
- 回溯线搜索(backtracking line search):从一个初始步长开始,逐步减小直到满足下降条件。
回溯线搜索条件(Armijo 型条件):
\[f(x^{k+1}) \le f(x^k) + \nabla f(x^k)^\top (x^{k+1} - x^k) + \frac{1}{2\alpha_k} \|x^{k+1} - x^k\|^2 \]
实际上,由于涉及 \(g\),通常使用一个组合的下降条件(见下一步)。
步骤4:算法实现(含回溯线搜索)
我们使用一个标准的近似梯度法变体——加速近似梯度法(FISTA,Fast Iterative Shrinkage-Thresholding Algorithm)来提升收敛速度。
FISTA 算法步骤:
- 初始化 \(x^0 = y^1\),\(t_1 = 1\),最大迭代次数 \(K\)。
- 对 \(k = 1, 2, \dots, K\) 执行:
a. 令 \(v = y^k - \alpha_k \nabla f(y^k)\),其中 \(\alpha_k\) 通过回溯线搜索确定。
b. 计算 \(x^k = \text{prox}_{\alpha_k g}(v)\)(软阈值操作)。
c. 更新 \(t_{k+1} = \frac{1 + \sqrt{1 + 4 t_k^2}}{2}\)。
d. 计算 \(y^{k+1} = x^k + \frac{t_k - 1}{t_{k+1}} (x^k - x^{k-1})\)(加速步骤)。 - 输出 \(x^K\)。
步骤5:收敛性分析
- 标准近似梯度法(无加速)在目标函数 \(F\) 是凸的情况下,收敛速度为 \(O(1/k)\)。
- FISTA(加速版本)达到更快的 \(O(1/k^2)\) 收敛速度。
- 若 \(f\) 是强凸的,收敛速度可提升至线性收敛。
步骤6:数值示例(以最小二乘为例)
设 \(f(x) = \frac{1}{2} \|Ax - b\|^2\),则 \(\nabla f(x) = A^\top (Ax - b)\)。
给定数据 \(A \in \mathbb{R}^{m \times n}, b \in \mathbb{R}^m, \lambda = 0.1\)。
算法步骤:
- 初始化 \(x^0 = 0\),初始步长 \(\alpha_0 = 1 / \|A^\top A\|_2\)。
- 迭代:
- 计算梯度: \(g_k = A^\top (A y^k - b)\)。
- 回溯步长:从 \(\alpha = \alpha_{k-1}\) 开始,不断尝试 \(\alpha := \beta \alpha\)(如 \(\beta=0.8\))直到满足:
\[ F\left( \text{prox}_{\alpha g}(y^k - \alpha g_k) \right) \le Q_\alpha\left( \text{prox}_{\alpha g}(y^k - \alpha g_k), y^k \right) \]
其中 $Q_\alpha(z, y) = f(y) + \nabla f(y)^\top (z - y) + \frac{1}{2\alpha} \|z - y\|^2 + \lambda \|z\|_1$ 是近端点模型。
- 更新 \(x^k\) 和 \(y^{k+1}\) 如上。
- 终止条件: \(\|x^k - x^{k-1}\|_\infty < \epsilon\)(如 \(\epsilon = 10^{-6}\))。
4. 关键点总结
- 分解目标:将问题拆分为光滑部分 \(f\) 与非光滑部分 \(g\)。
- 近端算子:对于 L1 范数,近端算子是软阈值算子,有显式解。
- 迭代格式:先对光滑部分做梯度步,再对非光滑部分做近端映射。
- 步长选择:通过 Lipschitz 常数或回溯线搜索确定步长,确保下降性。
- 加速技巧:使用 FISTA 的动量加速,可显著提升收敛速度。
- 收敛保证:在凸条件下,算法保证收敛到全局最优解。
这种方法广泛应用于机器学习中的稀疏优化(如 Lasso)、信号处理、压缩感知等领域,因为它能有效处理非光滑正则项且实现简单高效。