我经常读到,在使用深度学习模型的情况下,通常的做法是在几个训练时期内应用小批量(通常是32/64的小批量)。我无法真正理解背后的原因。
除非我没有记错,否则批大小是模型在训练迭代期间看到的训练实例的数量;当模型已经看到每个训练实例时,纪元就轮到了。如果是这样,我看不到对训练实例的几乎无关紧要的子集进行多次迭代的优势,而与通过将每个回合中所有可用的训练实例暴露给模型来应用“最大批次”相反(当然,假设足够记忆)。这种方法的优势是什么?
我经常读到,在使用深度学习模型的情况下,通常的做法是在几个训练时期内应用小批量(通常是32/64的小批量)。我无法真正理解背后的原因。
除非我没有记错,否则批大小是模型在训练迭代期间看到的训练实例的数量;当模型已经看到每个训练实例时,纪元就轮到了。如果是这样,我看不到对训练实例的几乎无关紧要的子集进行多次迭代的优势,而与通过将每个回合中所有可用的训练实例暴露给模型来应用“最大批次”相反(当然,假设足够记忆)。这种方法的优势是什么?
Answers:
使用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之间的小批量尺寸,始终可以获得最佳性能,这与最近倡导使用数千个小批量尺寸的工作形成了鲜明的对比。
内存并不是执行此操作的真正原因,因为您可以在遍历数据集时累积渐变,并在最后应用它们,但是仍然以SGD进行,每一步都应用它们。
SGD被广泛使用的原因是:
1)效率。通常,尤其是在训练初期,数据不同子集的参数梯度将倾向于指向同一方向。因此,对数据的1/100进行评估的梯度将大致指向与整个数据集相同的大致方向,但只需要1/100的计算即可。由于高度非线性的深度网络上的收敛通常需要数千或数百万次迭代,而不管您的梯度有多好,因此有必要根据梯度的廉价估算进行许多更新,而不是基于良好的梯度进行少量更新。
2)优化:嘈杂的更新可能会让您跳出不良的局部最优状态(尽管我没有消息来源表明这在实践中很重要)。
3)泛化。似乎(请参阅Zhang等人的《深度学习理论》 III:SGD的泛化特性)SGD实际上可以通过在训练集上找到“平坦”的最小值来实际上帮助泛化,而在训练集上找到最小值也是“平坦的”。直观地说,我们可以认为新元看作是一种装袋 -通过基于数据的许多minibatches计算我们的参数,我们增援的规则,广义含跨minibatches,并取消不规则,从而使我们变得容易过度拟合到训练集。
除非我没有记错,否则批大小是模型在训练迭代期间看到的训练实例的数量
正确(尽管我称其为“重量更新步骤”)
当模型已经看到每个训练实例时,时代就轮到了
正确
如果是这样,我看不到在几乎没有意义的训练实例子集上进行多次迭代的优势,这与通过将每个回合中所有可用的训练实例暴露给模型来应用“最大批处理”形成对比(当然,假设足够记忆)。这种方法的优势是什么?
好吧,差不多。您通常没有足够的内存。可以说我们正在谈论图像分类。ImageNet是一个非常受欢迎的数据集。在相当长的一段时间内,VGG-16D是最受欢迎的mod.els之一。它需要为一张224x224图像计算15 245 800个浮点数(在功能图中)。这意味着每个图像大约61MB。这只是在训练每个图像时需要多少内存的大致下限。ImageNet包含数千张(我认为约为120万张)图像。虽然您可能有那么多的主内存,但是您当然没有那么多的GPU内存。我已经看到GPU将速度提高到21倍左右。因此,您肯定要使用GPU。
另外:一个小批量生产的时间要短得多。所以问题是:您宁愿在GPU上每小时以小批量更新n个步骤,还是在不带GPU的批次中更新m个步骤,其中n >> m。