[调参]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时不妨这样操作:

  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那本书的相关段落(见下图第一段),我自己做的实验也可以验证。

[调参]batch_size的选择

作者:Lin Sun

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

来源:知乎

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

上一篇:ThinkPHP3.2判断手机端访问并设置默认访问模块的方法


下一篇:TP3.2.x判断手机端访问并设置默认访问模块的方法 - ThinkPHP框架