非线性规划中的序列随机坐标下降法(Sequential Randomized Coordinate Descent, SRCD)基础题
题目描述:
考虑以下带边界约束的非线性规划问题:
\[\min_{x \in \mathbb{R}^n} f(x) \]
\[ \text{s.t.} \quad l_i \leq x_i \leq u_i, \quad i = 1, 2, \dots, n \]
其中 \(f: \mathbb{R}^n \to \mathbb{R}\) 是一个连续可微但可能是非凸的函数,且梯度 \(\nabla f(x)\) 是 Lipschitz 连续的(即存在常数 \(L > 0\) 使得 \(\| \nabla f(x) - \nabla f(y) \| \leq L \|x - y\|\))。约束为简单的变量边界(也称为“箱型约束”或“区间约束”),\(l_i\) 和 \(u_i\) 是给定的常数(可能为 \(-\infty\) 或 \(+\infty\))。要求使用序列随机坐标下降法(Sequential Randomized Coordinate Descent, SRCD)来求解此问题,并理解其迭代格式、收敛条件以及在处理大规模问题时的优势。
解题过程循序渐进讲解:
1. 问题理解与算法动机
- 问题特点:目标函数 \(f(x)\) 光滑但可能非凸,约束是简单的、可分离的边界约束(每个变量独立受限于一个区间)。这种约束结构使得我们可以高效地处理每个变量的投影。
- 大规模问题挑战:当变量维度 \(n\) 非常大时,计算完整的梯度 \(\nabla f(x)\) 成本很高。每次迭代更新所有变量也可能不必要,尤其是当某些变量的梯度分量很小时。
- 坐标下降思想:坐标下降法每次迭代只更新一个(或一小部分)变量,保持其他变量固定。这大大减少了每次迭代的计算量。
- 随机化引入:传统的循环坐标下降(按固定顺序更新变量)可能因问题结构而产生较慢的收敛。随机坐标下降(RCD)在每次迭代中随机均匀地选择一个坐标(变量)进行更新,这通常能带来更好的理论收敛速率,尤其对于大规模问题。
- 序列化(Sequential):这里指迭代过程是顺序进行的,每次迭代只处理一个随机选中的坐标,更新后进入下一次迭代。这与“并行”或“块”坐标下降不同。
2. 算法核心步骤
SRCD 算法的每次迭代 \(k\)(\(k = 0, 1, 2, \dots\) )包含以下步骤:
步骤 1:随机坐标选择
从集合 \(\{1, 2, \dots, n\}\) 中以均匀概率随机选择一个索引 \(i_k\)。每个坐标被选中的概率都是 \(1/n\)。
步骤 2:计算偏导数(部分梯度)
计算目标函数在当前点 \(x^{(k)}\) 处关于被选坐标 \(i_k\) 的偏导数:
\[g_{i_k}^{(k)} = \frac{\partial f}{\partial x_{i_k}}(x^{(k)}) \]
注意,这里不需要计算完整的梯度向量 \(\nabla f(x^{(k)})\),只需计算一个标量偏导数,计算成本远低于全梯度。
步骤 3:确定坐标方向的步长
为了确保收敛,需要选择合适的步长 \(\alpha^{(k)} > 0\)。一种常用且简单的方法是使用坐标 Lipschitz 常数。假设函数 \(f\) 关于每个坐标 \(i\) 的梯度分量 \(\frac{\partial f}{\partial x_i}\) 是 Lipschitz 连续的,对应常数 \(L_i > 0\)。可以取固定步长 \(\alpha = 1 / L_i\),或者采用自适应线搜索(如回溯线搜索)来为当前坐标 \(i_k\) 确定一个合适的步长 \(\alpha^{(k)}\)。为了简化基础题,我们通常假设已知或能估计出 \(L_{i_k}\),并取固定步长 \(\alpha^{(k)} = 1 / L_{i_k}\)。
步骤 4:执行坐标更新(带投影)
沿着负梯度方向更新被选坐标:
\[x_{i_k}^{(k+1)} = x_{i_k}^{(k)} - \alpha^{(k)} g_{i_k}^{(k)} \]
然后,将这个更新值投影到该坐标的可行区间 \([l_{i_k}, u_{i_k}]\) 上:
\[x_{i_k}^{(k+1)} \leftarrow \text{Proj}_{[l_{i_k}, u_{i_k}]}(x_{i_k}^{(k+1)}) = \min(u_{i_k}, \max(l_{i_k}, x_{i_k}^{(k+1)})) \]
对于未被选中的坐标 \(j \neq i_k\),保持不变:
\[x_j^{(k+1)} = x_j^{(k)} \]
步骤 5:检查终止条件
常见的终止条件包括:
- 达到最大迭代次数 \(K_{\max}\)。
- 函数值下降量或坐标更新量小于预设容差 \(\epsilon\):例如,如果连续多次迭代的目标函数值变化很小,或期望的坐标更新范数很小,则停止。
- 在实践中,由于只计算单个坐标的偏导数,很难直接计算完整的梯度范数作为停止准则。
3. 算法伪代码
输入:初始点 x⁰ ∈ [l, u],最大迭代次数 K_max,容差 ε > 0,坐标Lipschitz常数 L_i (i=1..n) 或线搜索参数。
输出:近似最优解 x^K。
初始化 k = 0。
while k < K_max 且 (未满足其他停止条件) do:
1. 从 {1, 2, ..., n} 中均匀随机选择索引 i_k。
2. 计算偏导数 g = ∂f/∂x_{i_k} (x⁽ᵏ⁾)。
3. 确定步长 α:例如,α = 1 / L_{i_k}。
4. 计算临时更新:t = x_{i_k}^{(k)} - α * g。
5. 投影:x_{i_k}^{(k+1)} = max(l_{i_k}, min(u_{i_k}, t))。
6. 对其他 j ≠ i_k:x_j^{(k+1)} = x_j^{(k)}。
7. k = k + 1。
end while
返回 x⁽ᵏ⁾。
4. 收敛性简要分析(直观理解)
- 期望意义下的下降:虽然每次迭代只更新一个坐标,但由于选择是随机的,在期望意义下,每一步都沿着整个梯度向量的一个无偏估计方向(即 \(\mathbb{E}[e_{i_k} g_{i_k}^{(k)}] = \frac{1}{n} \nabla f(x^{(k)})\),其中 \(e_i\) 是第 \(i\) 个标准基向量)前进。这保证了算法在期望上具有下降性质。
- 收敛条件:对于凸函数 \(f\),SRCD 可以证明能收敛到全局最优解(在期望或高概率意义下)。对于非凸但光滑的函数,算法通常能收敛到一个驻点(stationary point)(即梯度投影为0的点)。收敛速率对于凸函数通常是亚线性的(如 \(O(1/k)\)),对于强凸函数可以达到线性收敛。
- 边界约束处理:投影操作是高效的(仅仅是钳位操作),确保了迭代点始终可行。
5. 算法优势与适用场景
- 计算效率:每次迭代仅需计算一个偏导数,避免了昂贵的大规模全梯度计算。对于某些问题结构,计算单个偏导数的代价可能远低于计算全梯度(例如,当 \(f(x)\) 是许多项的和,且每项只依赖于少数变量时)。
- 内存友好:不需要存储完整的梯度向量或大型矩阵(如Hessian),内存开销小。
- 易于并行化/分布式扩展:可以扩展为随机块坐标下降,同时更新一组不相交的坐标。
- 非常适合大规模、稀疏问题:当变量维度 \(n\) 极大,且目标函数具有某种可分离或部分可分离的结构时,SRCD 尤其高效。
总结:
序列随机坐标下降法(SRCD)通过每次迭代随机选择一个变量,计算其偏导数并进行梯度下降与投影,来求解带简单边界约束的大规模光滑优化问题。其核心优势在于极低的单次迭代成本和对高维问题的良好可扩展性。理解其关键在于掌握随机坐标选择、偏导数计算、步长选择(基于坐标Lipschitz常数)以及高效的投影操作。对于非凸问题,它能找到驻点;对于凸问题,它能收敛到全局最优。