非线性规划中的自适应梯度下降法(AdaGrad)进阶题
题目描述
考虑一个带有非线性不等式约束的非光滑优化问题:
\[\begin{aligned} \min_{x \in \mathbb{R}^n} \quad & f(x) = \frac{1}{2} \|Ax - b\|^2 + \lambda \|x\|_1 \\ \text{s.t.} \quad & g_i(x) = \frac{1}{2} x^T Q_i x + q_i^T x + c_i \leq 0, \quad i = 1, \dots, m \\ & \|x\|_\infty \leq M \end{aligned} \]
其中 \(A \in \mathbb{R}^{p \times n}\), \(b \in \mathbb{R}^p\), \(Q_i \in \mathbb{R}^{n \times n}\) 对称半正定, \(q_i \in \mathbb{R}^n\), \(c_i \in \mathbb{R}\), 且 \(\lambda > 0\), \(M > 0\) 为常数。目标函数包含可微的二次项和不可微的 L1 正则项,约束包含二次不等式和界约束。要求设计一种基于自适应梯度下降法(AdaGrad)的求解算法,并详细说明如何处理非光滑项和约束,确保收敛到稳定点。
解题过程讲解
步骤 1: 问题分析与转化
-
目标函数 \(f(x)\) 可拆为两部分:
- 可微部分:\(f_{\text{smooth}}(x) = \frac{1}{2} \|Ax - b\|^2\),其梯度为 \(\nabla f_{\text{smooth}}(x) = A^T(Ax - b)\)。
- 非光滑部分:\(h(x) = \lambda \|x\|_1\),这是一个凸但不处处可导的项,在 \(x_j = 0\) 处不可导。
-
约束处理:
- 二次不等式约束 \(g_i(x) \leq 0\) 是非线性的,但 \(Q_i\) 半正定,所以每个 \(g_i\) 是凸函数。
- 界约束 \(\|x\|_\infty \leq M\) 等价于 \(-M \leq x_j \leq M, \ j=1,\dots,n\),是一个凸的盒子约束。
-
整体问题可视为一个复合优化问题,包含可微项、非光滑项和凸约束集。标准梯度法无法直接应用,需结合近似点算子(proximal operator)处理非光滑项,并用投影或罚函数处理约束。
步骤 2: 算法框架——投影近似梯度法结合 AdaGrad
- 将约束集合记为 \(\mathcal{C} = \{x \in \mathbb{R}^n: g_i(x) \leq 0, \|x\|_\infty \leq M\}\),这是一个闭凸集。
- 对可微部分 \(f_{\text{smooth}}(x)\) 使用梯度下降,对非光滑部分 \(h(x)\) 使用近似点算子,对约束集 \(\mathcal{C}\) 使用投影,形成投影近似梯度法迭代:
\[ x^{(k+1)} = \operatorname{Proj}_{\mathcal{C}}\left( \operatorname{prox}_{\alpha_k h} \big( x^{(k)} - \alpha_k \nabla f_{\text{smooth}}(x^{(k)}) \big) \right) \]
其中 \(\alpha_k > 0\) 是步长,\(\operatorname{prox}_{\alpha h}(y) = \arg\min_z \left\{ h(z) + \frac{1}{2\alpha} \|z - y\|^2 \right\}\) 是近似点算子。
- 对 L1 正则项,近似点算子有解析解(软阈值算子):
\[ [\operatorname{prox}_{\alpha h}(y)]_j = \operatorname{sign}(y_j) \max\{|y_j| - \alpha \lambda, 0\} \]
- 但标准投影近似梯度法使用固定或衰减步长,收敛速度可能较慢。AdaGrad 通过累积历史梯度信息自适应调整每个分量的步长,可加速稀疏或非平稳问题的收敛。
步骤 3: 自适应步长机制(AdaGrad 思想)
- AdaGrad 核心:对每个变量分量 \(x_j\) 使用不同的步长,步长反比于历史梯度平方和的平方根。
- 在本问题中,可微部分的梯度为 \(g^{(k)} = \nabla f_{\text{smooth}}(x^{(k)})\),定义对角矩阵 \(G^{(k)} \in \mathbb{R}^{n \times n}\),其对角线元素为:
\[ G^{(k)}_{jj} = \delta + \sqrt{\sum_{t=1}^k (g_j^{(t)})^2 } \]
其中 \(\delta > 0\) 是一个小常数(如 \(10^{-8}\)),防止除零。
- 则自适应步长矩阵为 \((G^{(k)})^{-1/2}\)(即每个分量 \(j\) 的步长为 \(1/\sqrt{G^{(k)}_{jj}}\))。迭代式变为:
\[ x^{(k+1)} = \operatorname{Proj}_{\mathcal{C}}\left( \operatorname{prox}_{(G^{(k)})^{-1/2} \, h} \big( x^{(k)} - (G^{(k)})^{-1/2} g^{(k)} \big) \right) \]
注意:这里近似点算子的步长参数也变为分量自适应的,即对分量 \(j\) 使用步长 \(1/\sqrt{G^{(k)}_{jj}}\)。
- 实际计算时,通常用向量形式表示:令 \(\eta^{(k)}_j = \frac{\alpha}{\sqrt{\delta + \sum_{t=1}^k (g_j^{(t)})^2}}\),其中 \(\alpha > 0\) 是全局步长缩放因子。迭代可写为:
\[ y^{(k)} = x^{(k)} - \eta^{(k)} \odot g^{(k)} \]
\[ z^{(k)} = \operatorname{prox}_{\eta^{(k)} h}(y^{(k)}) \]
\[ x^{(k+1)} = \operatorname{Proj}_{\mathcal{C}}(z^{(k)}) \]
其中 \(\odot\) 表示逐分量乘法,\(\eta^{(k)} = (\eta^{(k)}_1, \dots, \eta^{(k)}_n)^T\),且 \(\operatorname{prox}_{\eta h}(y)\) 对每个分量独立应用软阈值,阈值为 \(\eta_j \lambda\)。
步骤 4: 约束投影的计算
-
投影到 \(\mathcal{C}\) 是一个带二次不等式和盒子约束的凸集上的投影,通常无解析解,需迭代求解。
-
实用简化:将约束处理为罚函数加到目标中,或采用交替方向法:将问题拆为两部分——近似梯度更新(处理非光滑项)和约束投影。
-
一个常用技巧:用内点罚函数或增广拉格朗日处理二次不等式约束,而盒子约束可在近似点算子中直接施加(即先做软阈值,再截断到 \([-M, M]\))。
-
具体地,定义集合 \(\mathcal{B} = \{x: \|x\|_\infty \leq M\}\),其投影就是逐分量截断:\([\operatorname{Proj}_{\mathcal{B}}(x)]_j = \min(\max(x_j, -M), M)\)。
-
对二次不等式约束,引入对数壁垒函数 \(\phi_i(x) = -\log(-g_i(x))\)(当 \(g_i(x) < 0\)),将问题转化为无约束问题:
\[ \min_x \; f_{\text{smooth}}(x) + \lambda \|x\|_1 + \mu \sum_{i=1}^m \phi_i(x) \quad \text{s.t.} \; x \in \mathcal{B} \]
其中 \(\mu > 0\) 是壁垒参数。这样,约束只剩盒子约束,投影容易计算。
- 然后对新的可微部分 \(f_{\text{smooth}}(x) + \mu \sum_i \phi_i(x)\) 计算梯度,结合 AdaGrad 步长和软阈值算子迭代。
步骤 5: 完整算法步骤
- 初始化:\(x^{(0)} \in \mathcal{B}\)(如零向量),设定 \(\alpha > 0\), \(\delta > 0\), 壁垒参数 \(\mu > 0\), 累积梯度平方向量 \(s^{(0)} = 0 \in \mathbb{R}^n\)。
- 对 \(k = 0, 1, 2, \dots\) 执行:
a. 计算当前点的梯度:
\[ g^{(k)} = A^T(A x^{(k)} - b) + \mu \sum_{i=1}^m \frac{\nabla g_i(x^{(k)})}{-g_i(x^{(k)})} \]
其中 $\nabla g_i(x) = Q_i x + q_i$。
b. 更新累积平方梯度:\(s^{(k+1)}_j = s^{(k)}_j + (g^{(k)}_j)^2, \ j=1,\dots,n\)。
c. 计算自适应步长向量:\(\eta^{(k)}_j = \alpha / \sqrt{\delta + s^{(k+1)}_j}\)。
d. 梯度下降步骤:\(y^{(k)} = x^{(k)} - \eta^{(k)} \odot g^{(k)}\)。
e. 软阈值(处理 L1 正则):
\[ z^{(k)}_j = \operatorname{sign}(y^{(k)}_j) \max\{|y^{(k)}_j| - \eta^{(k)}_j \lambda, 0\} \]
f. 投影到盒子约束:\(x^{(k+1)}_j = \min(\max(z^{(k)}_j, -M), M)\)。
3. 逐渐减小 \(\mu \to 0\) 以逼近原约束(也可在每次迭代中适当减小 \(\mu\))。
4. 停止准则:当 \(\|x^{(k+1)} - x^{(k)}\| < \epsilon\) 且约束违反度 \(\max_i \max(g_i(x^{(k)}), 0) < \epsilon\) 时终止。
步骤 6: 收敛性说明
- 算法本质是 AdaGrad 在复合优化问题上的扩展。在凸问题中,AdaGrad 可保证次线性收敛速率 \(O(1/\sqrt{k})\)。
- 对于非光滑 L1 项,软阈值算子相当于在 AdaGrad 的梯度更新后施加了稀疏性,不影响收敛性,因为近似点算子是 nonexpansive 的。
- 壁垒函数将不等式约束转化为可微项,随着 \(\mu \to 0\) 可逼近原问题的解。需注意壁垒函数在边界附近梯度很大,AdaGrad 的自适应步长能自动调整,避免震荡。
- 对于非凸的 \(g_i\)(本题中 \(g_i\) 是凸的),算法可能收敛到稳定点(KKT 点)。
总结
本题将 AdaGrad 扩展至带非光滑项和非线性约束的优化问题,核心是结合近似点算子处理 L1 正则、用壁垒罚函数处理不等式约束、用投影处理简单约束,并在梯度更新中使用分量自适应的步长。算法可有效处理高维稀疏优化,且适应于不同分量变化程度差异较大的情况。