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是个很玄学的过程。。。

参考博客:

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

2、谈谈深度学习中的 Batch_Size

原文地址:https://www.cnblogs.com/WenaoMa/p/10041811.html

时间: 2024-08-30 15:37:59

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

模式识别之卷及网络---卷及网络 训练太慢

摘要:CIFAR-10竞赛之后,卷积网络之父Yann LeCun接受相关采访.他认为:卷积网络需要大数据和高性能计算机的支持:深层卷积网络的训练时间不是问题,运行时间才是关键.Yann LeCun还分享了他正在做的一些最新研究. Kaggle近期举办了一场 关于CIFAR-10数据集的竞赛,该数据集包含有6万个32*32的彩色图像,共分为10种类型,由 Alex Krizhevsky, Vinod Nair和 Geoffrey Hinton收集而来. 很多竞赛选手使用了卷积网络来完成这场竞赛,其

Caffe-python interface 学习|网络训练、部署、测试

继续python接口的学习.剩下还有solver.deploy文件的生成和模型的测试. 网络训练 solver文件生成 其实我觉得用python生成solver并不如直接写个配置文件,它不像net配置一样有很多重复的东西. 对于一下的solver配置文件: base_lr: 0.001 display: 782 gamma: 0.1 lr_policy: "step" max_iter: 78200 #训练样本迭代次数=max_iter/782(训练完一次全部样本的迭代数) momen

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

卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet Kaggle近期举办了一场 关于CIFAR-10数据集的竞赛,该数据集包含有6万个32*32的彩色图像,共分为10种类型,由 Alex Krizhevsky, Vinod Nair和 Geoffrey Hinton收集而来. 很多竞赛选手使用了卷积网络来完成这场竞赛,其中一些在该分类任务中靠着超乎人类能力的表现而得分.在本系列的博客中,我们将会分别采访三位选手和卷积网络之父.Facebook人工智能实验室主任

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

继续python接口的学习.剩下还有solver.deploy文件的生成和模型的測试. 网络训练 solver文件生成 事实上我认为用python生成solver并不如直接写个配置文件,它不像net配置一样有非常多反复的东西. 对于一下的solver配置文件: base_lr: 0.001 display: 782 gamma: 0.1 lr_policy: "step" max_iter: 78200 #训练样本迭代次数=max_iter/782(训练完一次所有样本的迭代数) mom

深度网络训练的一些trick

1.隐层维数要比输入大,输入几百维隐层几千维,500输入,2000隐层.(余凯) 2.发现一层一层AE训练效果并不怎么好(除第一层外其他回复原始数据较差),尝试每一层都用到标签(看余凯视频1:13:30) 来自为知笔记(Wiz)深度网络训练的一些trick,布布扣,bubuko.com

深度学习网络训练技巧汇总

转载请注明:炼丹实验室新开了一个专栏,为什么叫炼丹实验室呢,因为以后会在这个专栏里分享一些关于深度学习相关的实战心得,而深度学习很多人称它为玄学,犹如炼丹一般.不过即使是炼丹也是可以摸索出一些经验规律的,希望和各位炼丹术士一起多多交流. 训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异.这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正. 参数初始化. 下面几种方式,随便选一个,结果基本都差不多.但是一定要做

基于pycaffe的网络训练和结果分析(mnist数据集)

该工作的主要目的是为了练习运用pycaffe来进行神经网络一站式训练,并从多个角度来分析对应的结果. 目标: python的运用训练 pycaffe的接口熟悉 卷积网络(CNN)和全连接网络(DNN)的效果差异性 学会从多个角度来分析分类结果 哪些图片被分类错误并进行可视化? 为什么被分错? 每一类是否同等机会被分错? 在迭代过程中,每一类的错误几率如何变化? 是否开始被正确识别后来又被错误识别了? 测试数据集:mnist 代码:https://github.com/TiBAiL/Pycaffe

用TensorFlow搭建网络训练、验证并测试

原文连接  https://blog.csdn.net/yutingzhaomeng/article/details/81708261 本文总结tensorflow使用的相关方法,包括: 0.定义网络输入 1.如何利用tensorflow在已有网络入resnet基础上搭建自己的网络结构 2.如何添加自己的网络层 3.如何导入已有模块入resnet全连接层之前部分的参数 4.定义网络损失 5.定义优化算子以及衰减优化算子 6.预测网络输出 7.保存网络模型 8.自定义生成训练batch 9.训练网

使用CNN(convolutional neural nets)检测脸部关键点教程(二):浅层网络训练和测试

第三部分 第一个模型:一个隐层结构的传统神经网络 这一部分让我们从代码开始: # add to kfkd.py from lasagne import layers from lasagne.updates import nesterov_momentum from nolearn.lasagne import NeuralNet net1 = NeuralNet( layers=[ # three layers: one hidden layer ('input', layers.InputL