当前位置: 首页 > news >正文

学习率和BatchSize对模型的影响

随机梯度下降算法的原理如下,

img

n是批量大小(batchsize),η是学习率(learning rate)。可知道除了梯度本身,这两个因子直接决定了模型的权重更新,从优化本身来看它们是影响模型性能收敛最重要的参数。

学习率直接影响模型的收敛状态,batchsize则影响模型的泛化性能,两者又是分子分母的直接关系,相互也可影响

毕设项目演示地址: 链接

毕业项目设计代做项目方向涵盖:

行为识别、OpenCV、场景文本识别、去雨、机器学习、风格迁移、视频目标检测、去模糊、显著性检测、剪枝、活体检测、人脸关键点检测、3D目标跟踪、视频修复、人脸表情识别、时序动作检测、图像检索、异常检测等

学习率如何调整

初始学习率大小对模型性能的影响

初始的学习率肯定是有一个最优值的,过大则导致模型不收敛,过小则导致模型收敛特别慢或者无法学习,下图展示了不同大小的学习率下模型收敛情况的可能性,图来自于cs231n。

img

通常可以采用最简单的**搜索法,即从小到大开始训练模型,然后记录损失的变化**,通常会记录到这样的曲线。

img

随着学习率的增加,损失会慢慢变小,而后增加,而最佳的学习率就可以从其中损失最小的区域选择

有经验的工程人员常常根据自己的经验进行选择,比如0.1,0.01等。

随着学习率的增加,模型也可能会从欠拟合过度到过拟合状态,在大型数据集上的表现尤其明显,笔者之前在Place365上使用DPN92层的模型进行过实验。随着学习率的增强,模型的训练精度增加,直到超过验证集。

img

不同的学习策略

Mutistep

一般使用Mutistep策略,搁几个epoch调整一次学习率的数量级。

cyclical learning rate

实验证明通过设置上下界,让学习率在其中进行变化,可以在模型迭代的后期更有利于克服因为学习率不够而无法跳出鞍点的情况。

确定学习率上下界的方法则可以使用LR range test方法,即使用不同的学习率得到精度曲线,然后获得精度升高和下降的两个拐点,或者将精度最高点设置为上界,下界设置为它的1/3大小。

img

SGDR方法则是比cyclical learning rate变换更加平缓的周期性变化方法,如下图,效果与cyclical learning rate类似。

img

自适应学习率变换方法

也就是Adam,详情看《10_理清深度学习优化函数发展脉络.md

Batchsize如何影响模型性能?

模型性能对batchsize虽然没有学习率那么敏感,但是在进一步提升模型性能时,batchsize就会成为一个非常关键的参数。

3.1 大的batchsize减少训练时间,提高稳定性

这是肯定的,同样的epoch数目,大的batchsize需要的batch数目减少了,所以可以减少训练时间(前提是batchsize大,lr也要大,确保一个epoch参数更新的总长度不变),目前已经有多篇公开论文在1小时内训练完ImageNet数据集。另一方面,大的batch size梯度的计算更加稳定,因为模型训练曲线会更加平滑。在微调的时候,大的batch size可能会取得更好的结果。

3.2 大的batchsize导致模型泛化能力下降

在一定范围内,增加batchsize有助于收敛的稳定性,但是随着batchsize的增加,模型的性能会下降,如下图,来自于文[5]。

img

主要原因是小的batchsize带来的噪声有助于逃离局部最优。

3.3 小结

batchsize在变得很大(超过一个临界点)时,会降低模型的泛化能力。在此临界点之下,模型的性能变换随batch size通常没有学习率敏感。

学习率和BatchSize的关系

通常当我们增加batchsize为原来的N倍时,学习率应该增加为原来的N倍,因为要保证经过同样的样本后更新的权重相等,

  • 如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。
  • **尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。**如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整。

问题

10k样本用SGD,batchsize取1,100,10000哪个收敛最快?

100。

  1. 大的bs,一个epoch需要的iter次数就会变少,又一般有5次bs=1比1次bs=5的时间长,所以bs越大训练速度越快。
    而且,bs越大,梯度更加稳定,loss曲线更加平滑。
  2. bs过大,导致模型泛化性下降,因为小bs更容易跳出局部最优点(sharp minimum)。一般bs不能超过8000。

因此,太大,太小都不好。

img

参考链接

【AI不惑境】学习率和batchsize如何影响模型的性能?

相关文章:

  • 小代码大智慧: FilenameUtils.getName 函数分析
  • 基于php理发店管理系统
  • Linux入门之使用 firewalld 防火墙
  • 【论文阅读】SABRE: Protecting Bitcoin against Routing Attacks
  • 【设计模式3_责任链、观察者】
  • .NET MVC之AOP
  • 机器学习基础
  • 浅谈报表测试
  • 第十一:Fiddler抓包教程(11)-Fiddler设置安卓手机抓包,不会可是万万不行的!
  • ARMv8 MMU和translation stages、translation regimes和相关寄存器
  • Linux入门之配置以太网连接
  • 小时3.0报表某个型号数据比天数据多问题复盘
  • 深度学习 FairMOT多目标跟踪(PANDA)
  • 深度学习图像分割U-Net和FCN讲解
  • MySQL语句(二)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • java小心机(3)| 浅析finalize()
  • Mysql优化
  • nginx 负载服务器优化
  • nodejs调试方法
  • Python 反序列化安全问题(二)
  • XML已死 ?
  • 复杂数据处理
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 实现菜单下拉伸展折叠效果demo
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一些关于Rust在2019年的思考
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 转载:[译] 内容加速黑科技趣谈
  • ​flutter 代码混淆
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (十六)串口UART
  • (转载)深入super,看Python如何解决钻石继承难题
  • ***利用Ms05002溢出找“肉鸡
  • .Net - 类的介绍
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net 程序发生了一个不可捕获的异常
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net网站发布-允许更新此预编译站点
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • :not(:first-child)和:not(:last-child)的用法
  • [1127]图形打印 sdutOJ
  • [ACTF2020 新生赛]Upload 1
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Angular 基础] - 表单:响应式表单
  • [BZOJ 1040] 骑士
  • [ffmpeg] aac 音频编码
  • [Google Guava] 1.1-使用和避免null