【调参】batch_size的选择

2023-05-16

直接上结论:

  1. 当有足够算力时,选取batch size为32或更小一些。
  2. 算力不够时,在效率和泛化性之间做trade-off,尽量选择更小的batch size。
  3. 前期用小batch引入噪声,有利于跳出sharp minima,后期用大batch避免震荡
  4. 当模型训练到尾声,想更精细化地提高成绩(比如论文实验/比赛到最后),有一个有用的trick,就是设置batch size为1,即做纯SGD,慢慢把error磨低。

以下是各种观点:

首先反对上面的尽可能调大batch size的说法,在现在较前沿的视角来看,这种观点无疑是有些滞后的。

关于这个问题,我们来看下深度学习三巨头之一的LeCun杨乐春同志怎么说(想看结论直接翻到最后):

Training with  large minibatches is bad for your health. More importantly, it's bad for your test error. Friends don‘t let friends use minibatches larger than 32. Let's face it: the  only people have switched to minibatch sizes larger than one since 2012 is because GPUs are inefficient for batch sizes smaller than 32. That's a terrible reason. It just means our hardware sucks.

翻译过来就是:

使用 大的batch size有害身体健康。更重要的是,它对测试集的error不利。一个真正的朋友不会让你使用大于32的batch size。直说了吧:2012年来人们开始转而使用更大batch size的原因只是我们的GPU不够强大,处理小于32的batch size时效率太低。这是个糟糕的理由,只说明了我们的硬件还很辣鸡。

那是什么使得大牛LeCun同志对大于32的batch size如此深恶痛绝而发此论呢?

细究出处可以发现这些评论是他读完Revisiting Small Batch Training for Deep Neural Networks 的感想,这篇论文对batch size(以及其他一些超参数)在深度学习中的选取做了详尽的分析并提供了实验数据。结果表明:

The best performance has been consistently obtained for mini-batch sizes between m=2 and m=32, which contrasts with recent work advocating the use of mini-batch sizes in the thousands.

也就是最好的实验表现都是在batch size处于2~32之间得到的,这和最近深度学习界论文中习惯的动辄上千的batch size选取有很大的出入。

其实回想我们使用mini-batch技术的原因,无外乎是因为mini-batch有这几个好处 :

  • 提高了运行效率,相比batch-GD的每个epoch只更新一次参数,使用mini-batch可以在一个epoch中多次更新参数,加速收敛。
  • 解决了某些任务中,训练集过大,无法一次性读入内存的问题。
  • 虽然第一点是mini-batch提出的最初始的原因,但是后来人们发现,使用mini-batch还有个好处,即每次更新时由于没有使用全量数据而仅仅使用batch内数据,从而人为给训练带来了噪声,而这个操作却往往能够带领算法走出局部最优(鞍点)。理论证明参见COLT的这篇论文Escaping From Saddle Points-Online Stochastic Gradient for Tensor Decomposition。也就是说,曾经我们使用mini-batch主要是为了加快收敛和节省内存,同时也带来每次更新有些“不准”的副作用,但是现在的观点来看,这些“副作用”反而对我们的训练有着更多的增益,也变成mini-batch技术最主要的优点。(有点像伟哥西地那非,最早是被发明出来治疗心血管疾病的,但是发现其副作用是容易使人勃起,最后反而是用来助勃,而不是用来治疗心血管了)

综上所述,我们选取batch size时不妨这样操作:

  1. 当有足够算力时,选取batch size为32或更小一些。
  2. 算力不够时,在效率和泛化性之间做trade-off,尽量选择更小的batch size。
  3. 当模型训练到尾声,想更精细化地提高成绩(比如论文实验/比赛到最后),有一个有用的trick,就是设置batch size为1,即做纯SGD,慢慢把error磨低。

参考文献:

[1] Dominic Masters, Carlo Luschi,Revisiting Small Batch Training for Deep Neural Networks, arXiv:1804.07612v1

[2] Ge, R., Huang, F., Jin, C., & Yuan, Y. (2015, June). Escaping From Saddle Points-Online Stochastic Gradient for Tensor Decomposition. In COLT (pp. 797-842).

[3] Bottou, L. (2010). Large-scale machine learning with stochastic gradient descent. In Proceedings of COMPSTAT'2010 (pp. 177-186). Physica-Verlag HD.

作者:Matt
链接:https://www.zhihu.com/question/61607442/answer/192204021
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

batch size 不是永远越大越好。

更大的 batch size 更能准确地计算出梯度,mini-batch 只是用更少的计算来近似梯度。直觉上好像更大的 batch 更好因为更“准确”。

实践结果比较反直觉,因为深度模型的代价函数非常不平整,完整的梯度也只能往局部极小值跑,所以大 batch size 带来的准确的梯度可能也没什么用。反而有时候小 batch size 带来的噪声可以更快的找到不错的极小值。

但是,更大的 batch size 在并行计算上更占优势,太小的 batch-size 发挥不了 gpu 的性能。所以当我们觉得 batch 要更大,主要是为了更好的并行,而不是为了更精确的梯度。

在深度学习里好像追求精确意义不大,比如更高精度的浮点数并没有什么帮助,还不如减小精度来换取计算速度。比如调参时 ramdom search 居然不比 grid search 表现差,非常反直觉。

补充:

@dengdan在评论里指出,小batch训练的稳定性较差。小batch确实有这个缺点,而且对设置学习速率有更高的要求,否则可能引起恶性的震荡无法收敛。但是小batch的优点仍然是显著的,DL书里建议使用逐步增加的batch size来兼并两者的优点。

作者:浣熊先生
链接:https://www.zhihu.com/question/61607442/answer/311502182
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

Batch size可能也不是越大越好,ICLR 2017 On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima 比较了一直用small batch(实验设置的256,貌似也不小了...)和一直用large batch(整个数据集十分之一...)训练,最后发现同样训练到最终收敛,在多个数据集上large batch比small batch泛化能力差。

前期用小batch引入噪声,有利于跳出sharp minima,后期用大batch避免震荡,同样目的也可以通过调小lrate做到,同比例地增大batch size和同比例地减小lrate能得到极相近的loss-epoch曲线,不过前者update次数会少很多~(Don't Decay the Learning Rate, Increase the Batch Size)

然鹅,我怎么知道训练到什么时候该调大batch size,调大多少呢... 后来发现有研究自适应调节batch size的文章Small Batch or Large Batch?,实验表明大致趋势还是先小batch后面自己变大,是不是就不用在batch size这个超参上炼金了呢....

大batch size相当于小lr,反之亦然。可以根据收敛速度进行一定选择。
另外如果用了batchnorm,batch size别太小(大于64?)

如果不用batchnorm,可以考虑用小batch size甚至1 来得到最优的结果。具体看deep learning那本书的相关段落(见下图第一段),我自己做的实验也可以验证。



作者:Lin Sun
链接:https://www.zhihu.com/question/61607442/answer/204675996
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【调参】batch_size的选择 的相关文章

  • View 的 getWidth() 和 getHeight() 返回 0

    我看过类似的问题并尝试了他们的解决方案 但它对我不起作用 我正在尝试阅读width of an imageView 但它正在返回0 这是代码 public class MainActivity extends Activity privat
  • favicon.ico 文件大小 == 60KB?

    今天为了多浪费一些时间 我将一个 jpg文件转换为 ico并放在favicon ico中 jpg 大小小于 1KB ico 文件是 60KB 比我放置它的 html 页面大 我使用了在线转换器 http www coolutils com
  • 在 C++ 中打包嵌套结构

    使用 Visual Studio 2017 以下给出 struct AAA 15 bytes double d short s char a1 char a2 char a3 char s4 char s5 struct BBB AAA d
  • 使用不同搜索空间大小的不同 lucene 搜索结果

    我有一个使用 lucene 进行搜索的应用程序 搜索空间有数千个 在这数千个搜索中 我只得到了一些结果 大约 20 个 这是正常的并且是预期的 然而 当我将搜索空间减少到只有那 20 个条目时 即我只对这 20 个条目建立索引并忽略其他所有
  • Android 相机 - 预览尺寸、图片尺寸、裁剪和扭曲

    我的应用程序需要以纵向模式捕获一些给定尺寸 比如说宽x高 的图片 一般情况下 相机不支持我想要的尺寸 宽x高 因此我需要裁剪拍摄的图片以符合我的规格 这个看似简单的程序让我对预览和图片尺寸和格式之间 良好 对应的问题感到疯狂 让我解释 我需
  • 如何获取

    我有一个FlowPanel 其高度是固定的 实际上是其父级高度的百分比 该高度是固定的 在此面板中 我添加了几个div元素 使用 CSS 我将其高度设置为其父级的 100 我想要做的是使用 javascript 将其宽度设置为等于其高度 我
  • HTML5 视频控件 - 放大吗?

    我知道您可以自定义视频控件来制作自己的按钮 布局 但是有什么方法可以使默认控件更大 不是以跨浏览器的方式 但控件是用影子 DOM http www html5rocks com en tutorials webcomponents shad
  • 如何获取设备的总 RAM 大小?

    我想获得设备的完整 RAM 大小 memoryInfo getTotalPss 返回 0 中没有获取总 RAM 大小的函数ActivityManager MemoryInfo http developer android com refer
  • Android 多屏限定符定义

    我想创建一个与大量设备和屏幕兼容的布局 我一直在研究 发现最常见的屏幕分辨率是 249x320 480x800 600x1024 720x1280 以及与这些成比例的其他一些屏幕 好吧 阅读文档后我发现有两种方法可以做到这一点 到 3 2
  • Firebird BLR 是否包含相关字段大小?

    Firebird 和 InterBase 以 BLR 标记化 格式保存存储过程和触发器的编译形式 但我不太了解BLR的结构 字段大小是 BLR 的一部分吗 当存储过程包含两个字段 源和目标 并且稍后我将更改这两个字段的大小时 我会遇到一些问
  • Xamarin.Forms 中主从页面的母版页有多宽?

    根据屏幕尺寸 和设备习惯 母版页的宽度会有所不同 在手机上 它约为屏幕宽度的 80 而在平板电脑上 它似乎是一个恒定尺寸 如 320 dp 有人知道这个值的一般公式吗 我想用它在施工期间布置一些元素 当Width属性尚未设置 Edit I
  • 如何找出网页浏览者每英寸的像素数?

    谁能想到一种方法来发现用户的每英寸像素数 我想确保图像显示在网络浏览器中exactly我需要它的大小 因此使用分辨率 我可以从用户代理获得 和每英寸像素的组合我可以做到这一点 但是 我不确定是否有任何方法可以发现用户的每英寸像素数 最好使用
  • 我只是“移动”图像,它的元数据就会改变......

    我只是复制了图像并将其保存到当前目录中的另一个临时文件夹中 没有任何修改 但图像占用了更多 磁盘空间 比它 字节大小 和 当我这样做时 我只丢失了大部分图像的元数据 例如位置数据 设备型号 F 号等Color space Alpha cha
  • 散点图标记大小与轴值成正比 - 为什么对于方面=“等于”,x 轴和 y 轴的像素数不同?

    据我所知 我的问题与这个帖子 https stackoverflow com questions 16896244 matplotlib scatter plot symbol size based on pixel distance 我需
  • FFT 的窗口大小与数据长度

    我正在尝试对流音频数据进行快速频谱分析以捕获元音 类似于 JLip sync 使用 PyAudio 在短时间内 0 0625 秒 捕获小块 1024 的语音数据 使用 numpy fft 进行分析 并使用 numpy hanning 窗口消
  • 我想从互联网路径的 videoview 获取视频大小(以 MB 为单位)

    我试图在开始视频之前获取视频文件大小并将其显示在布局中 我已经尝试了很多东西 但它不起作用 video player view VideoView findViewById R id videoView2 media Controller
  • 如何使用 Swift 从资源中加载特定图像[重复]

    这个问题在这里已经有答案了 我是 Swift 新手 我想从资源中加载特殊图像 例如我有 image 1 for iphone 4s email protected cdn cgi l email protection image 2 for
  • 为什么空切片有 24 个字节?

    我想了解创建空切片时会发生什么make int 0 我执行此代码进行测试 emptySlice make int 0 fmt Println len emptySlice fmt Println cap emptySlice fmt Pri
  • 如何设置按钮的大小?

    我将按钮放在带有 GridLayout 的 JPane 中 然后我用 BoxLayout Y AXIS 将 JPanel 放入另一个 JPanel 中 我希望 GridLayout 中的按钮是方形的 我使用 tmp setSize 30 3
  • 如何在html中设置按钮的文本大小

    您好 我想在我的网站上有一个按钮 并且我想调整按钮上的文本大小 我该怎么做呢 我的代码如下

随机推荐