最近在跑一些网络时发现,训练完的网络在测试集上的效果总是会受Batch_Size 大小的影响。这种现象跟以往自己所想象的有些出入,于是出于好奇,各种搜博客,大致得出了自己想要的答案,现写一篇博客记录一下。

在训练过程中,一般有三种方式来从数据集中抽取数据,更新参数。一种是取所有的样本算出梯度(Full Batch Learning),另一种是每次迭代只取一个样本进行更新,也即在线学习(Online Learning),取Batch_Size = 1,还有一种是批梯度下降法(Mini-batches Learning)。对于取全数据集的方式来说,其确定的梯度下降方式代表样本总体,因此能最准确地朝着极值方向更新。但由于深度学习常用的数据集往往是海量的,所以采用全数据集下降的方式通常难以实现。而在线学习的方式则是每次训练只取一个样本,这样的训练方式往往会导致梯度更新的方向不那么准确。而批梯度下降就是前面所述两种方法的折中的方式,即每次迭代取一部分样本进行更新。我们下面讨论的就是使用批梯度下降方法设置Batch_size的情况。

那么Batch_Size究竟取多少最好呢?首先来说说Batch_Size对收敛速度的影响。一般来说,增大Batch_Size,所带来的训练时的标准差并不是线性增长的,比如训练一个样本的标准差为σ,那么取Batch_Size=n所带来的标准差为σ/√n,而非σ/n。因此,如果采用多个训练样本来算梯度的话,其计算量是线性增长的,但标准差并不能线性降低。所以Batch_Size越大,其收敛所需的迭代次数会减少,但每次迭代的计算时间也会增多,总体来看的话,耗费的总时间反而比使用少量样本来训练要多。但是,由于我们跑网络的时候可以用GPU并行计算,所以在一定范围内增大Batch_size,跑一次iteration的时间其实是差不多的,因此适当增加Batch_size大小,能让网络更快收敛。

但是也不是说Batch_size越大越好,我们知道网络最终收敛的时候并不总是在绝对最小值区域,很多时候是陷入了局部最小值,特别是我们常说的“鞍部”。这时候,如果Batch_size调得较小的话,其每次迭代下降的方向并不是最准确的,loss是在小范围内震荡下降的,这反而有利于跳出局部最小值,从而寻找下一个loss更低的区域。还有一种说法,何凯明大神的论文Rethinking ImageNet pre-training也提到过,如果你的网络中使用了BN层的话,而BN层的计算在batch size较小时受batch size参数影响较大,batch size越小,参数的统计信息越不可靠,也会影响最终的效果。因此调小Batch_size可以有效防止陷入局部最小值,但是由于BN层的存在也会影响最终的效果,同时Batch_size调得过小也容易导致网络不收敛。所以在实际跑代码的过程中你就会发现,对于某些任务比如图像分割,调Batch_size是个很玄学的过程。。。

参考博客:

1、训练神经网络时如何确定batch的大小?

2、谈谈深度学习中的 Batch_Size

Batch_Size对网络训练结果的影响的更多相关文章

  1. 图像分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)

    论文:<Fully Convolutional Networks for Semantic Segmentation> 代码:FCN的Caffe 实现 数据集:PascalVOC 一 数据 ...

  2. Pytorch半精度浮点型网络训练问题

    用Pytorch1.0进行半精度浮点型网络训练需要注意下问题: 1.网络要在GPU上跑,模型和输入样本数据都要cuda().half() 2.模型参数转换为half型,不必索引到每层,直接model. ...

  3. 卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet

    原文连接:http://blog.kaggle.com/2014/12/22/convolutional-nets-and-cifar-10-an-interview-with-yan-lecun/ ...

  4. 如何绘制caffe网络训练曲线

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51774966 当我们设计好网络结构后, ...

  5. Caffe-python interface 学习|网络训练、部署、測试

    继续python接口的学习.剩下还有solver.deploy文件的生成和模型的測试. 网络训练 solver文件生成 事实上我认为用python生成solver并不如直接写个配置文件,它不像net配 ...

  6. Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练

    对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...

  7. Wide & Deep的OneFlow网络训练

    Wide & Deep的OneFlow网络训练 HugeCTR是英伟达提供的一种高效的GPU框架,专为点击率(CTR)估计训练而设计. OneFlow对标HugeCTR搭建了Wide & ...

  8. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...

  9. 小白也能弄得懂的目标检测YOLO系列之YOLOv1网络训练

    上期给大家介绍了YOLO模型的检测系统和具体实现,YOLO是如何进行目标定位和目标分类的,这期主要给大家介绍YOLO是如何进行网络训练的,话不多说,马上开始! 前言: 输入图片首先被分成S*S个网格c ...

随机推荐

  1. [原创] debian 9.3 搭建seafile企业私有网盘

    [原创] debian 9.3 搭建seafile企业私有网盘 需求是这样的, 个人疲惫于 "成为大伙的文件中转站" ,公司不管大大小小的文件,都要打电话过来“转个xx文件”.“帮 ...

  2. Build Tool/Maven, Gradle

    一.Build Tool 1.什么是Build Tool build tool是可以自动由源代码创建可执行的应用程序的程序. Building 包括编译.链接和打包代码成一个可用的或可执行形式. 在小 ...

  3. [剑指Offer]60-n个骰子的点数

    题意 输入骰子个数n,打印出所有骰子朝上的点的点数之和,及对应的概率. 题解 循环. n个骰子,点数之和在n~6n范围内.计算n个骰子扔出和为m的情况数,等于n-1个骰子扔出m-1,m-2...m-6 ...

  4. python note 13 内置函数

    1. lst = ["白蛇传","骷髅叹","庄周闲游"] it = lst.__iter__() print(it.__next__()) ...

  5. 【转载】【吵架】能力 说清自己的能力。表达清楚 ;别人发飙你也要撕b;换位思考,把自己当领导层

    女上司和别人在会议室吵架,大家都说她变态.女人能当好领导吗?  治敏@为好优 2018-06-20 19:56:00 为好优姐姐: 想问问您,是不是职场女强人,都是那种彪悍的战斗机呀! 我刚来公司实习 ...

  6. django后台对某些字段设置颜色

    在model.py的class函数中添加如下代码 #对签收状态设置颜色 def color_state(self): ': assign_state_name = '待签收' color_code = ...

  7. Asp.net core 向Consul 注册服务

    Consul服务发现的使用方法:1. 在每台电脑上都以Client Mode的方式运行一个Consul代理, 这个代理只负责与Consul Cluster高效地交换最新注册信息(不参与Leader的选 ...

  8. vue中具名插槽的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Which Queue Pair type to use?

    Which Queue Pair type to use? Contents [hide] 1 Reliable Connected (RC) QP 2 Unreliable Connected (U ...

  10. 探究osg中的程序设计模式【目录】

    前序 探究osg中的程序设计模式---开篇 探究osg中的程序设计模式---创造性模式 探究osg中的程序设计模式---创造型模式---Factory(工厂)模式 探究osg中的程序设计模式---创造 ...