[调参]batch_size的选择
链接: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时不妨这样操作:
- 当有足够算力时,选取batch size为32或更小一些。
- 算力不够时,在效率和泛化性之间做trade-off,尽量选择更小的batch size。
- 当模型训练到尾声,想更精细化地提高成绩(比如论文实验/比赛到最后),有一个有用的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的选择的更多相关文章
- Xgboost调参总结
一.参数速查 参数分为三类: 通用参数:宏观函数控制. Booster参数:控制每一步的booster(tree/regression). 学习目标参数:控制训练目标的表现. 二.回归 from xg ...
- Auto ML自动调参
Auto ML自动调参 本文介绍Auto ML自动调参的算法介绍及操作流程. 操作步骤 登录PAI控制台. 单击左侧导航栏的实验并选择某个实验. 本文以雾霾天气预测实验为例. 在实验画布区,单击左上角 ...
- Spark 模型选择和调参
Spark - ML Tuning 官方文档:https://spark.apache.org/docs/2.2.0/ml-tuning.html 这一章节主要讲述如何通过使用MLlib的工具来调试模 ...
- adam调参
微调 #阿尔法 "learning_rate": 3e-5, #学习率衰减 "weight_decay": 0.1,// "weight_decay& ...
- scikit-learn随机森林调参小结
在Bagging与随机森林算法原理小结中,我们对随机森林(Random Forest, 以下简称RF)的原理做了总结.本文就从实践的角度对RF做一个总结.重点讲述scikit-learn中RF的调参注 ...
- scikit-learn 梯度提升树(GBDT)调参小结
在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn ...
- word2vec参数调整 及lda调参
一.word2vec调参 ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -neg ...
- 基于pytorch的CNN、LSTM神经网络模型调参小结
(Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...
- 漫谈PID——实现与调参
闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...
随机推荐
- Excel 2010 如何在Excel的单元格中加入下拉选项
http://jingyan.baidu.com/article/03b2f78c4ba8a05ea237ae95.html 第一步:打开excel文档,选中需加入下拉选项的单元格. 第二步:点击 ...
- DNS隧道通信的检测
DNS隧道通信的检测 DNS 隧道通信 DNS 隧道通信是C&C常用的通信方式,一般常用的编码方式Base64,Binary编码,NetBios编码等,Hex编码等.且请求的Type一般都是t ...
- 【黑金ZYNQ7000系列原创视频教程】04.熟悉ZYNQ内部中断——内部定时器中断实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36638&extra=page%3D1 爱奇艺地址: http: ...
- 【BZOJ4429】[Nwerc2015] Elementary Math小学数学 最大流
[BZOJ4429][Nwerc2015] Elementary Math小学数学 Description Ellen给她的学生教小学数学.期末考试已经来临了.考试有n个题目,每一个题目学生们都要对一 ...
- 微信小程序 --- 模板的使用
由于微信小程序文件大小的限制,可以把一些公用的文件 单离出来形成模板,从而被各个模板引用: 定义模板第一种方式: 新建一个目录: 写入: <text>hello world</tex ...
- Linux环境下安装Redis并完成测试(已验证)
准备工作: 本人测试环境:Win7 xshell远程登录Linux Linux: ubuntu 软件包:redis-3..2.6.tar.gz (Linux下redis安装包) =========== ...
- input输入框制定输入数据类型匹配
<input type="text" id="price_169" value="97" style="max-width: ...
- js判断移动端和PC端跳转不同页面
方法一: /* * * 判断PC端与WAP端 */ var mobile_bs = { versions: function() { var u = navigator.userAgent; retu ...
- 字符串函数---atof()函数详解
atof()函数 atof(),是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>.该函数名是 “ascii to floating ...
- # 释放内存 filter_res_q_l = filter_res_q_l[-2048:] filter_res_a_l = filter_res_a_l[-2048:]
# 释放内存filter_res_q_l = filter_res_q_l[-2048:]filter_res_a_l = filter_res_a_l[-2048:]