batch size与lr的关系, batch_size是否越大越好?

另外看一下参考链接:训练神经网络时如何确定batch的大小?

当初随机梯度下降法和mini_batch梯度下降法的面世,是为了优化批量梯度下降法计算效率缓慢且对gpu显存要求较高的问题。那么,在显存容量支持的前提下,是否batch_size越大越好呢?

原文:

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有这几个好处 :

1、提高了运行效率,相比batch-GD的每个epoch只更新一次参数,使用mini-batch可以在一个epoch中多次更新参数,加速收敛。解决了某些任务中,训练集过大,无法一次性读入内存的问题。

2、虽然第一点是mini-batch提出的最初始的原因,但是后来人们发现,较大的batch_size容易使模型收敛在局部最优点,而使用mini-batch,甚至单个数据训练时,相当于人为给训练加入了噪声,使模型走出局部最优(鞍点),从而在更大的范围内寻找收敛点。 理论证明参见COLT的这篇论文Escaping From Saddle Points-Online Stochastic Gradient for Tensor Decomposition。也就是说,曾经我们使用mini-batch主要是为了加快收敛和节省内存,同时也带来每次更新有些“不准”的副作用,但是现在的观点来看,这些“副作用”反而对我们的训练有着更多的增益,也变成mini-batch技术最主要的优点。(有点像伟哥西地那非,最早是被发明出来治疗心血管疾病的,但是发现其副作用是容易使人勃起,最后反而是用来助勃,而不是用来治疗心血管了)

从Batch Normalization 角度分析:

当batch size较小时(比如2、4这样),该batch数据的均值和方差的代表性较差,因此对最后的结果影响也较大。随着batch size越来越小,BN层所计算的统计信息的可靠性越来越差,这样就容易导致最后错误率的上升;而在batch size较大时则没有明显的差别。虽然在分类算法中一般的GPU显存都能cover住较大的batch设置,但是在目标检测、分割以及视频相关的算法中,由于输入图像较大、维度多样以及算法本身原因等,batch size一般都设置比较小
 

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

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

本文参考链接:怎么选取训练神经网络时的Batch size?

batch size与lr的关系

如何理解深度学习中分布式训练中large batch size与learning rate的关系 - Le1B_o - 博客园

如何理解深度学习分布式训练中的large batch size与learning rate的关系? - 知乎

  • 14
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值