为什么在所有训练数据中,最小批次大小比单个“批次”更好?


40

我经常读到,在使用深度学习模型的情况下,通常的做法是在几个训练时期内应用小批量(通常是32/64的小批量)。我无法真正理解背后的原因。

除非我没有记错,否则批大小是模型在训练迭代期间看到的训练实例的数量;当模型已经看到每个训练实例时,纪元就轮到了。如果是这样,我看不到对训练实例的几乎无关紧要的子集进行多次迭代的优势,而与通过将每个回合中所有可用的训练实例暴露给模型来应用“最大批次”相反(当然,假设足够记忆)。这种方法的优势是什么?


1
查看答案。
Icyblade



Answers:


46

使用minibatch而不是完整数据集的主要优势可以追溯到随机梯度下降1的基本思想。

在批量梯度下降中,您可以计算整个数据集中的梯度,对大量信息进行平均。这样做需要很多内存。但是真正的障碍是批次梯度轨迹使您处于一个不好的位置(鞍点)。

另一方面,在纯SGD中,通过添加(负号)在数据集的单个实例上计算的梯度来更新参数。由于它基于一个随机数据点,因此非常嘈杂,并且可能在远离批处理梯度的方向上偏离。但是,噪声正是您在非凸优化中想要的,因为它可以帮助您摆脱鞍点或局部最小值(在[2]中的定理6)。缺点是效率极低,您需要多次遍历整个数据集才能找到一个好的解决方案。

最小批量方法是一种折衷方案,可为每个梯度更新注入足够的噪声,同时实现相对快速的收敛。

1 Bottou,L.(2010年)。具有随机梯度下降的大规模机器学习。在COMPSTAT'2010会议录中(第177-186页)。物理出版社高清。

[2]葛丽娜,黄峰峰,金成龙,袁元。(2015年6月)。从鞍点在线随机梯度逃逸以进行张量分解。在COLT(第797-842页)中。

编辑:

我刚刚在Yann LeCun的Facebook上看到了此评论,该评论为这个问题提供了新的观点(对不起,不知道如何链接到fb。)

进行大型迷你飞艇训练对您的健康不利。更重要的是,这对您的测试错误不利。朋友不要让朋友使用大于32的微型批处理。让我们面对现实:自2012年以来,唯一的人改用大于1的微型批处理是因为GPU对于小于32的批处理大小效率低下。这是一个可怕的原因。这只是意味着我们的硬件糟透了。

他引用了几天前(2018年4月)刚刚发布在arXiv上的这篇论文,值得一读,

Dominic Masters,Carlo Luschi,重新审视深度神经网络的小批量培训,arXiv:1804.07612v1

从摘要来看,

虽然使用大型迷你批处理增加了可用的计算并行性,但小批量训练已显示可提供改进的泛化性能...

对于m = 2和m = 32之间的小批量尺寸,始终可以获得最佳性能,这与最近倡导使用数千个小批量尺寸的工作形成了鲜明的对比。


2
为什么小批量梯度下降比批梯度下降更可能避免不良的局部最小值?您有什么要支持的主张吗?
Martin Thoma

@MartinThoma参见[2]中关于JMLR的最新论文中的定理6。
horaceT '17

2
文还对的arXiv。另外,我看不出这如何支持您的主张。他们甚至没有提到小批量梯度下降。我不了解该定理(例如,“ g(X)”是什么?他们在哪里引入了该符号?在统计类中,g(X)= E(X)...但是在这里没有太大意义) 。什么是?-关于该定理的陈述似乎表明没有不好的局部极小值。但这对于SGD和批量梯度下降以及小批量梯度下降都是正确的,对吗?ϕ(w,X)
马丁·托马

2
@MartinThoma假设我们给定的数据集有一个全局最小值,那么达到该全局最小值的确切路径取决于每种GD方法的不同情况。对于批处理,唯一的随机方面是初始化时的权重。如果您使用相同的初始权重和数据集再次训练NN,则梯度路径将相同。对于小型批处理和SGD,从对每个步骤进行训练的数据点的随机采样开始,每个步骤之间的路径都会具有一些随机性。如果微型批处理和SGD正在运行,则它们可以逃脱局部最优。
韦斯利

8

内存并不是执行此操作的真正原因,因为您可以在遍历数据集时累积渐变,并在最后应用它们,但是仍然以SGD进行,每一步都应用它们。

SGD被广泛使用的原因是:

1)效率。通常,尤其是在训练初期,数据不同子集的参数梯度将倾向于指向同一方向。因此,对数据的1/100进行评估的梯度将大致指向与整个数据集相同的大致方向,但只需要1/100的计算即可。由于高度非线性的深度网络上的收敛通常需要数千或数百万次迭代,而不管您的梯度有多好,因此有必要根据梯度的廉价估算进行许多更新,而不是基于良好的梯度进行少量更新。

2)优化:嘈杂的更新可能会让您跳出不良的局部最优状态(尽管我没有消息来源表明这在实践中很重要)。

3)泛化。似乎(请参阅Zhang等人的《深度学习理论》 III:SGD的泛化特性)SGD实际上可以通过在训练集上找到“平坦”的最小值来实际上帮助泛化,而在训练集上找到最小值也是“平坦的”。直观地说,我们可以认为新元看作是一种装袋 -通过基于数据的许多minibatches计算我们的参数,我们增援的规则,广义含跨minibatches,并取消不规则,从而使我们变得容易过度拟合到训练集。


3

除非我没有记错,否则批大小是模型在训练迭代期间看到的训练实例的数量

正确(尽管我称其为“重量更新步骤”)

当模型已经看到每个训练实例时,时代就轮到了

正确

如果是这样,我看不到在几乎没有意义的训练实例子集上进行多次迭代的优势,这与通过将每个回合中所有可用的训练实例暴露给模型来应用“最大批处理”形成对比(当然,假设足够记忆)。这种方法的优势是什么?

好吧,差不多。您通常没有足够的内存。可以说我们正在谈论图像分类。ImageNet是一个非常受欢迎的数据集。在相当长的一段时间内,VGG-16D是最受欢迎的mod.els之一。它需要为一张224x224图像计算15 245 800个浮点数(在功能图中)。这意味着每个图像大约61MB。这只是在训练每个图像时需要多少内存的大致下限。ImageNet包含数千张(我认为约为120万张)图像。虽然您可能有那么多的主内存,但是您当然没有那么多的GPU内存。我已经看到GPU将速度提高到21倍左右。因此,您肯定要使用GPU。

另外:一个小批量生产的时间要短得多。所以问题是:您宁愿在GPU上每小时以小批量更新n个步骤,还是在不带GPU的批次中更新m个步骤,其中n >> m。


确实不是有限的内存问题。始终可以使用固定的模型参数在多个批次中计算整个数据集中的梯度(在功能上等同于在单个巨型批次中计算梯度)。实际上,它更多是关于由SGD / MBGD的随机性/噪声引起的泛化属性,以及为了达到收敛而需要通过数据集的历元更少的事实。在单个时期内更新模型参数会导致更好的中间参数,从而使该时期内的进一步梯度计算更具参考价值。
麦迪逊,

1

除了其他答案,我认为值得指出的是,有两个数量不同但又经常耦合的数量:

  1. 每个步骤中用于计算参数梯度的输入数量。

正如其他人指出的那样,相对于小批量的梯度是真实梯度的近似值。最小批量越大,近似值越好。

  1. 收集到数组中并“同时”计算的输入数

这里的权衡纯粹是关于性能(内存/周期)。

这些数量通常相同,即小批量大小,但原则上它们可以解耦。

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.