Keras中的batch_size对结果的质量有影响吗?


38

我将要训练一个包含2-3百万篇文章的大型LSTM网络,并且正面临着内存错误(我使用AWS EC2 g2x2large)。

我发现一种解决方案是减少batch_size。但是,我不确定此参数是否仅与内存效率问题有关,还是会影响我的结果。实际上,我还注意到batch_size示例中使用的通常是2的幂,我也不理解。

我不介意我的网络需要花费更长的时间来训练,但是我想知道是否减少batch_size会降低我的预测质量。

谢谢。


这个问题并非仅针对喀拉拉邦。我认为普遍的共识是,较小的样本量收敛较慢,但不太容易陷入局部极小点
Alex

我看到过这样的情况:即使使用相同数量的训练时期,批次大小过大也会阻止收敛。
柯蒂斯·怀特

Answers:


43

一年半后,我回到我的答案,因为我以前的答案是错误的。

批量大小会极大地影响学习。当您通过网络放置批次时,会发生平均梯度的情况。其概念是,如果您的批处理大小足够大,这将为整个数据集的梯度提供足够稳定的估计。通过从数据集中获取样本,您可以估算梯度,同时显着降低计算成本。您走得越低,估计的准确性就越低,但是在某些情况下,这些嘈杂的梯度实际上可以帮助逃避局部最小值。太低时,如果数据嘈杂,网络权重可能会突然跳动,并且可能无法学习或收敛非常缓慢,从而对总计算时间造成负面影响。

批处理的另一个优点是用于GPU计算,如果部分计算是相同的(例如,在网络的相同权重矩阵上重复矩阵乘法),则GPU非常擅长并行化神经网络中发生的计算。这意味着批量大小为16所需的时间少于批量大小为8的两倍。

如果您确实需要较大的批次大小,但不适合您的GPU,则可以添加一小批,保存梯度估计值并提交一个或多个批次,然后进行权重更新。这样,您可以得到更稳定的梯度,因为您增加了虚拟批次的大小。

错了,老答案:[[[不,batch_size平均只会影响您的学习速度,而不会影响学习质量。batch_sizes也不必是2的幂,尽管我知道某些软件包只允许2的幂。您应该尝试使batch_size尽可能高,仍然适合GPU的内存,以得到最大的速度。 。]]]]


我买不起32,但我买了16。但是,我注意到它太慢了。您认为我应该尝试在16-32之间的某个值还是坚持使用16?
hipoglucido

我会尝试和计时一些值。每个时期都应该在同一时间左右,以免花费太长时间。首先尝试17,看看它是快还是慢,因为我对此很感兴趣,因为2的幂取决于GPU和/或Keras的后端。但是我认为最好将其填满
Jan van der Vegt '16

9
您确定批量大小不会影响学习质量吗?我记得读过一些博客/论文(?),他们说较小的批次比较大的批次产生更大的梯度,但是噪声对于摆脱局部最小值可能很有用。虽然不确定这是否/如何适用于LSTM。
stmax 2016年

不完全相信,我自己没有足够的经验,但这就是我读到的。我可以看到渐变不稳定,因此可能会关闭。
Jan van der Vegt '16年

2
一年半后,现在我的知识更加丰富,我同意。我要更改答案
Jan van der Vegt

11

我认为已接受的答案可能是错误的。梯度下降算法中有一些变体。

  1. Vanilla Gradient Descent:此处是一次计算所有数据点的梯度,并取平均值。因此,我们有一个更平滑的渐变版本,需要更长的时间来学习。

  2. 随机梯度下降:此处一次是一个数据点,因此梯度是激进的(嘈杂的梯度),因此会有很多振荡(我们使用动量参数-例如Nesterov进行控制)。因此,您的振荡有可能使算法无法达到局部最小值。

  3. 迷你批次梯度下降:取前两个项目的津贴来平均小批次的梯度。因此,它不像SGD那样激进,并且允许Vanilla GD从未允许的在线学习。

Mini-Batch越小,模型的性能(并非总是如此)会越好,当然,这与您的时代学习太快有关。如果您正在使用大型数据集进行训练,则需要更快的收敛速度和良好的性能,因此我们选择了Batch-GD。

SGD具有固定的学习参数,因此我们启动了其他自适应优化器,例如Adam,AdaDelta,RMS Prop等,它们会根据梯度的历史记录更改学习参数。


3)通常称为minibatch
Alex Alex

@Alex:添加了更改。
Jil Jung Juk

1
我同意没有关于batch-size参数的规则。但是这种说法“迷你批次越小,模型的性能越好”,这与一般规则背道而驰。您通常希望最大化批次大小
MonsieurBeilto

4

奇怪的是,我发现带有keras的较大批量需要更多的时间来收敛。

例如,基于keras 集成测试此脚本的输出为

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

有关

在训练期间使用太大的批次大小可能会对网络的准确性产生负面影响,因为这会降低梯度下降的随机性。

编辑:大多数情况下,batch_size希望增加以加快计算速度,但是还有其他更简单的方法,例如通过dtypekerastensorflow中通过参数使用较小占用空间的数据类型,例如float32代替float64


随着批次的增加(因此每个时期减少),每个时期的梯度更新将更少。“ epoch”只是“训练期间一次通过您的数据”的ML术语。如果您想加快训练速度,请测量墙壁时间并忽略历时。
安德鲁·瓦格纳
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.