我将要训练一个包含2-3百万篇文章的大型LSTM网络,并且正面临着内存错误(我使用AWS EC2 g2x2large)。
我发现一种解决方案是减少batch_size
。但是,我不确定此参数是否仅与内存效率问题有关,还是会影响我的结果。实际上,我还注意到batch_size
示例中使用的通常是2的幂,我也不理解。
我不介意我的网络需要花费更长的时间来训练,但是我想知道是否减少batch_size
会降低我的预测质量。
谢谢。
我将要训练一个包含2-3百万篇文章的大型LSTM网络,并且正面临着内存错误(我使用AWS EC2 g2x2large)。
我发现一种解决方案是减少batch_size
。但是,我不确定此参数是否仅与内存效率问题有关,还是会影响我的结果。实际上,我还注意到batch_size
示例中使用的通常是2的幂,我也不理解。
我不介意我的网络需要花费更长的时间来训练,但是我想知道是否减少batch_size
会降低我的预测质量。
谢谢。
Answers:
一年半后,我回到我的答案,因为我以前的答案是错误的。
批量大小会极大地影响学习。当您通过网络放置批次时,会发生平均梯度的情况。其概念是,如果您的批处理大小足够大,这将为整个数据集的梯度提供足够稳定的估计。通过从数据集中获取样本,您可以估算梯度,同时显着降低计算成本。您走得越低,估计的准确性就越低,但是在某些情况下,这些嘈杂的梯度实际上可以帮助逃避局部最小值。太低时,如果数据嘈杂,网络权重可能会突然跳动,并且可能无法学习或收敛非常缓慢,从而对总计算时间造成负面影响。
批处理的另一个优点是用于GPU计算,如果部分计算是相同的(例如,在网络的相同权重矩阵上重复矩阵乘法),则GPU非常擅长并行化神经网络中发生的计算。这意味着批量大小为16所需的时间少于批量大小为8的两倍。
如果您确实需要较大的批次大小,但不适合您的GPU,则可以添加一小批,保存梯度估计值并提交一个或多个批次,然后进行权重更新。这样,您可以得到更稳定的梯度,因为您增加了虚拟批次的大小。
错了,老答案:[[[不,batch_size平均只会影响您的学习速度,而不会影响学习质量。batch_sizes也不必是2的幂,尽管我知道某些软件包只允许2的幂。您应该尝试使batch_size尽可能高,仍然适合GPU的内存,以得到最大的速度。 。]]]]
我认为已接受的答案可能是错误的。梯度下降算法中有一些变体。
Vanilla Gradient Descent:此处是一次计算所有数据点的梯度,并取平均值。因此,我们有一个更平滑的渐变版本,需要更长的时间来学习。
随机梯度下降:此处一次是一个数据点,因此梯度是激进的(嘈杂的梯度),因此会有很多振荡(我们使用动量参数-例如Nesterov进行控制)。因此,您的振荡有可能使算法无法达到局部最小值。
迷你批次梯度下降:取前两个项目的津贴来平均小批次的梯度。因此,它不像SGD那样激进,并且允许Vanilla GD从未允许的在线学习。
Mini-Batch越小,模型的性能(并非总是如此)会越好,当然,这与您的时代学习太快有关。如果您正在使用大型数据集进行训练,则需要更快的收敛速度和良好的性能,因此我们选择了Batch-GD。
SGD具有固定的学习参数,因此我们启动了其他自适应优化器,例如Adam,AdaDelta,RMS Prop等,它们会根据梯度的历史记录更改学习参数。
奇怪的是,我发现带有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
有关
BatchNormalization
,这影响了结果。在训练期间使用太大的批次大小可能会对网络的准确性产生负面影响,因为这会降低梯度下降的随机性。
编辑:大多数情况下,batch_size
希望增加以加快计算速度,但是还有其他更简单的方法,例如通过dtype
在keras或tensorflow中通过参数使用较小占用空间的数据类型,例如float32
代替float64