非线性规划中的自适应梯度下降法(AdaGrad)进阶题
问题描述
考虑如下无约束非线性规划问题:
\[\min_{x \in \mathbb{R}^n} f(x) = \sum_{i=1}^{m} f_i(x)^2 \]
其中,每个分量函数 \(f_i: \mathbb{R}^n \to \mathbb{R}\) 是非线性且光滑的。这是一个非线性最小二乘问题的标准形式,常见于数据拟合、参数优化等。假设目标函数 \(f(x)\) 非凸,具有复杂的曲率结构,且梯度分量 \(\nabla f_i(x)\) 在不同维度上的变化幅度(即尺度和稀疏性)差异显著。传统的梯度下降法由于使用固定的全局学习率,在求解此类问题时可能会因某些维度梯度较大而振荡,或因某些维度梯度较小而进展缓慢,导致收敛效率低下。
本题要求你应用自适应梯度下降法(AdaGrad) 及其进阶思想来高效求解此问题。你需要从AdaGrad的基本原理出发,解释其如何通过累积历史梯度信息为每个参数自适应调整学习率,并扩展到处理非线性最小二乘问题的具体形式,最终设计出完整的算法步骤和迭代更新规则。
解题过程
步骤1: 回顾问题形式与梯度计算
我们的目标是:
\[\min_{x} f(x) = \sum_{i=1}^{m} (f_i(x))^2 \]
这是一个平方和形式的函数。定义残差向量 \(R(x) = [f_1(x), f_2(x), \dots, f_m(x)]^T\),则 \(f(x) = R(x)^T R(x)\)。
其梯度为:
\[\nabla f(x) = 2 J(x)^T R(x) \]
其中,\(J(x)\) 是 \(m \times n\) 的雅可比矩阵,其第 \(i\) 行为 \(\nabla f_i(x)^T\)。即:
\[J(x) = \begin{bmatrix} \nabla f_1(x)^T \\ \nabla f_2(x)^T \\ \vdots \\ \nabla f_m(x)^T \end{bmatrix} \]
梯度 \(g_k = \nabla f(x_k)\) 是一个 \(n\) 维向量,其第 \(j\) 个分量记为 \(g_{k, j}\)。
步骤2: 理解标准梯度下降的局限性
标准梯度下降更新为:
\[x_{k+1} = x_k - \alpha g_k \]
其中 \(\alpha > 0\) 是固定的学习率。
- 问题1:如果某个参数 \(x^{(j)}\) 对应的梯度分量 \(g_{k, j}\) 通常很小(例如对应一个不活跃的特征),固定学习率会导致这个方向上的更新步长过小,收敛极慢。
- 问题2:如果某个参数 \(x^{(j)}\) 对应的梯度分量 \(g_{k, j}\) 有时很大、有时很小(稀疏但剧烈),固定学习率会导致在梯度大时步长过大,可能引起振荡或不稳定。
步骤3: 引入AdaGrad基本思想
AdaGrad(Adaptive Gradient)的核心思想是:为每个参数单独调整学习率。具体方法是,在迭代过程中累积每个参数维度上历史梯度的平方和,然后用一个全局基础学习率 \(\eta\) 除以这个累积量的平方根,作为该参数当前的学习率。
- 对频繁更新(梯度大)的参数:累积的梯度平方和较大,分母大,实际学习率变小,起到抑制作用,稳定优化路径。
- 对不频繁更新(梯度小)的参数:累积的梯度平方和较小,分母小,实际学习率相对较大,起到加速作用,使其能更快前进。
这特别适用于稀疏梯度或不同特征尺度差异大的问题,能自动地将学习率调整到合适的数量级。
步骤4: AdaGrad算法公式推导
-
初始化:
- 初始点 \(x_0 \in \mathbb{R}^n\)
- 全局基础学习率 \(\eta\)(例如0.1)
- 小常数 \(\epsilon > 0\)(例如 \(10^{-8}\)),防止除以零
- 累积梯度平方矩阵 \(G_0 = 0 \in \mathbb{R}^{n \times n}\),初始化为零矩阵(或视为对角矩阵,只记录每个维度的累积量,更常用的是对角版本)。
-
对角AdaGrad(常用简化版):
我们只维护一个向量 \(s_k \in \mathbb{R}^n\),其第 \(j\) 个分量 \(s_{k, j}\) 记录参数 \(x^{(j)}\) 历史梯度平方的累积和。- \(s_0 = 0\)。
- 在第 \(k\) 次迭代:
a. 计算当前梯度 \(g_k = \nabla f(x_k) = 2 J(x_k)^T R(x_k)\)。
b. 累积梯度平方:\(s_k = s_{k-1} + g_k \odot g_k\)(⊙表示逐元素乘法,即 \(s_{k, j} = s_{k-1, j} + g_{k, j}^2\))。
c. 计算自适应学习率向量:每个参数 \(j\) 的学习率为 \(\eta / \sqrt{s_{k, j} + \epsilon}\)。
d. 更新参数:\(x_{k+1} = x_k - \eta \, \text{diag}(s_k + \epsilon I)^{-\frac{1}{2}} g_k\)。
写成分量形式:\(x_{k+1}^{(j)} = x_k^{(j)} - \frac{\eta}{\sqrt{s_{k, j} + \epsilon}} g_{k, j}\)。
-
完整矩阵AdaGrad(理论上更精确但开销大):
维护外积矩阵 \(G_k = \sum_{t=1}^{k} g_t g_t^T \in \mathbb{R}^{n \times n}\)。
更新规则:\(x_{k+1} = x_k - \eta (G_k + \epsilon I)^{-1/2} g_k\)。
这相当于用历史梯度二阶矩的逆平方根对梯度进行预处理。由于存储和求逆开销大(\(O(n^2)\) 和 \(O(n^3)\)),实践中多用对角版本。
步骤5: 针对非线性最小二乘问题的具体实现
对于目标 \(f(x) = \sum_{i=1}^{m} f_i(x)^2\),在每次迭代中,我们需计算:
- 残差 \(R(x_k)\)。
- 雅可比矩阵 \(J(x_k)\)(或其与残差的乘积,避免显式存储大矩阵)。若能直接计算梯度 \(g_k = 2J(x_k)^T R(x_k)\),则可直接应用AdaGrad更新。
算法伪代码如下:
输入:初始点 x0,基础学习率 η,常数 ε,最大迭代次数 T
初始化:x = x0, s = 0 (n维向量)
for k = 0 to T-1:
1. 计算残差向量 R = [f1(x), f2(x), ..., fm(x)]^T
2. 计算梯度 g = 2 * J(x)^T * R (或通过自动微分/有限差分计算梯度)
3. 累积梯度平方:s = s + g ⊙ g
4. 计算自适应步长向量:α_adapt = η / (sqrt(s) + ε) (逐元素运算)
5. 更新参数:x = x - α_adapt ⊙ g
6. 如果满足收敛条件(如 ||g|| < 阈值 或 f(x)下降很小),则提前终止
输出:近似最优解 x
步骤6: 算法特性与进阶讨论
-
优势:
- 自适应学习率:无需手动为每个维度调整学习率,自动适应特征尺度。
- 适合稀疏问题:对不频繁出现的特征给予更大的更新步长。
- 理论保证:在凸优化设定下,AdaGrad可以实现最优的次线性收敛率,特别适用于稀疏梯度场景。
-
局限性(进阶分析):
- 学习率单调递减:由于 \(s_{k, j}\) 只增不减,学习率 \(\eta / \sqrt{s_{k, j} + \epsilon}\) 会随时间单调下降,最终可能变得极小,导致在非凸问题中过早停止,无法收敛到更深的极小点。
- 内存开销:对角版本需存储一个与参数同维的向量 \(s\),可接受。完整矩阵版本开销大。
- 对非平稳目标:如果问题的曲率(梯度分布)随时间变化,早期累积的大梯度可能会过度压制后续更新。
-
改进方向(扩展):
- RMSProp 和 Adam:引入指数移动平均(EMA)来累积梯度平方,即 \(s_k = \rho s_{k-1} + (1-\rho) g_k \odot g_k\),从而“忘记”久远的历史,适应非平稳目标,是AdaGrad的重要发展。
- AdaDelta:进一步消除了全局学习率 \(\eta\) 的需要,完全自适应。
- 与二阶方法结合:AdaGrad可视为对梯度进行对角缩放,是一种近似的二阶预处理。对于非线性最小二乘,可结合高斯-牛顿法或Levenberg-Marquardt法的思想,用 \(J^T J\) 的信息来改进预处理矩阵。
总结
通过应用自适应梯度下降法(AdaGrad)求解非线性最小二乘问题,我们利用了其为每个参数维度独立自适应调整学习率的能力。算法通过累积历史梯度平方和,自动为梯度较大的维度减小步长(抑制振荡),为梯度较小的维度增大步长(加速收敛),特别适合具有不同特征尺度或稀疏梯度的问题。从基本公式推导到针对目标函数的具体实现,我们完成了一个完整的算法设计。同时,我们也指出了其学习率单调递减的潜在缺陷,并指明了向RMSProp、Adam等更先进的自适应方法扩展的方向。