批量梯度下降与随机梯度下降

机器算法验证 优化 梯度下降 随机梯度下降
2022-01-28 21:26:33

假设我们有一些训练集(x(i),y(i))为了i=1,,m. 还假设我们在训练集上运行某种类型的监督学习算法。假设表示为hθ(x(i))=θ0+θ1x(i)1++θnx(i)n. 我们需要找到参数θ最小化之间的“距离”y(i)hθ(x(i)).

J(θ)=12i=1m(y(i)hθ(x(i))2

然后我们想找到θ最小化J(θ). 在梯度下降中,我们初始化每个参数并执行以下更新:

θj:=θjαθjJ(θ)

批量梯度下降和随机梯度下降之间的主要区别是什么?

两者都使用上述更新规则。但是一个比另一个更好吗?

4个回答

批量或随机梯度下降的适用性实际上取决于预期的误差流形。

批量梯度下降使用整个数据集计算梯度。这对于凸的或相对平滑的误差流形非常有用。在这种情况下,我们会直接朝着局部或全局的最佳解决方案前进。此外,在给定退火学习率的情况下,批量梯度下降最终将找到位于其吸引力盆地中的最小值。

随机梯度下降 (SGD) 使用单个样本计算梯度。SGD 的大多数应用程序实际上使用了几个样本的 minibatch,原因将在稍后解释。对于具有大量局部最大值/最小值的误差流形,SGD 效果很好(我想不是很好,但比批量梯度下降要好)。在这种情况下,使用减少的样本数量计算出的噪声梯度往往会使模型脱离局部最小值,进入一个有望更优化的区域。单个样本真的很嘈杂,而小批量往往会平均一点噪音。因此,使用 minibatch 时会减少 jerk 的数量。当 minibatch 的大小足够小可以避免一些较差的局部最小值,但又足够大以至于它不会 t 避免全局最小值或性能更好的局部最小值。(顺便说一句,这假设最佳最小值具有更大和更深的吸引力盆地,因此更容易落入。)

SGD 的一个好处是它的计算速度要快得多。大型数据集通常无法保存在 RAM 中,这使得矢量化的效率大大降低。相反,必须加载、处理每个样本或每批样本、存储结果等等。另一方面,Minibatch SGD 通常故意做得足够小,以便在计算上易于处理。

通常,这种计算优势是通过执行更多的 SGD 迭代来利用的,比传统的批量梯度下降执行更多的步骤。这通常会导致模型非常接近通过批量梯度下降找到的模型,或者更好。

我喜欢思考 SGD 如何工作的方式是想象我有一个点代表我的输入分布。我的模型正在尝试学习该输入分布。围绕输入分布的是一个阴影区域,表示我可以采样的所有可能小批量的输入分布。通常合理的假设是小批量输入分布与真实输入分布非常接近。批量梯度下降在所有步骤中都采用最陡峭的路线来达到真实的输入分布。另一方面,SGD 在阴影区域内选择一个随机点,并采取最陡峭的路线到达该点。但是,在每次迭代中,它都会选择一个新点。所有这些步骤的平均值将近似于真实的输入分布,通常非常好。

正如其他答案所暗示的那样,使用 SGD 的主要原因是降低梯度的计算成本,同时在对许多小批量或样本进行平均时仍然在很大程度上保持梯度方向——这肯定有助于达到局部最小值。

  1. 为什么小批量有效

这背后的数学原理是,成本函数的“真实”梯度(泛化误差或无限大样本集的梯度)是梯度的期望g在真实数据生成分布上pdata; 实际梯度g^在一批样本上计算的结果始终是具有经验数据分布的真实梯度的近似值p^data.

g^=Ep^data(J(θ)θ)
给定所有数据样本,批量梯度下降可以为您带来可能的“最佳”梯度,但它不是“真正的”梯度。较小的批次(即小批次)可能不如完整批次的最佳,但它们都是近似值 - 单样本小批次 (SGD) 也是如此。

假设两者之间没有依赖关系m一个小批量中的样本,计算的g^(m)是真实梯度的无偏估计。具有不同小批量大小的估计值的(平方)标准误差与小批量的大小成反比。那是,

SE(g^(n))SE(g^(m))=mn
即,标准误差的减少是样本量增加的平方根。这意味着,如果 minibatch 很小,学习率也必须很小,以便在大方差上实现稳定性。当样本不独立时,无偏估计的性质不再保持。如果样本的排序不够随机,这需要您在训练之前对样本进行洗牌。

  1. 为什么 minibatch 可能会更好

首先,minibatch 使得一些学习问题从技术上难以处理变得易于处理,因为较小的批量减少了计算需求。

其次,减小批量大小并不一定意味着梯度精度降低。许多训练样本有很多噪声、异常值或偏差。随机抽样的 minibatch 可能比原始的完整批次更好(或不差)反映真实数据生成分布。如果小批量梯度更新的一些迭代可以为您提供更好的估计,那么总体而言,一个时期的平均结果可能比从整批计算的梯度更好。

第三,小批量不仅有助于处理令人不快的数据样本,还有助于处理具有许多局部最小值的令人不快的成本函数。正如 Jason_L_Bens 所提到的,有时误差流形可能更容易将常规梯度捕获到局部最小值中,而更难以捕获使用 minibatch 计算的临时随机梯度。

最后,使用梯度下降,您不会一步达到全局最小值,而是在误差流形上进行迭代。梯度在很大程度上只给你迭代的方向。使用 minibatch,您可以更快地迭代。在许多情况下,迭代次数越多,您可以达到的点就越好。您并不真正关心该点在全球甚至本地是最佳的。你只想达到一个合理的模型,给你带来可接受的泛化错误。Minibatch 使这更容易。

如果您仔细阅读,您可能会发现 Ian Goodfellow 等人的《深度学习》一书对此主题进行了很好的讨论。

对我来说,批量梯度类似于精益梯度。在精益梯度中,批次大小的选择使得每个要更新的参数在批次中也独立变化,但不一定正交。例如,如果批次包含 10 个实验,10 行,那么有可能形成2101=512独立的列。10 行支持独立但非正交更新 512 个参数。

想象一下,你正在下山到一个最低高度的山谷。您可以使用批量梯度下降计算一次到山谷的方向,然后就去那里。但在那个方向你可能有一个上坡。最好避免它,这就是随机梯度下降的想法。有时最好采取小步骤


仅就术语方向而言,批量梯度下降并不是您直觉上想的那样。这是指每次迭代的完整数据集传递,在这种情况下,整个数据集称为批处理,我们计算真实梯度的平均值。随机梯度下降实际上就是我们所知道的每次迭代梯度下降更新的多个批次。这就是为什么您第二次听到minibatch这个词的原因。