怎么选取训练神经网络时的Batch size?

您所在的位置:网站首页 数据集越大越好吗 怎么选取训练神经网络时的Batch size?

怎么选取训练神经网络时的Batch size?

2023-04-19 16:21| 来源: 网络整理| 查看: 265

目录batch size 需要调参个人经验分享为什么 batch size 会影响训练结果Tensorflow Playground 演示batch size 需要调参

可以确定的是,batch size 绝非越大越好

因为 batch size 的极限是训练集样本总个数,而这是当初神经网络还未如此之火时的训练方式 Gradient Descent (GD)。

2014 年初我上的人工神经网络 (还不叫深度学习,非常旧的教学材料) 课程,老师留的作业就是用自己写个神经网络去实现 4 输入异或门。

3 输入异或门

中间层的 W 的梯度是纯粹用解析公式计算而得 (不是如今的计算图),激活函数是 sigmoid (不是 Relu),而且每次更新都使用所有的 16 个样本,就是单纯的去完全拟合训练集,只是为了查看神经网络拟合任意函数的能力 (这很不现实,因为如果知道所有样本,压根就不需要去学习。现实的任务,是需要从有限的训练样本中训练出可以用于预测测试数据的模型)。

下面是我当时交作业的 loss 下降图。可以看到 loss 呈阶梯式下降。当时被解读为是陷入局部最小值。22000次 (横坐标) 迭代才能够拟合 (纵坐标是 loss 大小),用全部样本作为 batch size 的 Gradient Descent (GD) 效果是很差的。

深度学习和以前的人工神经网络差在哪里了?为什么近几年突然变成各个媒体吹上天的神话?事实上深度学习的核心技术在二三十年前就有,是各个技术组合方式的才造成了今天的差异 (也因如此,刚入门的伙伴很容易因某个细节不同甚至无法收敛)。这可以从 keras, lasagne 等库包的文档分类注意到深度学习的跃进来源于不同技术的组合梯度更新方式初始化方式非线性目标函数正规项等。(研究时也会分别去提升不同的技术细节)

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 30 的拟合下图是 batch size 1 时,拟合 150 epoch 的情况,很快的就拟合成功了。但注意 loss 曲线的下降。比 batch size 30 时,有上下波动的情况。batch size 1 的拟合

从 Playground 的例子中就可以看出, batch size 并非越大越好。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3