热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模型训练中batch_size的选择

总结:训练过程中,batch_size的选取对模型精度和模型泛化能力的影响:batch_size过大,模型没有BN层,模型收敛速度变慢。而且模型容易陷入局部最小值,模型精度低。ba

总结:训练过程中,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次的梯度的平方的平均值,得到学习步长的更新比例,根据此比例去得到新的学习步长。如果当前得到的梯度为负,那学习步长就会减小一点点;如果当前得到的梯度为正,那学习步长就会增大一点点。


推荐阅读
  • 开源真香 离线识别率高 Python 人脸识别系统
    本文主要介绍关于python,人工智能,计算机视觉的知识点,对【开源真香离线识别率高Python人脸识别系统】和【】有兴趣的朋友可以看下由【000X000】投稿的技术文章,希望该技术和经验能帮到 ... [详细]
  • Stanford机器学习第九讲. 聚类
    原文:http:blog.csdn.netabcjenniferarticledetails7914952本栏目(Machinelearning)包括单参数的线性回归、多参数的线性 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 脑机接口和卷积神经网络的初学指南(一)
    脑机接口和卷积神经网络的初学指南(一) ... [详细]
author-avatar
陈俊英围脖_687
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有