链接:https://www.zhihu.com/question/61607442/answer/440944387

首先反对上面的尽可能调大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

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[调参]batch_size的选择的更多相关文章

  1. Xgboost调参总结

    一.参数速查 参数分为三类: 通用参数:宏观函数控制. Booster参数:控制每一步的booster(tree/regression). 学习目标参数:控制训练目标的表现. 二.回归 from xg ...

  2. Auto ML自动调参

    Auto ML自动调参 本文介绍Auto ML自动调参的算法介绍及操作流程. 操作步骤 登录PAI控制台. 单击左侧导航栏的实验并选择某个实验. 本文以雾霾天气预测实验为例. 在实验画布区,单击左上角 ...

  3. Spark 模型选择和调参

    Spark - ML Tuning 官方文档:https://spark.apache.org/docs/2.2.0/ml-tuning.html 这一章节主要讲述如何通过使用MLlib的工具来调试模 ...

  4. adam调参

    微调 #阿尔法 "learning_rate": 3e-5, #学习率衰减 "weight_decay": 0.1,// "weight_decay& ...

  5. scikit-learn随机森林调参小结

    在Bagging与随机森林算法原理小结中,我们对随机森林(Random Forest, 以下简称RF)的原理做了总结.本文就从实践的角度对RF做一个总结.重点讲述scikit-learn中RF的调参注 ...

  6. scikit-learn 梯度提升树(GBDT)调参小结

    在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn ...

  7. word2vec参数调整 及lda调参

     一.word2vec调参   ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -neg ...

  8. 基于pytorch的CNN、LSTM神经网络模型调参小结

    (Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...

  9. 漫谈PID——实现与调参

    闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...

随机推荐

  1. struts2的s:iterator 标签 详解<转>

    struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo: s:iterator 标签有3个属性:     value:被迭代的集合     id   : ...

  2. Express框架(http服务器 + 路由)

    index.js 使用express框架搭建http服务器,和实现路由功能. var express = require('express'); var app = express(); // 主页输 ...

  3. Mysql group_concat函数列转行,与行转列

    例一: SELECT num from user 1.使用group_concat函数得到列转行 select group_concat(num) from user 2.使用SUBSTRING_IN ...

  4. DGbroker故障切换示例

    1.主库故障 SQL> startup ORACLE instance started. Total System Global Area bytes Fixed Size bytes Vari ...

  5. html5新属性contenteditable 对于那些不可编辑的标签,现在都可以编辑了

    contenteditable = true 表示该html标签的内容可以编辑,对于那些不可编辑的标签,现在都可以编辑了.

  6. <select>里动态添加option

    因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接有时候会失效,所以 ...

  7. ZOJ 3212 K-Nice

    K-Nice Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge This is a super simple pr ...

  8. XPipe 解决什么问题

    x-pipe/README.md at master · ctripcorp/x-pipe https://github.com/ctripcorp/x-pipe/blob/master/README ...

  9. Web开发者应知的URL编码知识(转)

    原文出处: lunatech   译文出处:oschina - 桔子, lwei, 史涛, Khiyuan, super0555, LinuxQueen, 抛出异常的爱 本文首先阐述了人们关于统一资源 ...

  10. C#基础整理(一)

    1.什么是.net? .net有.net平台和.Net Framework框架. .net平台是包含.net framework框架. framework框架提供稳定的运行环境来保证基于.Net平台开 ...