在 SGD 训练中处理小批量

机器算法验证 机器学习 神经网络 深度学习 梯度下降 随机梯度下降
2022-03-22 07:09:05

我正在尝试使用随机梯度下降(SGD)训练一个大型模型(使用 caffe 的深度网络)。
问题是我受到 GPU 内存容量的限制,因此无法为每个随机梯度估计处理大型 mini-batch。

我怎样才能克服训练中的这种不稳定性?

我的一个想法是使用动量,并将其设置为比通常设置的默认值更高的值。这是一个有效的策略吗?


对于那些碰巧使用Caffe的人来说,知道 caffe 已经实现了跨 mini-batches 的梯度累积可能会很有趣(正如Indie Al所建议的那样)。您只需要iter_size'solver.prototxt'.

这也可以在pytorch中完成。例如看这篇文章

2个回答

对于小批量,我相信 SGD 下降方向成为对“真实”下降方向的非常嘈杂的估计(即,如果我们在整个训练集上对其进行评估)。对于小批量,我不确定增加动量会有多大帮助,因为它会在非常嘈杂的方向上积累动量。但我可能是错的,也许你的优化问题在可行的情况下已经足够好了。

如果您不追求“最先进”的结果,您可以选择自然图像数据的一个选项是调整图像大小。实际上,我认为模追求卓越的基准测试性能,自然图像具有许多尺度不变的属性,并且它们的许多语义特征在合理的尺度变换下相当健壮。这将减轻一些 GPU 内存并允许您增加批量大小,并且您的 SGD 下降方向将更好地估计下降方向。

如果您正在处理像负对数似然这样的可分离损失函数,我们可以利用这样一个事实,即大批次的梯度仅仅是其组成子批次的梯度的总和/平均值。例如,如果我们的批大小是 ,我们可以像往常一样通过迭代批次来计算超级如果我们适当地平均,我们将计算大小的超级批次的精确梯度。个批次后执行权重更新。BBKBKK

我们将通过如上所述的序列化计算额外的计算或内存开销最小,只需修改小批量迭代器以包含超级批量序列化和梯度缓存。BK

最近看到一个有趣的作品:

Samuel L. Smith、Pieter-Jan Kindermans、Chris Ying、Quoc V. Le, 不要降低学习率,增加批量(ICLR 2018)。

这项工作显示了批量大小和学习率之间的直接联系。具体来说,降低学习率与增加批量大小具有相同的效果,反之亦然。
将他们的结论推向极端,人们可能会考虑减少批量大小并通过增加学习率来补偿它。
不过,我还没有真正尝试过。