怎么选取训练神经网络时的Batch size?
27 个回答
batch size可以说是所有超参数里最好调的一个,也是应该最早确定下来的超参数。
我的原则是,先选好batch size,再调其他的超参数。
实践上来说,就两个原则——batch size别太小,也别太大,其他都行。
听起来像是废话,但有时候真理就是这么简单。
合适的batch size范围和训练数据规模、神经网络层数、单元数都没有显著的关系。
合适的batch size范围主要和收敛速度、随机梯度噪音有关。
一,为什么batch size别太小?
别太小的限制在于, batch size太小,会来不及收敛。
有一篇NeurIPS2019[1]说,「learning rate/batch size比值越大,泛化越好」。
所以文献里都这么说了,那我们是不是一定就应该选尽量小batch size呢?
那当然不是了。你看一下文献[1]的generalization bound的证明是long-time limit的定态分布和continuous-time approximation下证明的。
当你的batch size太小的时候,在一定的epoch数里,训练出来的参数posterior是根本来不及接近long-time limit的定态分布。
所以batch size下限主要受收敛的影响。
所以在常见的setting(~100 epochs),batch size一般不会低于16。
如果你要选更小的batch size,你需要给自己找到很好的理由。
二,为什么batch size别太大?
batch size别太大的限制在于两个点,
1)batch size太大,memory容易不够用。这个很显然,就不多说了。
2) batch size太大,深度学习的优化(training loss降不下去)和泛化(generalization gap很大)都会出问题。
随机梯度噪音的magnitude在深度学习的continuous-time dynamics里是 正比于learning rate/batch size。batch size太大,噪音就太小了。
而大家已经知道,随机梯度噪音对于逃离saddle points [2]和sharp minima [3]都必不可少的作用。前者可以解释为什么优化出问题,后者则可以解释为什么泛化出问题。
所以当你 跑large-batch training的时候,就应该用linear scaling rule [4]。就是保持learning rate/batch size和正常设置一致即可。
这是目前的一些常识。
中文互联网大多数介绍文章也是到这里就结束了。
但是还没完。
linear scaling rule最开始是一条经验规则,但它还有自己的故事——它其实是可以从Langevin Dynamics推导出来的。有空我单独介绍一下怎么推,其实对懂一些统计物理的人来说很简单。
总之,可以证明, learning rate/batch size的比值对深度学习是有指数级的影响 [3],所以非常重要,没事别瞎调。
(关于文献[3],我有一篇专门的介绍文章: 梯度下降法的神经网络容易收敛到局部最优,为什么应用广泛? )
最后,很多人忽略的一点就是, 这个linear scaling rule也有一个尴尬的极限。
在ImageNet上,batch size达到16K的时候,无论怎么调learning rate, large-batch training都比正常设置显著得差。
原因在于large learning rate带来的训练误差太大了,偏偏深度学习small learning rate下的理论很多,而large learning rate下的理论几乎是空白。所以大家现在对解决这个问题其实是没什么有效的思路。
(文献[5]说自己可以用full-batch training达到minibatch training的效果哦。但是没完,你仔细看看文献[5]的minibatch的baseline是没有用weight decay,比标准的baseline差得远。)
而在CIFAR上,你甚至不太容易观察到这个linear scaling rule。因为在常规的200个epoch左右的训练下,这个linear scaling rule已经接近失效了。
因为,learning rate调大一点,200个epoch甚至就来不及收敛了。这种情况的表现形式是,generalization gap很小,但是training loss降不下来。
所以, 怎么把large-batch training的极限batch size提高,是一个有很高工业价值和学术价值的课题。
References:
[1] He, F., Liu, T., & Tao, D. (2019). Control batch size and learning rate to generalize well: Theoretical and empirical evidence. In International Conference on Neural Information Processing Systems .
[2] Jin, C., Ge, R., Netrapalli, P., Kakade, S. M., & Jordan, M. I. (2017, July). How to escape saddle points efficiently. In International Conference on Machine Learning (pp. 1724-1732). PMLR.
[3] Xie, Z., Sato, I., & Sugiyama, M. (2020). A diffusion theory for deep learning dynamics: Stochastic gradient descent exponentially favors flat minima. In International Conference on Representation Learning .
[4] Goyal, P., Dollár, P., Girshick, R., Noordhuis, P., Wesolowski, L., Kyrola, A., ... & He, K. (2017). Accurate, large minibatch sgd: Training imagenet in 1 hour. arXiv preprint arXiv:1706.02677 .
[5] Wu, J., Hu, W., Xiong, H., Huan, J., Braverman, V., & Zhu, Z. (2020, November). On the noisy gradient descent that generalizes as sgd. In International Conference on Machine Learning (pp. 10367-10376). PMLR.
目录
- batch size 需要调参
- 个人经验分享
- 为什么 batch size 会影响训练结果
- Tensorflow Playground 演示
batch size 需要 调参
可以确定的是, batch size 绝非越大越好 。
因为 batch size 的极限是训练集样本总个数,而这是当初神经网络还未如此之火时的训练方式 Gradient Descent (GD)。
2014 年初我上的人工神经网络 (还不叫深度学习,非常旧的教学材料) 课程,老师留的作业就是用自己写个神经网络去实现 4 输入 异或门 。
中间层的 W 的梯度是纯粹用解析公式计算而得 (不是如今的计算图),激活函数是 sigmoid (不是 Relu),而且每次更新都使用所有的 16 个样本,就是单纯的去完全拟合训练集,只是为了查看神经网络拟合任意函数的能力 (这很不现实,因为如果知道所有样本,压根就不需要去学习。现实的任务,是需要从有限的训练样本中训练出可以用于预测测试数据的模型)。
下面是我当时交作业的 loss 下降图。可以看到 loss 呈阶梯式下降。当时被解读为是陷入局部最小值。22000次 (横坐标) 迭代才能够拟合 (纵坐标是 loss 大小),用全部样本作为 batch size 的 Gradient Descent (GD) 效果是很差的。
深度学习和以前的人工神经网络差在哪里了?为什么近几年突然变成各个媒体吹上天的神话?事实上深度学习的核心技术在二三十年前就有,是各个技术组合方式的才造成了今天的差异 (也因如此,刚入门的伙伴很容易因某个细节不同甚至无法收敛)。这可以从 keras, lasagne 等库包的文档分类注意到 深度学习的跃进来源于不同技术的组合 : 层 、 梯度更新方式 、 初始化方式 、 非线性 、 目标函数 、 正规项 等。(研究时也会分别去提升不同的技术细节)
现在人们分析深度学习崛起原因时人们常会说:因为大数据、GPU 的高并行计算能力、ReLU,等等,但还有一个常被忽略,简单却又意外强大的因素就是 Gradient Descent (GD) 替换成了 Stochastic Gradient Descent (SGD)。随后又有大批的弥补 朴素SGD 不足的更新算法,也就是在 梯度更新方式 这一类。可以参考这篇文章 An overview of gradient descent optimization algorithms 。
- Gradient Descent:所有样本算出的梯度的平均值来更新每一步
- Stochastic Gradient Descent:一个样本算出的梯度来更新每一步
虽然从 直觉上 ,Gradient Descent 可以快速准确的将训练集的 loss 降低到最小,但实际上很容易陷入局部最小值或鞍点 (不知道什么是鞍点的看 @夕小瑶Elsa 的 batch ) 无法继续下降,反而达不到最小。而且 GD 每一步的计算量巨大。即使是可以成功将训练集的 loss 降到最低,可我们并不关心训练集的表现,我们关心的是 测试集 的表现。训练集表现好,测试集表现差的过拟合 (overfitting) 并不是我们想要的。
Stochastic Gradient Descent 的随机性有利于跳出鞍点,又具有加强普遍性 (测试集上表现优秀) 的作用。可观看以下视频感受 SGD 如何缓解陷入局部最小值
缓解陷入局部最小值 https://www.zhihu.com/video/1031175825587978240
可惜训练耗时,同时过大的样本差异会使训练比较震荡,所以有了 Minibatch Gradient Descent 方法,同时具有二者的特点,是以 n 个样本算出的梯度的平均值来更新每一步。然而不得不苦逼的根据不同的任务去寻找最优的 n 。不过在计算机视觉中,由于 batch normalization 的帮助,可以使用极大的 batch size,这时的 batch size 往往是受限于 GPU 的显存大小。
个人经验分享
个人习惯从 batch size 以 128 为分界线。向下 (x0.5) 和向上 (x2) 训练后比较测试结果。若向下更好则再 x0.5,直到结果不再提升。
我遇到过很多情况。
比如同样的 cnn+rnn 模型结构,adam 更新法,learning rate 和其他参数全部相同。
- 例1: 遇到某个语音、画面、自然语言不同任务时,最好的 batch size 分别为 8, 32, 16。
- 例2: 遇到某个多信号语音识别任务时, batch size 为 1 最好 ,可是训练时间让人抓狂,尤其是使用循环网络时。而将这些多个信号之间做 inversion mapping 时,结果却是 batch size 设为 32 后效果依然提升,但由于 GPU 显存限制无法继续加大 batch size。
可以看出来,调参也有时间和空间的限制:
大 batch size 限于空间,小 batch size 苦于时间。
为什么 batch size 会影响训练结果
@Unstoppable 有问到“一直很难理解为什么 batch size 会影响训练结果,答主能解读一下么”。
举一个特别简化的例子。
假如要学习一个 f:x\rightarrow y 去拟合下面这样的一维数据,如下图所示。有 6 个训练样本 (编号 1,2,3,4,5,6)。
如果使用 Gradient Descent,那么每一步的更新都会向类似于黄线那种同时满足 6 个样本的 f 去贴近 (不是一步到位,而是一点点更新变形)。
如果使用 Stochastic Gradient Descent,那么每一步的更新都会向能穿过该样本点的 f 去贴近。
如果使用 3-Batch Gradient Descent,那么每一步都会向同时满足 3 个样本点的形状更新,比如 1,2,3 样本组成的 batch 会往黑色虚线的形状变化。下一步可能是向同时满足 1,5,6 的 batch 的形状去变化。
同理,若使用 2-Batch Gradient Descent,绿色虚线是例子。
打个比方。这好比素描绘画,不同的 batch 策略决定了用什么样的线条 (线段、曲线段、角度等) 去描绘 (允许覆盖已画的线条),最后画出的图形是由这些线条构成的。神经网络训练所得的 f 也是根据梯度 (类比线条) 一点点更新出来的。所以能够影响梯度的 batch size 会影响神经网络训练出的 f 。
诚然用 Gradient Descent 同时参考所有的训练样本去选择绘画线条的话,感觉上最能够画出拟合所有训练集样本的形状,但是这样会使每次绘画的线条从绘画开始到结束都是一样的 (对应神经网络陷入鞍点),仅仅是不断的描粗线条,反而容易画不出想要的形状。即便是能够成功画出,但别忘了,我们真正想要画的 形状是连同测试样本在内的 (编号 a,b) 也同时满足的 f 。
可以把神经网络的训练想象成一种特殊的绘画。绘画过程中不允许使用测试样本作为参考,只允许用 有限的 训练样本作为参考,还要求所画的形状覆盖测试样本。
Tensorflow Playground 演示
我们可以用 Tensorflow — Neural Network Playground 来实际的体验一下这种“绘画”过程。
- 下图是 batch size 30 时,拟合 300 epoch 的情况 (每个 epoch 是指遍历完所有训练集样本)。拟合很容易卡在某个形状不动。
- 下图是 batch size 1 时,拟合 150 epoch 的情况,很快的就拟合成功了。但注意 loss 曲线的下降。比 batch size 30 时,有上下波动的情况。
从 Playground 的例子中就可以看出, batch size 并非越大越好。