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


101

假设我们有一些训练集,其中。还假设我们在训练集上运行某种类型的监督学习算法。假设表示为。我们需要找到参数,以最小化和之间的“距离” 。令(x(i),y(i))i=1,,mhθ(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(θ)

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

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

Answers:


121

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

批梯度下降使用整个数据集计算梯度。这对于凸的或相对平滑的误差流形非常有用。在这种情况下,我们在某种程度上直接朝着局部或全局的最佳解决方案迈进。此外,在退火率下降的情况下,批次梯度下降最终将在吸引池中找到最小值。

随机梯度下降(SGD)使用单个样本计算梯度。实际上,SGD的大多数应用实际上都使用了几个样本的小批量,原因将在稍后解释。对于具有很多局部最大值/最小值的误差流形,SGD效果很好(我想不是很好,但是比批梯度下降更好)。在这种情况下,使用减少的样本数计算出的有点嘈杂的梯度会使模型脱离局部最小值,从而进入一个更理想的区域。单个样本确实很吵,而迷你批处理往往会平均消除一些噪声。因此,当使用小批量处理时,可减少加扰量。当小批量的大小足够小,可以避免一些较差的局部最小值,但又足够大而不会达到平衡时,则达到了良好的平衡 避免全局最小值或性能较好的局部最小值。(顺便说一句,这是假定最佳极小值具有更大更深的吸引力,因此更容易陷入。)

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

通常,通过执行SGD的更多迭代来利用此计算优势,比传统的批处理梯度下降执行更多的步骤。通常,这会导致生成的模型非常接近通过批次梯度下降找到的模型,甚至更好。

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


13
实际上,没有人使用“批梯度下降”。它只是在计算上太昂贵而不能获得太多收益。(获得的好处是您实际上正在逐步降低“真实”梯度。)当您拥有高度非凸的损失函数时,您只需要沿正确的方向迈进,最终您将收敛于局部最小值。因此,小批量SGD。
sabalaba 2015年

@Jason_L_Bens您是否有参考资料(论文或在线文本),可以在其中阅读有关这些算法的更多信息?
user110320

1
@ user110320不,虽然它们是非常常用的算法,但我想不起来,因此,在进行一些搜索后,应该在该主题上有大量资源可用。如果您正在寻找一种通用的方法,我建议您阅读Yoshua Bengio的《学习AI的深度架构》。这是我开始的地方。
Jason_L_Bens

6

正如其他答案所暗示的那样,使用SGD的主要原因是为了减少梯度的计算成本,同时在对多个迷你批次或样本进行平均时仍可以在很大程度上维持梯度方向-这无疑有助于使您达到局部最小值。

  1. 为什么minibatch有效

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

g=Epdata(J(θ)θ)
在给定所有数据样本的情况下,批次梯度下降可以为您带来可能的“最佳”梯度,但它不是“真实”梯度。较小的批次(小型批次)可能不如完整批次最佳,但它们都是近似值-单样本小型批次(SGD)也是如此。它们之间的标准误差之差与小批量的大小成反比。也就是说,
SE(g^(n))SE(g^(m))=mn
即,标准误的减少是样本量增加的平方根。上面的等式适用于在小批量梯度下降的一个步骤中计算出的梯度。当您迭代小批量梯度更新的步骤并最终在一个时期内最终使用所有训练样本时,您实际上是在基于所有给定样本的情况下计算梯度的平均值。也就是说,对于小批量, 从上面的方程式,我们可以得出结论,在一个历元的情况下,具有不同最小批处理大小的平均梯度m
Ep^data(g^(m))=Ep^data(J(θ)θ)
m (从一个批次到整个批次)具有相同的标准误差,更重要的是,它们都是“真实”梯度的忠实近似值,即朝“真实”梯度的正确方向移动。
  1. 为什么minibatch可能会更好

首先,由于批量大小较小而减少了计算需求,因此minibatch使得一些学习上的问题从技术上难以解决到可以解决。

其次,批量大小的减少不一定意味着梯度精度的降低。训练样本有很多噪音,离群值或偏差。随机采样的小批处理可能比原始的完整批处理更好(或不更糟)反映真实数据生成分布。如果小批量梯度更新的一些迭代为您提供了更好的估计,则总体而言,一个历元的平均结果可能比从整个批次计算的梯度更好。

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

最后,通过梯度下降,您不会一步一步达到全局最小值,而是在错误歧管上进行迭代。渐变在很大程度上只给您迭代的方向。使用minibatch,可以更快地进行迭代。在许多情况下,迭代次数越多,可以达到的效果就越好。您并不真正在乎所有天气,这在全球乃至局部都是最佳的。您只想找到一个合理的模型,为您带来可接受的泛化错误。Minibatch使这更容易。

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


对于凸优化问题,您说的没问题。但是要在非凸函数上使用梯度方法,您错过了一个非常关键的理由,即SGD比批处理GD更好。见我的回应datascience.stackexchange.com/questions/16807/…–
horaceT

@horaceT感谢您的评论。由于上面提到的要点已经由Jason_L_Bens进行了详细描述,因此,我不必重复,而是在最后第三段中适当提及他的回答。对于梯度下降优化问题,非凸点由包含鞍点的局部极小值反映出来(请参阅最后第三段);为了便于说明,我的回答将SGD描述为微型批次,但批次大小为1(请参见第三段)。
萧锋锂

3

对我而言,批处理梯度类似于精益梯度。在稀薄梯度中,选择批次大小,以便应更新的每个参数在批次中也独立(但不一定正交)变化。例如,如果批次包含10个实验,10行,则有可能形成独立列。10行可独立但非正交地更新512个参数。2101=512

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.