机器学习模型在处理非常大的数据集时,参数更新会产生高昂的计算成本。例如,通过对整个数据集的梯度取平均的方法(如批量梯度下降),可能因为每次更新都需要计算数百万甚至数十亿数据点的贡献而变得成本过高,甚至无法承受。随机梯度下降 (SGD) 旨在解决这一挑战,提供了一种实用且高效的替代方法,能够大幅减少每次参数更新所需的计算量。SGD方法:每次一个样本SGD不使用整个数据集,而是在每次迭代中,利用从仅一个随机选择的训练样本 $(x^{(i)}, y^{(i)})$ 计算出的梯度来更新参数。核心思想很简单:取一个样本,只为该样本计算成本和梯度,然后立即更新参数。接着,选择另一个随机样本并重复此过程。从数学上看,单个参数 $\theta_j$ 的更新规则如下:$$ \theta_j := \theta_j - \alpha \nabla_{\theta_j} J( \theta; x^{(i)}, y^{(i)} ) $$此处,$J(\theta; x^{(i)}, y^{(i)})$ 表示为单个训练样本 $(x^{(i)}, y^{(i)})$ 计算的成本函数,而 $\nabla_{\theta_j} J(\theta; x^{(i)}, y^{(i)})$ 是该成本相对于参数 $\theta_j$ 的梯度,仅使用该单个样本进行评估。注意,这里没有批量梯度下降中出现的求和项和 $\frac{1}{m}$ 项。为何称作“随机”?“随机”一词指的是每次更新选择单个数据点所涉及的随机性。由于每次更新仅基于一个样本,因此梯度计算 $\nabla_{\theta_j} J( \theta; x^{(i)}, y^{(i)} )$ 是真实梯度 $\nabla_{\theta_j} J(\theta)$ (后者将对所有样本取平均值)的一个“有噪声”的估计。这意味着SGD趋向最小值的路径不如批量梯度下降平滑。SGD不会直接下坡,而是呈锯齿状并波动。虽然这可能看起来效率不高,但恰恰是这种有噪声的行为提供了一些优点。{"layout": {"xaxis": {"title": "参数 1 (\u03b8\u2081)", "range": [-1, 5]}, "yaxis": {"title": "参数 2 (\u03b8\u2082)", "range": [-1, 5]}, "title": {"text": "梯度下降路径(批量与随机)"}, "legend": {"traceorder": "normal"}, "autosize": true, "height": 450}, "data": [{"type": "contour", "x": [0, 1, 2, 3, 4], "y": [0, 1, 2, 3, 4], "z": [[0, 1, 4, 9, 16], [1, 2, 5, 10, 17], [4, 5, 8, 13, 20], [9, 10, 13, 18, 25], [16, 17, 20, 25, 32]], "colorscale": [[0, "#e9ecef"], [1, "#adb5bd"]], "showscale": false, "name": "成本函数 J(\u03b8)", "hoverinfo": "skip", "contours": {"coloring": "lines"}}, {"type": "scatter", "x": [4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5, 0.1], "y": [4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5, 0.1], "mode": "lines+markers", "name": "批量梯度下降路径", "line": {"color": "#1c7ed6", "width": 2}, "marker": {"size": 5, "color": "#1c7ed6"}}, {"type": "scatter", "x": [4, 3.8, 3.9, 3.5, 3.6, 2.9, 3.1, 2.5, 2.6, 1.8, 2.0, 1.5, 1.3, 0.8, 0.9, 0.4, 0.6, 0.3, 0.2, 0.1], "y": [4, 4.2, 3.7, 3.8, 3.2, 3.3, 2.8, 2.9, 2.4, 2.5, 1.9, 1.7, 1.9, 1.2, 1.0, 0.9, 0.5, 0.7, 0.3, 0.2], "mode": "lines+markers", "name": "SGD路径", "line": {"color": "#fd7e14", "width": 2}, "marker": {"size": 5, "color": "#fd7e14"}}]}简单的二次成本函数上的优化路径比较。批量梯度下降采用更平滑、更直接的路线,而随机梯度下降则呈现出一种有噪声、波动的趋向最小值的路径。SGD的优点计算效率: 最显著的优点。每次参数更新都非常快,因为它只处理一个样本。这使得SGD适用于批量梯度下降不可行的大型数据集。摆脱局部最小值的能力: 有噪声的更新有时可以帮助算法“跳出”浅层局部最小值,或比批量梯度下降更有效地通过鞍点(后者可能会陷入停滞)。在线学习: SGD天然适合数据按顺序到达的场景(在线学习),因为模型可以随着每个新样本进行更新。缺点与注意事项高方差更新: 有噪声的梯度导致成本函数在迭代之间显著波动,而不是平稳下降。趋向最小值的路径远没有那么直接。收敛速度较慢(按轮数计): 尽管每次更新速度快,但由于其不规则的路径,SGD通常需要更多迭代(数据遍历,即“轮数”)才能比批量梯度下降更接近最小值。无法保证达到精确最小值: 由于噪声的存在,SGD通常不会收敛到精确最小值,而是在其附近波动。学习率调整: 选择合适的学习率 $\alpha$ 非常重要。通常,会使用衰减学习率(开始时较大,并随时间减小),以帮助SGD更接近最小值。数据打乱: 在每轮(完整遍历所有训练样本)之前随机打乱训练数据集是常见做法。这可以避免算法反复看到相同顺序的样本所形成的循环,从而提高收敛性。SGD代表一种权衡:它牺牲了批量梯度下降的平滑收敛性,以换取更快的单个更新,从而使大规模机器学习成为可能。其有噪声的特性,虽然有时会带来问题,但也可能有利。然而,更新中的高方差自然地引出了一种折中方案:小批量梯度下降,我们接下来会讨论。