随机化块坐标下降法在凸优化问题求解中的应用
我们来讲解随机化块坐标下降法。这是一种用于求解大规模凸优化问题的迭代算法,特别适用于目标函数可分解为光滑部分和可分非光滑部分的问题。它通过随机选择变量块进行更新,具有计算简单、内存需求低、易于并行化的优点,广泛应用于机器学习、统计和工程领域。
题目描述
考虑如下形式的凸优化问题:
\[\min_{x \in \mathbb{R}^n} F(x) = f(x) + \sum_{i=1}^m g_i(x^{(i)}) \]
其中:
- 决策变量 \(x\) 被划分为 \(m\) 个不相交的块,即 \(x = (x^{(1)}, \dots, x^{(m)})\)。
- \(f: \mathbb{R}^n \to \mathbb{R}\) 是一个可微凸函数,其梯度是 Lipschitz 连续的。
- 每个 \(g_i: \mathbb{R}^{n_i} \to \mathbb{R} \cup \{+\infty\}\) 是一个凸函数(可能非光滑,例如 L1 范数),但它是可分的,即只依赖于对应变量块 \(x^{(i)}\)。
我们的目标是设计一种随机化算法,在每次迭代中随机选取一个变量块,仅对该块执行一次下降步骤,最终收敛到问题的解。
解题过程
步骤1:问题重构与算法动机
原始问题包含可微项 \(f\) 和非光滑项 \(g_i\)。由于 \(g_i\) 不可微,直接使用梯度下降法困难。但 \(g_i\) 关于各块是可分的,这使我们能够对每个块独立处理。
核心思想:
- 坐标下降:固定其他所有块,只优化一个块。这通常能得到一个更简单的子问题。
- 随机化:在每次迭代中,随机均匀地选择一个块索引 \(i_k \in \{1, \dots, m\}\) 来更新。这避免了按固定顺序更新可能导致的效率低下,并有助于理论上的收敛性分析。
步骤2:单次迭代的更新公式
假设在第 \(k\) 次迭代,我们选择了块 \(i = i_k\)。令当前迭代点为 \(x_k\)。我们固定其他所有块 \(x^{(j)}, j \ne i\),然后求解如下关于 \(x^{(i)}\) 的子问题:
\[x_{k+1}^{(i)} = \arg\min_{y \in \mathbb{R}^{n_i}} \left\{ \langle \nabla_i f(x_k), y - x_k^{(i)} \rangle + \frac{L_i}{2} \|y - x_k^{(i)}\|^2 + g_i(y) \right\} \]
其中:
- \(\nabla_i f(x_k)\) 是 \(f\) 关于块 \(i\) 的偏梯度(在点 \(x_k\) 处)。
- \(L_i\) 是 \(f\) 关于块 \(i\) 的块坐标 Lipschitz 常数,即对任意 \(x\) 和只改变块 \(i\) 的 \(y\),有:
\[ \|\nabla_i f(x) - \nabla_i f(y)\| \le L_i \|x^{(i)} - y^{(i)}\| \]
- 子问题中的二次项 \(\frac{L_i}{2} \|y - x_k^{(i)}\|^2\) 是 \(f\) 在块 \(i\) 上的一个二次上界近似(由 Lipschitz 连续性保证)。
- 这个子问题被称为近端映射(proximal mapping)或近端算子:
\[ x_{k+1}^{(i)} = \mathrm{prox}_{(1/L_i) g_i} \left( x_k^{(i)} - \frac{1}{L_i} \nabla_i f(x_k) \right) \]
其中近端算子定义为:\(\mathrm{prox}_{\alpha g}(v) = \arg\min_y \{ g(y) + \frac{1}{2\alpha} \|y - v\|^2 \}\)。
更新后,其他块保持不变:
\[x_{k+1}^{(j)} = x_k^{(j)}, \quad \forall j \ne i \]
步骤3:完整算法流程
- 初始化:选择初始点 \(x_0 \in \mathbb{R}^n\)。
- 参数设置:对于每个块 \(i\),确定其 Lipschitz 常数 \(L_i\)(或使用一个全局上界 \(L_{\max}\))。
- 迭代循环(对于 \(k = 0, 1, 2, \dots\)):
a. 随机采样:以均匀概率 \(1/m\) 随机选择块索引 \(i_k \in \{1, \dots, m\}\)。
b. 计算梯度分量:计算偏梯度 \(\nabla_{i_k} f(x_k)\)。
c. 近端更新:求解近端映射得到新块:
\[ x_{k+1}^{(i_k)} = \mathrm{prox}_{(1/L_{i_k}) g_{i_k}} \left( x_k^{(i_k)} - \frac{1}{L_{i_k}} \nabla_{i_k} f(x_k) \right) \]
d. 保持其他块不变:对于 \(j \ne i_k\),令 \(x_{k+1}^{(j)} = x_k^{(j)}\)。
4. 终止条件:当达到预设的最大迭代次数,或目标函数值下降足够小,或梯度范数低于某个阈值时停止。
步骤4:关键细节与解释
- 为什么使用块 Lipschitz 常数?
因为整个函数 \(f\) 的梯度 Lipschitz 常数 \(L\) 可能很大,而针对每个块的 \(L_i\) 通常更小,从而允许在更新时使用更大的步长 \(1/L_i\),加速收敛。 - 近端算子的计算:
对于许多常见的非光滑函数 \(g_i\),其近端算子有解析解或高效算法。例如:- 若 \(g_i = 0\)(光滑问题),则更新退化为梯度下降:\(x_{k+1}^{(i)} = x_k^{(i)} - \frac{1}{L_i} \nabla_i f(x_k)\)。
- 若 \(g_i\) 是 L1 范数(即 \(g_i(y) = \lambda \|y\|_1\)),则近端算子是软阈值算子。
- 随机采样的优势:
与循环顺序相比,随机选择在理论和实践上常表现出更好的收敛速度,尤其对于大规模问题。它能避免因块更新顺序导致的效率损失,并简化期望意义下的收敛性证明。
步骤5:收敛性分析(基本思想)
在合理条件下(如 \(f\) 凸且梯度 Lipschitz 连续,\(g_i\) 凸且闭真),算法具有以下性质:
- 期望意义下的收敛:
对于迭代产生的序列 \(\{x_k\}\),有:
\[ \mathbb{E}[F(x_k)] - F^* \le O\left( \frac{m R_0^2}{k} \right) \]
其中 \(F^*\) 是最优值,\(R_0\) 是初始点到解集的距离,\(m\) 是块数。这表示达到 \(\epsilon\)-精度需要大约 \(O(m/\epsilon)\) 次迭代。
2. 加速变体:
可以引入 Nesterov 动量加速,得到随机化加速块坐标下降法,其收敛速度可提升至 \(O(m/\sqrt{\epsilon})\)。
3. 高概率收敛:
在更强条件下,算法还能保证高概率收敛。
步骤6:应用实例
考虑 L1 正则化逻辑回归:
\[\min_{w \in \mathbb{R}^n} \frac{1}{N} \sum_{j=1}^N \log(1 + \exp(-b_j a_j^T w)) + \lambda \|w\|_1 \]
其中 \(a_j\) 是特征向量,\(b_j \in \{\pm1\}\) 是标签。
我们可以将 \(w\) 划分为若干块(例如按特征分组),令:
- \(f(w)\) 为逻辑损失(光滑凸函数),
- \(g_i(w^{(i)}) = \lambda \|w^{(i)}\|_1\)(非光滑但可分)。
则每次迭代只需计算所选块对应的梯度分量(涉及部分特征),并应用软阈值算子。这特别适用于特征维度极高、但每次只处理部分特征的场景。
总结
随机化块坐标下降法将大规模凸优化问题分解为一系列小规模子问题,利用随机采样和近端算子,实现了高效、可扩展的求解。其核心步骤是:随机选块 → 计算该块梯度 → 执行近端更新。该算法是许多现代机器学习优化器(如随机坐标下降、随机方差缩减方法)的重要基础。