自适应随机梯度下降(Adaptive Stochastic Gradient Descent, AdaSGD)在非光滑随机优化中的应用基础题
题目描述
考虑如下形式的非光滑随机优化问题:
\[\min_{x \in \mathbb{R}^n} F(x) := \mathbb{E}_{\xi}[f(x; \xi)] + g(x) \]
其中:
- \(f(x; \xi)\) 关于 \(x\) 是可微但不一定光滑的(即其梯度可能不满足Lipschitz连续),并且我们只能通过随机抽样得到它的随机梯度 \(\nabla f(x; \xi)\)。
- \(g(x)\) 是一个非光滑凸函数(例如 \(\ell_1\) 范数 \(g(x) = \lambda \|x\|_1\) 或示性函数),但它是简单函数,其邻近算子有解析解。
- 我们假设只能通过随机样本 \(\xi\) 来获取关于 \(F(x)\) 的信息,无法直接计算其精确梯度或函数值。
本题的目标是:设计一种自适应随机梯度下降(AdaSGD)算法,通过自适应调整步长,高效地求解这个非光滑随机优化问题,并解释其核心思想和迭代步骤。
解题过程循序渐进讲解
第一步:问题分析——非光滑随机优化的难点
传统的梯度下降法需要目标函数光滑(梯度连续)且能精确计算梯度。但这里有两个主要挑战:
- 随机性:我们只能得到梯度的无偏估计 \(\nabla f(x; \xi)\),而非真实梯度 \(\nabla F(x)\),这导致直接使用梯度下降会产生高方差,收敛缓慢或不稳定。
- 非光滑性:\(g(x)\) 不可导,使得标准的梯度下降更新无法直接应用。
思路:
- 针对随机性,我们使用随机梯度,并引入自适应步长调整(类似AdaGrad、RMSProp的思想),根据历史梯度信息调整步长,以应对不同维度上梯度的变化幅度,加快收敛。
- 针对非光滑项 \(g(x)\),我们采用邻近算子(proximal operator) 处理,将迭代步骤分为梯度下降步和邻近映射步,这就是近端随机梯度下降的框架。
第二步:算法框架——近端随机梯度下降
对于一个可微函数 \(h(x)\) 和一个非光滑函数 \(g(x)\),近端梯度下降的迭代公式为:
\[x_{k+1} = \text{prox}_{\eta_k g}(x_k - \eta_k \nabla h(x_k)) \]
其中,\(\eta_k\) 是步长,\(\text{prox}\) 是邻近算子,定义为:
\[\text{prox}_{\eta g}(v) = \arg\min_x \left\{ g(x) + \frac{1}{2\eta} \|x - v\|^2 \right\} \]
在我们的问题中,\(h(x) = \mathbb{E}[f(x; \xi)]\),但我们只能得到随机梯度。因此,基本近端随机梯度下降的迭代为:
\[x_{k+1} = \text{prox}_{\eta_k g}(x_k - \eta_k \nabla f(x_k; \xi_k)) \]
其中 \(\xi_k\) 是第 \(k\) 步抽样的随机样本。
但这里 \(\eta_k\) 如何选择?固定步长通常需要谨慎调节,而自适应步长可以根据历史梯度信息自动调整。
第三步:自适应步长设计
自适应步长(如AdaGrad、RMSProp)的基本思想是:对每个变量 \(x^{(i)}\)(\(i=1,\dots,n\))维护一个累积梯度平方和,步长与该累积量的平方根成反比。这样,在历史梯度较大的方向上,步长会减小,从而更稳定。
定义 \(g_k = \nabla f(x_k; \xi_k)\) 为第 \(k\) 步的随机梯度。
定义向量 \(s_k \in \mathbb{R}^n\),其中每个分量 \(s_k^{(i)}\) 累积到第 \(k\) 步为止,第 \(i\) 个维度上梯度平方的指数加权移动平均(或简单累加):
\[s_k^{(i)} = \beta s_{k-1}^{(i)} + (1-\beta) (g_k^{(i)})^2 \quad \text{或} \quad s_k^{(i)} = s_{k-1}^{(i)} + (g_k^{(i)})^2 \]
其中 \(\beta \in (0,1)\) 是衰减因子。
自适应步长为:
\[\eta_{k}^{(i)} = \frac{\eta_0}{\sqrt{s_k^{(i)} + \epsilon}} \]
其中 \(\eta_0\) 是初始步长(全局学习率),\(\epsilon\) 是一个很小的常数(如 \(10^{-8}\))防止除以零。
这样,第 \(i\) 个变量的步长 \(\eta_k^{(i)}\) 是自适应的:如果历史上这个方向上的梯度很大,\(s_k^{(i)}\) 就大,步长就小,从而在陡峭方向更新更谨慎;反之,在平缓方向步长相对较大,加快更新。
第四步:自适应近端随机梯度下降(AdaSGD)算法步骤
给定:初始点 \(x_0\),初始步长 \(\eta_0\),小常数 \(\epsilon > 0\),衰减因子 \(\beta\)(可选),总迭代次数 \(T\)。
- 初始化:\(s_0 = 0\)(或一个很小的向量,如 \(\epsilon\))。
- For \(k = 0, 1, 2, \dots, T-1\):
a. 随机采样 \(\xi_k\),计算当前点的随机梯度 \(g_k = \nabla f(x_k; \xi_k)\)。
b. 更新累积梯度平方 \(s_k\)(两种常用方式,这里以指数加权平均为例):
对于每个维度 \(i=1,\dots,n\):
\[ s_{k+1}^{(i)} = \beta s_k^{(i)} + (1-\beta) (g_k^{(i)})^2 \]
c. 计算自适应步长向量 $\eta_k$,其中每个分量 $\eta_k^{(i)} = \frac{\eta_0}{\sqrt{s_{k+1}^{(i)} + \epsilon}}$。
d. 构造自适应步长**对角矩阵** $D_k = \text{diag}(\eta_k^{(1)}, \dots, \eta_k^{(n)})$,则自适应更新方向为 $D_k g_k$。
e. 计算**梯度下降中间点**:$y_k = x_k - D_k g_k$。
f. 计算**近端映射**:$x_{k+1} = \text{prox}_{g, D_k^{-1}}(y_k)$。注意,这里由于 $D_k$ 是对角矩阵且正定,邻近算子定义为:
\[ \text{prox}_{g, D_k^{-1}}(y) = \arg\min_x \left\{ g(x) + \frac{1}{2} (x-y)^T D_k^{-1} (x-y) \right\} \]
通常,如果 $g(x)$ 是**可分离**的(如 $\ell_1$ 范数),这个邻近算子可以按分量独立求解,且形式与标准邻近算子相同,只是步长参数变为 $\eta_k^{(i)}$ 的缩放。
- 输出:最终迭代点 \(x_T\) 或历次迭代的平均。
第五步:邻近算子的计算示例(以 \(\ell_1\) 范数为例)
如果 \(g(x) = \lambda \|x\|_1\),则标准邻近算子(步长为 \(\eta\))是软阈值函数:
\[[\text{prox}_{\eta g}(v)]^{(i)} = \text{sign}(v^{(i)}) \cdot \max\{ |v^{(i)}| - \lambda \eta, 0 \} \]
在自适应步长下,每个维度有自己的步长 \(\eta_k^{(i)}\),则更新公式变为:
\[x_{k+1}^{(i)} = \text{sign}(y_k^{(i)}) \cdot \max\{ |y_k^{(i)}| - \lambda \eta_k^{(i)}, 0 \} \]
其中 \(y_k^{(i)} = x_k^{(i)} - \eta_k^{(i)} g_k^{(i)}\)。
直观理解:在梯度变化剧烈的维度,步长自动变小,使得软阈值的“收缩”幅度也变小,更新更稳定。
第六步:算法特性与总结
- 自适应优势:AdaSGD 能够自动调整每个维度上的步长,特别适用于稀疏数据或非平稳目标,其中不同方向的梯度量级差异很大。
- 处理非光滑:通过邻近算子处理 \(g(x)\),使得算法适用于带 \(\ell_1\) 正则、约束等非光滑问题。
- 随机性:通过随机抽样,适用于大规模问题,每次迭代只用一个或一小批样本,计算高效。
- 收敛性:在一定的假设下(如 \(f\) 的梯度有界,\(g\) 凸,步长满足一定衰减条件),AdaSGD 可以收敛到稳定点(对于非凸 \(f\))或最优解(对于凸 \(F\))。
核心思想总结:
将自适应步长(根据历史梯度平方自适应调整)与近端随机梯度下降结合,形成 AdaSGD 算法。它既能处理随机优化中的噪声,又能应对非光滑项,且通过自适应机制提升了收敛速度和稳定性,特别适合于高维、稀疏、非光滑的随机优化问题。