Batch_Size对网络训练结果的影响
最近在跑一些网络时发现,训练完的网络在测试集上的效果总是会受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是个很玄学的过程。。。
参考博客:
Batch_Size对网络训练结果的影响的更多相关文章
- 图像分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)
论文:<Fully Convolutional Networks for Semantic Segmentation> 代码:FCN的Caffe 实现 数据集:PascalVOC 一 数据 ...
- Pytorch半精度浮点型网络训练问题
用Pytorch1.0进行半精度浮点型网络训练需要注意下问题: 1.网络要在GPU上跑,模型和输入样本数据都要cuda().half() 2.模型参数转换为half型,不必索引到每层,直接model. ...
- 卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet
原文连接:http://blog.kaggle.com/2014/12/22/convolutional-nets-and-cifar-10-an-interview-with-yan-lecun/ ...
- 如何绘制caffe网络训练曲线
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51774966 当我们设计好网络结构后, ...
- Caffe-python interface 学习|网络训练、部署、測试
继续python接口的学习.剩下还有solver.deploy文件的生成和模型的測试. 网络训练 solver文件生成 事实上我认为用python生成solver并不如直接写个配置文件,它不像net配 ...
- Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练
对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...
- Wide & Deep的OneFlow网络训练
Wide & Deep的OneFlow网络训练 HugeCTR是英伟达提供的一种高效的GPU框架,专为点击率(CTR)估计训练而设计. OneFlow对标HugeCTR搭建了Wide & ...
- MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...
- 小白也能弄得懂的目标检测YOLO系列之YOLOv1网络训练
上期给大家介绍了YOLO模型的检测系统和具体实现,YOLO是如何进行目标定位和目标分类的,这期主要给大家介绍YOLO是如何进行网络训练的,话不多说,马上开始! 前言: 输入图片首先被分成S*S个网格c ...
随机推荐
- yum管理工具
yum:也是一个rpm包的管理工具,可以实现自动解决rpm包的依赖关系(自动安装依赖顺序进行rpm包的安装) 为何rpm包会有依赖关系? 制作rpm的人,在制作rpm包的时候,就将这个rpm的所依赖的 ...
- 将ipad作为电脑拓展屏或分屏的简单方法
用Ipad实现电脑分屏的方法是挺简单的,但鉴于部分小白找不到合适的门路,在此重新分享一下. 需要的装备: ipad 电脑 数据连接线 方法:某宝上搜索 duet display ,只需1元左 ...
- eclipse invalid zip archive lib
eclipse invalid zip archive lib 修改.class文件的编译内容.删除license或找到相应的jar包,放到lib下面,重新编译.
- Java Enum 枚举类的values方法
Enum类和enum关键字定义的类型都有values方法,但是点进去会发现找不到这个方法.这是因为java编译器在编译这个类(enum关键字定义的类默认继承java.lang.Enum)的时候 自动插 ...
- leetcode 动态规划类型题
1,Triangle int mininumTotal(vector<vector<int>>& triangle) { ; i >= ; --i) { ; j ...
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
- docker简单搭建gitlab
docker启动非常简单: docker run --detach --hostname 192.168.0.33 --publish 443:443 --publish 80:80 \ --publ ...
- Ubuntu 16.04 上安装 PCL 1.8.0
Ubuntu16.04之后安装pcl可以直接apt-get sudo apt-get install libpcl-dev pcl-tools 安装之前,准备一些依赖库 sudo apt-get up ...
- 刷题的model格式(请用英文)
[抄题]: [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: [英文数据结构或算法,为什么不用别的数据 ...
- python字符串的魔法
*首字母大写test="aslf"v=test.capitalize()print(v) *所有字母变成小写test="QWFDE"v=test.casefol ...