模型训练中batch_size的选择

总结:训练过程中,batch_size的选取对模型精度和模型泛化能力的影响:

  1. batch_size过大,模型没有BN层,模型收敛速度变慢。而且模型容易陷入局部最小值,模型精度低。
  2. batch_size适中,模型没有BN层,模型收敛速度很快,模型不容易陷入局部最小值,而且模型精度很高。
  3. batch_size过小,比如说小于数据集中的类别个数,模型没有BN层,模型会出现不收敛的情况。
  4. batch_size适中,模型的泛化能力会得到提升。
  5. 在GPU性能没有被完全利用的情况下,batch_size越大,模型训练的速度越快。

总结:如何确定batch_size

  1. 根据数据集的大小和样本数目确定batch_size。
    样本类别数目较少,而且模型没有BN层,batch_size就设置得较小一点。
    样本类别数目较多,而且模型没有BN层,batch_size就设置得较大一点。尽量保证一个batch里面各个类别都能取到样本。
    数据集很小的时候,可以采取Full Batch Learning。每次用所有的训练集进行训练。
  2. batch_size的大小设置为8的倍数。
  3. 有BN层的模型,而且数据集也很大,类别也较多时,batch_size尽量越大越好。

https://www.zhihu.com/question/32673260

卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet:
CSDN翻译链接:https://www.csdn.net/article/2015-01-16/2823579
kaggle英文链接:http://blog.kaggle.com/2014/12/22/convolutional-nets-and-cifar-10-an-interview-with-yan-lecun/
总结一下:

  1. 日本学者 Kunihiko Fukushima 提出的神经认知机(NeoCognitron)对CNN的发展有着启迪性的意义,其提到模式识别机制的自组织神经网络模型不受位置变化的影响。
  2. 在一个实际的应用中,没人关心训练到底要花多长时间,人们只关心运行需要多久。最终的核心机器是那些执行“美化模版匹配”的浅层网络。
  3. idea:光谱卷积网络,这是在ICLR 2014上我在纽约大学实验室的同侪发布的一篇论文,课题是广义化的卷积网络可以适用于任意图像(规则的卷积网络可以适用于1D,2D或3D数组,按图像可以被看成规则网格)的确还存在一些实际的问题,但是它开启了一扇大门,让我们看到了通往卷积网络非结构化数据的更多应用方向。《光谱网络与图形方面的深度本地连接网络》
  4. CIFAR-10现在的错误率最好为4.47%,人类的错误率为6%,当时的LeCun就说,相比CIFAR-10现下人们对于 ImageNet (图像识别目前最大的数据库)更感兴趣。(补一句:我自己用VGG在cifar10数据集上finetune,最好的精度在90%,待更新)
  5. 对于深层学习网络真的需要那么深么这个问题?LeCun认为,尝试通过浅层网络训练来模拟在ImageNet上训练过的深层卷积网络,你会发现,理论上深层学习网络可以与浅层的相接近,但是在复杂的任务上,浅层网络相距甚远。(我也人为,对于简单的任务来说,网络的深度没必要那么深,但是,对于复杂的任务来说,深度是必须要的,实际应用中,对于简单的任务,可以通过模型蒸馏等一些方法来使得浅层的网络和深层网络有同样的精度)
  6. 深层神经网络损失函数的收敛性证明(或保证),就有一点复杂了。多层网的损失函数不是凸值,因此简易证明该函数为凸不可行。但是我们都知道实际上卷积网络几乎总是会收敛到同一水平,无论起点是什么(如果初始化完成正确)。有理论证明,有许许多多等效局部最小值,还有一个数字很小的“坏”局部最小值。因此收敛性并不会造成问题。

深度机器学习中的batch的大小对学习效果有何影响?
知乎链接:https://www.zhihu.com/question/32673260

每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

凸函数是一个定义在某个向量空间的凸子集C(区间)上的实值函数f,而且对于凸子集C中任意两个向量, f((x1+x2)/2)>=(f(x1)+f(x2))/2,则f(x)是定义在凸子集c中的凸函数(该定义与凸规划中凸函数的定义是一致的,下凸)。凹函数则定义相反。

关于batch_size的选取,ICLR 2017有一片文章可以借鉴:On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima
主要思想就是:太大的batch size 容易陷入sharp minima,泛化性不好。

关于网络的收敛:
http://blog.kaggle.com/2014/12/22/convolutional-nets-and-cifar-10-an-interview-with-yan-lecun/

问:在您看来,一个运作良好且不受“为什么它会运作良好”这一理论原因影响的卷积网络是什么样的?通常您是否偏好执行更甚于理论?如何平衡?

Lecun答:我不觉得执行与理论之间需要抉择,如果能执行,就会有相关可解释的理论。

另外,你谈及的是什么样的理论?是说泛化界限吗( generalization bound )?卷积网络有着限定的VC维(VC Dimension),因此两者一致并有着典型的VC维。你还想要什么?是像SVM中那样更严格的界限吗?就我所知,没有一个理论的界限会足够严格,可以适用实际需求,所以我的确不太明白这个问题。当然,普通的VC维不够严格,但是非泛型范围(像SVMs)只会稍微欠缺一点严格性。

如果你希望的是收敛性证明(或保证),就有一点复杂了。多层网络的损失函数不是凸值,因此简易证明该函数为凸不可行。但是我们都知道实际上卷积网络几乎总是会收敛到同一水平,无论起点是什么(如果初始化完成正确)。有理论证明,有许许多多等效局部最小值,还有一个数字很小的“坏”局部最小值。因此收敛性并不会造成问题。(注:VC维用来表示模型的复杂度,机器学习基石课程上有提到)

转自知乎:https://www.zhihu.com/question/32673260
没有,按照我所了解的,目前除了SGD优化方法的变种都是为了增加弃坑速度而作的,即增加脱离局部最小值的速度,使得网络更快的收敛。

非凸的本质难题是鞍点数目太多,除非深度网络设计使得非凸的函数绘景类似一个漏斗(类似“V”型)且最小值就在漏斗尖口(“V”尖尖的底部)附近(CNN奇迹般的是),RMSprop方法会一冲到底,效率高。一些深度的贝叶斯模型不用初始化训练,直接暴力利用上面的优化不一定有效果。原因可能(目前还很难理论分析)在于函数绘景类似一个W型或者VVV…V型,而不是单纯的V型。直观来说,尖尖底太多了,利用上面的优化的结果就仁者见仁,智者见智了。

弹性反向传播(RProp)和均方根反向传播(RMSProp)
都是一种权值更新算法,类似于SGD算法,其中,RMSProp是RProp算法的改良版。

RProp算法:首先为各权重变化赋一个初始值,设定权重变化加速因子与减速因子,在网络前馈迭代中当连续误差梯度符号不变时,采用加速策略,加快训练速度;当连续误差梯度符号变化时,采用减速策略,以期稳定收敛。网络结合当前误差梯度符号与变化步长实现BP,同时,为了避免网络学习发生振荡或下溢,算法要求设定权重变化的上下限。(动态的调节学习率)

此外,RPROP针对不同的权值参数,提供了一种差异化学习的策略:
不同权值参数的梯度的数量级可能相差很大,因此很难找到一个全局的学习步长。这时,我们想到了在full-batch learning中仅靠权值梯度的符号来选择学习步长。rprop算法正是采用这样的思想:对于网络中的每一个权值参数,当其对应的前面两个梯度符号相同时,则增大该权值参数对应的学习步长;反之,则减小对应的学习步长。并且,rprop算法将每一个权值对应的学习步长限制在百万分之一到50之间。但是,prop算法为什么不能应用于mini-batch learning中。
假设有一个在线学习系统,初始的学习步长较小,在其上应用prop算法。这里有十组训练数据,前九组都使得梯度符号与之前的梯度符号相同,那么学习步长就会增加九次;而第十次得来的梯度符号与之前的相反,那么学习步长就会减小一次。这样一个过程下来,学习步长会增长很多(增大了9次学习步长,只减小了一次学习步长),如果系统的训练数据集非常之大,那学习步长可能频繁的来回波动,这样肯定是不利于学习的。
改进版rmsprop:
rmsprop算法不再孤立地更新学习步长,而是联系之前的每一次梯度变化情况,具体如下。rmsprop算法给每一个权值一个变量MeanSquare(w,t)用来记录第t次更新步长时前t次的梯度平方的平均值,具体计算方法如下图所示(注意,其中的系数0.9和0.1只是个例子,具体取值还要看具体情况)。然后再用第t次的梯度除上前t次的梯度的平方的平均值,得到学习步长的更新比例,根据此比例去得到新的学习步长。如果当前得到的梯度为负,那学习步长就会减小一点点;如果当前得到的梯度为正,那学习步长就会增大一点点。

  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在机器学习和深度学习,"batch_size"(批大小)是一个关键概念,特别是在使用梯度下降法等优化算法进行模型训练时。它涉及到两个阶段:模型初始化阶段和训练阶段。 1. **模型初始化阶段**: - **批大小 (batch_size):** 在模型初始化阶段,batch_size通常不涉及具体的训练过程。这个值是用来配置模型如何接收和处理数据的。在模型构建完成之后,你可能会在预处理数据集时确定一个批大小,比如一次性加载和处理一批数据样本。批大小会影响模型对输入数据的处理效率,大批量通常能加速模型训练,因为减少了内存的计算次数。但过大的批大小可能导致更新不准确。 2. **训练阶段**: - **训练 batch_size:** 当模型进入训练阶段时,batch_size是指每次迭代(称为一个“epoch”)用于计算梯度并更新权重的样本数量。每个小批量的数据会被用来计算损失并更新模型参数。较小的batch_size有助于更好地捕捉数据的随机变化,从而提高模型泛化能力;而较大的batch_size则有利于模型更快地收敛,但可能会牺牲一些局部最小点的探索。 - **选择 batch_size 的考虑因素:** - 计算资源:更大的 batch_size 需要更多的内存和计算能力。 - 平稳训练:过小的 batch_size 可能会导致训练波动较大,过大可能使训练变得平稳但不灵活。 - 训练速度与精度平衡:找到一个合适的 batch_size 可以兼顾训练速度和模型性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值