随机梯度下降(SGD)是训练大型数据集模型的主力方法。它的优点在于使用小数据子集(小批量)来估计梯度,与在整个数据集上计算梯度(批量梯度下降)相比,大幅降低了每次迭代的计算成本。然而,这种效率并非没有代价:方差。每个随机梯度估计, $ g_{i_t}(\theta_t) = \nabla f_{i_t}(\theta_t) $ ($ f_{i_t} $ 是在迭代 $ t $ 时小批量 $ i_t $ 上的损失函数),是真实梯度 $ \nabla f(\theta_t) = \frac{1}{N} \sum_{i=1}^N \nabla f_i(\theta_t) $ 的无偏估计。这表示,从期望上看,随机梯度指向正确的方向:$ \mathbb{E}[g_{i_t}(\theta_t)] = \nabla f(\theta_t) $。但对于任何单次迭代, $ g_{i_t}(\theta_t) $ 可能与 $ \nabla f(\theta_t) $ 有显著偏离。这种偏离将噪声或方差引入到参数更新中。为什么梯度方差是个问题?SGD固有的方差带来了几个实际影响:路径噪声: 优化路径不像批量梯度下降那样平滑地趋向最小值。相反,它倾向于之字形移动,使得优化进展不那么直接。收敛速度较慢: 尽管每一步的计算成本低,但噪声更新通常意味着需要更多步才能达到一个好的解,相比于使用完整梯度的方法。即使对于强凸问题,批量梯度下降能达到线性收敛,SGD的收敛速度通常也是次线性的。精细调整的困难: 随着参数接近最小值,真实梯度的幅度变得很小。然而,随机梯度的方差不一定以相同的速率减小。这意味着噪声可能压倒信号,导致参数在最小值附近震荡而不是精确收敛到它。这需要仔细调整学习率计划,通常要求学习率随时间衰减以抑制震荡。{ "layout": { "xaxis": { "title": "参数 1", "range": [-0.5, 4.5], "showgrid": false, "zeroline": false }, "yaxis": { "title": "参数 2", "range": [-0.5, 4.5], "showgrid": false, "zeroline": false }, "title": "优化路径", "showlegend": true, "legend": { "x": 0.05, "y": 0.95 } }, "data": [ { "x": [4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5], "y": [4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5], "mode": "lines+markers", "name": "批量梯度下降", "line": { "color": "#1c7ed6" }, "marker": { "size": 4 } }, { "x": [4, 3.8, 3.9, 3.5, 3.6, 2.9, 3.1, 2.5, 2.7, 2.0, 2.2, 1.5, 1.7, 1.0, 1.2, 0.8], "y": [4, 4.2, 3.7, 3.8, 3.3, 3.5, 2.8, 3.0, 2.4, 2.6, 1.9, 2.1, 1.4, 1.6, 0.9, 1.1], "mode": "lines+markers", "name": "SGD (高方差)", "line": { "color": "#f03e3e" }, "marker": { "size": 4 } }, { "x": [4, 3.6, 3.2, 2.8, 2.4, 2.0, 1.6, 1.2, 0.8, 0.6], "y": [4, 3.7, 3.3, 2.9, 2.5, 2.1, 1.7, 1.3, 0.9, 0.7], "mode": "lines+markers", "name": "方差减小的SGD", "line": { "color": "#37b24d" }, "marker": { "size": 4 } }, { "type": "contour", "z": [[25, 20.5, 17, 14.5, 13, 12.5], [20.5, 16, 12.5, 10, 8.5, 8], [17, 12.5, 9, 6.5, 5, 4.5], [14.5, 10, 6.5, 4, 2.5, 2], [13, 8.5, 5, 2.5, 1, 0.5], [12.5, 8, 4.5, 2, 0.5, 0]], "x": [0, 1, 2, 3, 4, 5], "y": [0, 1, 2, 3, 4, 5], "showscale": false, "colorscale": [[0, "#e9ecef"], [1, "#adb5bd"]], "contours": { "coloring": "lines" } } ] }简单二次损失曲面上的优化路径比较。批量梯度下降采取平滑的步长。SGD由于梯度方差而表现出噪声步长。方差减小方法的目标是比SGD实现更快、噪声更小的收敛。方差减小方法的基本思路方差减小方法的基本思路是修改随机梯度估计使其具有较低方差,同时保持计算效率。我们希望得到一个估计 $ \tilde{g}_t(\theta_t) $,它能满足:它在计算上保持低成本,理想情况下,每次迭代只需求解小批量梯度,类似于SGD。它具有显著低于标准SGD梯度 $ g_{i_t}(\theta_t) $ 的方差。它仍然是真实梯度 $ \nabla f(\theta_t) $ 的无偏(或在某些变体中接近无偏)估计。实现这一点通常需要将额外信息整合到梯度估计中。例如,方法可以周期性地计算完整梯度,或者维护在不同点评估的过去梯度的移动平均。目标是构建一个梯度估计,它能够将噪声单批量梯度修正到真实的梯度方向。通过减小方差,这些方法通常能够达到更快的理论收敛速度(对于某些问题类型,可以接近批量梯度下降的线性收敛速度),并且与标准SGD相比,表现出更好的实际性能,尤其是在优化后期。后续章节将介绍具体的算法,例如随机平均梯度(SAG)和随机方差减小梯度(SVRG),它们采用不同的策略来实现这种方差减小,使大规模优化更加高效和有成效。