分块矩阵的块随机梯度下降法在最小二乘问题中的在线优化应用
题目描述
考虑大型超定线性最小二乘问题
\[\min_{x \in \mathbb{R}^n} f(x) = \frac{1}{2} \|Ax - b\|_2^2 \]
其中矩阵 \(A \in \mathbb{R}^{m \times n}\) 规模极大(例如 \(m\) 为数百万,\(n\) 为数千),\(b \in \mathbb{R}^m\) 为观测向量。直接使用传统算法如正规方程法或QR分解计算量过大,且当新数据流式到达时,需要在线更新解。分块矩阵的块随机梯度下降法(Block Stochastic Gradient Descent, Block SGD)将数据集分成若干块,每次迭代随机选取一块数据计算梯度,对解进行更新,从而实现对大规模、流式数据的高效在线优化求解。
解题过程
1. 问题形式化与经典解法回顾
最小二乘问题的最优解 \(x^*\) 满足正规方程
\[A^T A x = A^T b \]
当 \(A\) 列满秩时,有唯一解 \(x^* = (A^T A)^{-1} A^T b\)。
但直接计算 \(A^T A\) 的复杂度为 \(O(mn^2)\),求逆为 \(O(n^3)\),不适用于大规模或在线场景。
梯度下降法(GD)迭代公式为
\[x_{k+1} = x_k - \eta_k \nabla f(x_k) \]
其中梯度 \(\nabla f(x) = A^T (A x - b)\)。
每轮迭代需计算整个梯度,复杂度 \(O(mn)\),当 \(m\) 极大时仍昂贵。
2. 随机梯度下降法(SGD)引入
SGD每次随机选取一个样本(即 \(A\) 的一行)计算梯度估计。
设 \(a_i^T\) 为 \(A\) 的第 \(i\) 行,则单个样本的损失为 \(f_i(x) = \frac{1}{2} (a_i^T x - b_i)^2\),其梯度为
\[\nabla f_i(x) = a_i (a_i^T x - b_i) \]
迭代更新:
\[x_{k+1} = x_k - \eta_k a_{i_k} (a_{i_k}^T x_k - b_{i_k}) \]
复杂度降为 \(O(n)\) 每轮,但梯度估计噪声大,收敛慢,且无法利用矩阵的块结构特性。
3. 分块随机梯度下降法(Block SGD)
分块:将矩阵 \(A\) 按行分成 \(B\) 个块,每块包含若干行。记第 \(j\) 块的行索引集为 \(\mathcal{I}_j\),对应子矩阵 \(A_{[j]} \in \mathbb{R}^{|\mathcal{I}_j| \times n}\) 和子向量 \(b_{[j]} \in \mathbb{R}^{|\mathcal{I}_j|}\)。
块损失函数为
\[f_{[j]}(x) = \frac{1}{2} \|A_{[j]} x - b_{[j]}\|_2^2 \]
其梯度为
\[\nabla f_{[j]}(x) = A_{[j]}^T (A_{[j]} x - b_{[j]}) \]
算法步骤:
- 初始化:选取初始点 \(x_0\)(可设为零向量),设定步长(学习率)序列 \(\{\eta_k\}\),分块数 \(B\),总迭代次数 \(K\)。
- 迭代:对 \(k = 0, 1, \dots, K-1\) 执行:
a. 均匀随机选取一个块索引 \(j_k \in \{1, 2, \dots, B\}\)。
b. 计算块梯度:
\[ g_k = A_{[j_k]}^T (A_{[j_k]} x_k - b_{[j_k]}) \]
c. 更新解:
\[ x_{k+1} = x_k - \eta_k g_k \]
- 输出:最终迭代点 \(x_K\) 作为近似解。
关键点:
- 块大小可调。若块大小为1,则退化为经典SGD;若块大小为 \(m\)(即 \(B=1\)),则退化为全梯度下降。
- 复杂度:每轮为 \(O(|\mathcal{I}_j| n)\),通常 \(|\mathcal{I}_j| \ll m\),比全梯度下降快,但比SGD更稳定。
- 适合并行:块内行向量的矩阵-向量乘可并行计算。
4. 步长选择与收敛性
为保证收敛,步长需满足Robbins-Monro条件:
\[\sum_{k=0}^\infty \eta_k = \infty, \quad \sum_{k=0}^\infty \eta_k^2 < \infty \]
常见选择:\(\eta_k = \frac{c}{k+1}\) 或 \(\eta_k = \frac{c}{\sqrt{k+1}}\),其中 \(c>0\) 为常数。
在强凸目标函数(即 \(A^T A\) 的最小特征值 \(\lambda_{\min} > 0\))下,Block SGD具有次线性收敛速率:
\[\mathbb{E}[f(x_k) - f(x^*)] = O\left(\frac{1}{k}\right) \]
其中期望对随机块选取取平均。
若使用递减步长,可收敛到精确解附近。
5. 在线优化场景的扩展
当数据流式到达时,新数据块不断产生。算法可调整为:
- 初始化 \(x_0\)。
- 对新到达的块 \(A_{[t]}, b_{[t]}\)(\(t\) 为时间索引):
a. 计算块梯度:\(g_t = A_{[t]}^T (A_{[t]} x_t - b_{[t]})\)。
b. 更新:\(x_{t+1} = x_t - \eta_t g_t\)。 - 输出当前解 \(x_t\) 作为实时估计。
此即在线SGD,适用于数据不能全存于内存的场景。
6. 加速与改进策略
- 动量法:引入动量项加速收敛:
\[ v_{k+1} = \beta v_k + g_k, \quad x_{k+1} = x_k - \eta_k v_{k+1} \]
其中 \(\beta \in [0,1)\) 为动量系数。
- 自适应步长:如AdaGrad、RMSProp、Adam等,为每个参数调整步长,适应数据稀疏性。
- 方差缩减:如SVRG、SAGA,在块梯度中引入控制变量,减少方差,加速收敛。
- 预处理:用 \(A^T A\) 的近似逆作为预处理矩阵,将条件数变小,例如用分块对角矩阵近似。
7. 算法复杂度与适用场景
- 每轮复杂度:\(O(\text{块大小} \times n)\),内存只需存储当前块。
- 适合场景:大规模/分布式数据集、流式数据、需要快速在线更新的应用(如推荐系统、深度学习训练)。
- 缺点:收敛速度慢于二阶方法,需精心调参(步长、分块大小)。
总结
分块矩阵的块随机梯度下降法通过每次随机选取一个数据块计算梯度,有效平衡了计算效率与收敛稳定性,是大规模最小二乘问题在线优化的实用算法。核心在于分块降低单轮计算量,随机性保证全局探索,适当步长策略保证收敛。通过动量、自适应步长等技术可进一步加速,适用于数据不断到达的流式学习场景。