训练过程acc_AI 深度学习训练tricks总结(均有实验支撑)

↑↑↑↑↑点击上方蓝色字关注我们!

76ee871ecada675b214ff06f32ca5d5f.png


『运筹OR帷幄』转载

作者:Jones@知乎

作者丨Jones@知乎来源丨https://zhuanlan.zhihu.com/p/261999668编辑丨极市平台

编者按

 

本文作者模拟复现了自己在深度学习训练过程中可能遇到的多种情况,并尝试解决这些问题,文章围绕学习率、动量、学习率调整策略、L2正则、优化器展开。>>加入极市CV技术交流群,走在计算机视觉的最前沿

深度模型是黑盒,而且本次并没有尝试超深和超宽的网络,所以结论只能提供一个先验,并不是标准答案!同时不同的任务也可能导致不同,比如分割,所以必须具体问题具体分析!

Abstract;Key-words;Motivation

前阵子参加了几个CV的比赛,发现了这样的问题:虽然了解的理论知识不算特别少,跑了的实验和paper代码也还可以,但是实际搞起来总会出现一些奇怪的问题,然后解决起来也是有点难受,于是就打算尽可能地把遇到的情况模拟复现出现,尝试解决并解释(但是解释原因只能自圆其说,毕竟黑盒实验),以免之后遇到类似的情况没有解决的思路。

这个黄金周,乖乖地在研究所做了几天实验,主要围绕着这下几个关键字:

学习率;动量;学习率调整策略;L2正则;优化器

(所有的结论都有实验支撑,但是有一部分实验数据给我搞没了....555)

Thinking

在这些实验以及一些资料(主要是吴恩达的《Machine Learning Yearning》),总结了以下几条基本准则:

  1. 模型性能的影响因素:
  • 模型的表达能力(深度和宽度)
  • 学习率
  • 优化器
  • 学习率调整策略

2. 模型过拟合的影响因素:

  • 数据量(数据增强可以增加数据量)
  • 正则化

稍微解释一下:模型的表达能力对模型是否过拟合的确有起到一定的影响,但是选择合适的正则化强度可以有效的减缓这个影响!所以我没有把模型的表达能力列入为过拟合的影响因素。而且吴恩达的书中(《Machine Learning Yearning》)也表达了类似的想法(很开心,和大佬有一样的想法)。

实验环境

Resnet-18

Cifar-10

Details

  1. 学习率 和 动量

学习率和动量我会放在一起说,因为我发现这两个东西就是天生的couple。了解深度学习的小伙伴应该知道,学习率过大和过小都会存在问题:

学习率过大会导致模型无法进入局部最优甚至导致模型爆炸(不能收敛)
学习率过小会导致模型训练慢,进而浪费时间

那有没有办法让模型训练得又快又能收敛呢?有!

我经过四个实验得出以下结论:

使用较大的学习率+大的动量可以加快模型的训练且快速收敛

实验设计如下(我忘记保存实验图了,对不起!):
实验一:
小学习率+小动量
结果:模型训练速度慢,虽然收敛但是收敛速度很慢,验证集上性能很稳定
实验二:
小学习率+大动量
结果:模型训练速度慢,虽然收敛但是收敛速度很慢,验证集上性能很稳定
实验三:
大学习率+小动量
结果:模型训练速度快,虽然很难收敛而且验证集上性能波动很大,说明了模型很不稳定
实验四:
大学习率+大动量
结果:模型训练速度快,同时收敛得也很快,而且验证集上性能很稳定

我觉得这个原因,可以从两个角度来解释,一个是向量加法的特殊性;另一个是从集成模型的角度来解释。第一个角度我这里就不说了,因为我不想画图。。,我从第二个角度来说:

大的学习率意味着不稳定,但是因为这个学习率也是可以让模型往正确的优化方向上走,所以你可以理解大的学习率为一个弱的机器学习模型;当你采用大的动量的时候,意味着本次学习率对最终模型优化起的作用要小,也就是说采用大动量 -> 单次损失函数的占比低,那就相当于我这个模型的优化是由本次+过去很多次学习率(弱机器学习模型)计算出来的综合结果,那是不是就是一个集成模型呢~so,效果就比较好了。

随便提一嘴,当模型很不稳定的时候,如果某个瞬间出现较好的结果,比如准确率98%,那也不能说明这个模型在这个瞬间是好模型,因为这个时候你的模型很有可能是对验证集过拟合了!不信你可以划分出一个测试集试试(我之前参加脑PET识别比赛的时候就在地方摔过)。

2. 学习率调整策略

以前我是几乎不用学习率调整策略的,因为我觉得很扯,效果不大,但是前阵子和一小哥打华录杯的时候看他用了余弦退火有不错的效果,就决定也试试,结论是:真香!

对不起的是,这里我也忘记保存实验图了,对不起!

我尝试了3种学习率调整策略,分别为:1.ReduceLROnPlateau;2. 余弦退火;3. StepLR

结论:

  • 三种策略都很不错的
  • 余弦退火使用的时候,最大学习率和最小学习率相差的数量级不要太大(比如1e-1和1e-4),不然会导致在该快的时候太慢,在该慢的时候太快,特别的接近最优解的时候,太大就直接跑偏(图1)【Acc图中,灰色的曲线是验证集上的准确率,这里我L2没调好,所以过拟合了,可以忽略这点】
  • 余弦退火我推荐在warm-up的时候可以用,之后可以改一下
  • ReduceLROnPlateau我觉得是三个里面最优的,可以根据训练的情况动态调整(也出现了一些玄妙的情况(mode参数),我后面会说),需要注意的地方是,用这个的时候最好设置一下最小学习率,不然后期会因为学习率衰减得过小导致模型训练不到。
  • StepLR就很传统,也挺好用的,但是灵活度不如ReduceLROnPlateau。
cf597a3cb5bb43c9a79da823383155b0.png
图1

3. L2正则

正则主要分两种,一种是L1,一种是L2,因为pytorch自带L2,所以我就只用了L2(嘻嘻),直接上结论:

  • L2千万不要调太大,不然特别难训练(难训练/训练不到的标记就是验证集上的性能一直在较低的水平波动,不如10% -> 12% ->9%),这就说明我们的模型并没有学到什么东西
  • L2也不能太小,不然过拟合得挺严重的,大概1e-2可以有不错的效果(resnet18)
  • 即使正确地使用正则化强度,也会导致验证集前期不稳定甚至呈现训练不到的现象,但是之后就会稳定下来!不要慌!(如图2,Acc中,灰色的曲线是模型在验证集上的准确率)
5d398731a1076aa9a1ecb3d8e05c4735.png
图2

4. 优化器

优化器部分我就存图了!

其实这里不单单测试了优化器,应该是优化器+学习率策略+momentum

其实我想做的事情就是找到一个最优解可以作为我的先验知识(害,人话就是:就是我想知道哪种搭配比较好,以后就先试试这种搭配)

我做了几组实验:

  • 第一组:

    • SGD(大的初始学习率) + momentum(大动量) +StepLR + L2(每隔70个epoch,学习率衰减为之前的0.1)
    • Adam(大的初始学习率) +StepLR + L2(每隔70个epoch,学习率衰减为之前的0.1)
    • AdamW(大的初始学习率) +StepLR + L2(每隔70个epoch,学习率衰减为之前的0.1)

结论(图3):

  • SGD+momentum在大学习率+大动量的时候效果更好;
  • 不管是SGD还是Adam还是AdamW,学习率的调整都对他们有帮助
39e04fac67ef1155c40e53bc0624b8c5.png
图3

第二组:

  • ReduceLROnPlateau(mode='min') + SGD(大学习率) + momentum(大动量) + L2
  • ReduceLROnPlateau(mode='max') + SGD(大学习率) + momentum(大动量) + L2
  • 余弦退火 + SGD(大学习率) + momentum(大动量) + L2

先解释一下ReduceLROnPlateau的两种模式:min和max
当模型为min的时候,如果指标A在一段时间内没有减小的话,则学习率衰减。
当模型为max的时候,如果指标A在一段时间内没有增大的话,则学习率衰减。

ReduceLROnPlateau我选择mode为min模式的时候,指标的是acc,很有意思的是,其收敛速度非常快(比mode为max更快),我猜测原因应该是:

当acc有所上升的时候,说明这个优化方向是正确的,这个时候优化的速度应该放缓!但是在这个实验中,其最优解比mode为max模式差(min模式下的最优解为0.916,max为0.935)。原因应该有两个:

1. 是因为lr的衰减速度过快,以至于后面学习率过低,训练不动;(后来我做了实验证明了就是这个原因!)

2. 因为一遇到可优化的地方就减少学习率,所以极有可能使得模型过早进入局部最优点(但是我后来觉得这个原因站不住脚哈哈哈,因为就算使用其他优化器,同样会存在陷入局部最优的问题,所以这个点不重要,但是为了保留从实验到笔记的思考过程,我还是不把这点删掉了。)

对于原因1,我之后做了实验进行验证,实验思路就是减小学习率衰减周期和衰减系数的值/设置最小学习率,保证后期学习率不会过小,最终的解决了最优解的问题。

065403c316b50d93eb0fa1048d5c593a.png
图4

结论(图4):

  • 带有momentum的SGD加余弦退火收敛更快且更加稳定(其他两个也不赖!)
  • 学习率最好设定好下限,不然后期会训练不动

第三组:

  • StepLR+ SGD(大学习率) + momentum(大动量) + L2(图5)
  • Adam + L2(图6)
eb7975186f5d1f4165eb22d30a9960bc.png
图5
679d7b83e229262789773f1e44758445.png
图6

结论:

  • SGD+momentum的话,这东西对学习率还是很敏感的,所以平时最好还是别单纯只用它,最好加上一些其他的策略(余弦/ReduceLROnPlateau)。
  • 纯Adam非常垃圾,- -我给它的初值是1e-3,然而和之前的结果相比不管从稳定性还是收敛速度来讲都很差劲。

顺便提一下:我也有尝试模拟退火+Adam,但是因为退火的幅度过大,所以效果更不好(我的锅)。下次再试试正常幅度的退火。

心得:

从上述实验可以看出monument非常非常重要,让有点垃圾的SGD一下子就上天了(怪不得论文里都喜欢用这对couple),这时候再加上一些学习率调整策略(退火/ReduceLROnPlateau)就可以直接上天了,不说了,以后我就先首发这对组合。Adam相对于SGD来讲,的确好上不少,但是相比较于最优组合(SGD+momentum+学习率调整策略),就弱了一点。(在叉烧哥的群里有位高通的大佬和我说可以试试用nadam,因为nadam可以理解为Adam+monument,但是因为pytorch官方没相应的api,我就懒得试了,不过我相信应该很猛!)

c3942e307360d7fa4d6e10e4434bf832.gif

欢迎社会各界加入『运筹OR帷幄』算法知识星球!

随着算法相关专业热度的提升,考研读博、留学申请、求职的难度也在相应飙升,『运筹OR帷幄』建立了【算法社区】知识星球,涵盖运筹学、数据科学、人工智能、管理科学、工业工程等相关专业,集结社区50W+专业受众的力量,提供给大家一个共同的学习交流平台,结交志同道合的伙伴。

ef90b6fc207968cbd35fa1656debe927.png44c1bf06e139aa7b5d436a900ec59a80.png

# 加入知识星球,您将收获以下福利 #

● 依托『运筹OR帷幄』50w+专业受众和50+细分领域硕博微信群的算法技术交流

● 与国内外Top名校教授|博士和名企研发高管一起交流算法相关技术干货

● 海量学界|业界(独家内推)招聘|实习机会发布,申请|求职面试经验交流

● 数学模型|算法|论文|学习资料分享与提问,倡导同行交流,寻找志同道合的“队友”

● 每月开展一次“人气话题”和“人气回答”评选,百元红包奖励分享和互动

● 每月一次“领读人”带队Paper|教学视频|原创技术推文等线上Meetup小组学习

● 享受『运筹OR帷幄』各大城市线下Meetup免费入场资格,拓展人脉

相关文章推荐

了解了深度学习的小trick后,如果你想继续在CV领域有所建树,欢迎阅读下面文章。

点击蓝字标题,即可阅读《AI|图像分割研究者的烦恼与未来》

本文福利

可以在 公众号后台 回复关键词:“ DS 获取大量由我平台编辑精心整理的数据科学资料,如果觉得有用, 请勿吝啬你的留言和赞哦!

—— 完 ——

9d3d1b1db9c5311efb8bc57210b221e3.gif

a84a3d8a42b06a3f6c553f446b0cf9d8.gif

8122547826acf2a8bbbdc9d99f8020ff.gif1b040cf77a164014b584e94bff00ab29.gif91665f0e38cbd75da440ffbe94da9b80.gif3fac8f86d3f0aadac700d24ca9465ebd.gif

文章须知

文章作者:Jones@知乎

责任编辑:书生

审核编辑:阿春

微信编辑:玖蓁

本文转载自公众号 极市平台(ID:extrememart)

原文链接:深度学习训练tricks总结(均有实验支撑)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 内存_一行Python解决内存问题

原标题:一行Python解决内存问题 内存不足是项目开发过程中经常碰到的问题,我和我的团队在之前的一个项目中也遇到了这个问题,我们的项目需要存储和处理一个相当大的动态列表,测试人员经常向我抱怨内存不足。但是最终,我…

一文读懂机器学习“数据中毒”

作者 | Ben Dickson翻译 | 火火酱~出品 | AI科技大本营头图 | 付费下载于视觉中国在人类的眼中,下面的三张图片分别展示了三样不同的东西:一只鸟、一只狗和一匹马。但对于机器学习算法来说,这三者或许表示同样的东西:一个有黑边的白色小方框。…

excel模糊搜索_Excel进阶篇:星号*用法,学会这些功能的,都按时加班了

是的,你没看错,是按时加班,赚点加班费嘛!星号"*"就是四则运算里的乘号"ⅹ"。在Excel中星号"*"可不仅仅是乘,还有逻辑运算、通配符等功能,可以在公式中与函数进行组合&#x…

java2

一、学习要点 认真看书并查阅相关资料,掌握以下内容: 理解对象的创建与引用的关系 掌握构造方法的重载 掌握String类 掌握类的设计方法 掌握this关键字 掌握static关键字 理解引用传递并掌握基本应用 掌握单例模式 理解内部类 (一&#xff09…

谷歌开源能翻译101种语言的AI模型,只比Facebook多一种

大数据文摘出品来源:VB10月底,Facebook发布了一款可翻译100种语言的机器学习模型,微软发布了一款能翻译94种语言的模型,谷歌自然也不甘示弱。继Facebook和微软后,谷歌开源了一种名为MT5的模型,称该模型在一…

只需十四步:从零开始掌握 Python 机器学习(附资源)

分享一篇来自机器之心的文章。关于机器学习的起步,讲的还是很清楚的。原文链接在:只需十四步:从零开始掌握Python机器学习(附资源) Python 可以说是现在最流行的机器学习语言,而且你也能在网上找到大量的资…

druid seata 配置_架构设计 | 基于Seata中间件,微服务模式下事务管理

一、Seata简介1、Seata组件Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。2、支持模式AT 模式基于支持本地 ACID 事务的关系型数…

数据卡片_VISA消息:关于VCPS 2.1卡片产品的性能和交叉测试的卡片个性化数据的更新...

我们都知道从2020年6月1日起,所有用于性能和交叉测试的卡片样品都必须采用新的个性化数据用于卡片的个性化。需要注意的是,Visa已经发布了用于产品性能和交叉测试的卡片个性化数据2.0版本,支持VCPS 2.1.x产品。从2020年7月27日起,…

一文剖析2020年最火十大物联网应用|IoT Analytics 年度重磅报告出炉!

来源:北京物联网智能技术应用协会知名物联网研究机构IoT Analytics 2020年的最新报告显示,与往年相比,当前大多数物联网项目仍然落地于工业/制造业领域,另外,交通、能源、零售及医疗保健等垂直领域的市场份额也相对增加…

jbutton添加点击事件_electron-vue自定义边框后点击事件失效问题

问题描述:electron-vue自定义边框后点击事件失效(不单单点击事件,窗体内所有事件都失效)解决方案:在需要事件处理的节点上添加样式-webkit-app-region:no-drag;srcmainindex.js中设置:/**在样式文件中&…

新一代人工智能白皮书(2020年) ——产业智能化升级

全文共计1278字64图,预计阅读时间10分钟来源 | CIE智库(转载请注明来源)编辑 | 蒲蒲当前,我国经济发展进入新阶段,既面临产业转型升级与重塑国际经济格局的机遇,也面对传统要素红利衰减、经济增速换挡、经济…

世界半导体集成电路发展史(超细、超全)

来源:ittbank半导体集成电路发展史集成电路从产生到成熟大致经历了如下过程:电子管——晶体管——集成电路——超大规模集成电路晶体管的演变集成电路的前奏——电子管、晶体管 电子管,是一种在气密性封闭容器中产生电流传导,利用…

北大发布最新《图神经网络推荐系统》2020综述论文,27页pdf

来源:专知随着网络信息的爆炸式增长,推荐系统在缓解信息过载方面发挥了重要作用。由于推荐系统具有重要的应用价值,这一领域的研究一直在不断涌现。近年来,图神经网络(GNN)技术得到了广泛的关注,它能将节点信息和拓扑结…

anaconda镜像源配置_Anaconda使用技巧,如何修改国内镜像源?

在使用Anaconda时有时候需要加载别的模块这个时候需要通过官网下载模块由于官网的服务器在国外那个下载速度真的是慢到天际还好可以通过修改镜像这样下载模块会快很多本文讲Anaconda修改国内镜像源Anaconda修改国内镜像源通过conda config命令生成配置文件这里,我们…

HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...

树状数组。。。 Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1541 Accepted Submission(s): 599 Problem DescriptionThis is a simple problem. The teacher gives Bob a lis…

c++ mmap写入速度_内存管理(24)mmap和缺页中断

相关文件:mm/mlock.cmm/util.cmm/mmap.cinclude/linux/slab.hmmap系统调用陷入内核中会调用vm_mmap_pgoff>do_mmap_pgoff函数来真正完成mmap操作1.1.do_mmap_pgoff函数(关键部分代码)do_mmap_pgoff16行:对需要映射的内存长度页对齐20行:ge…

邬贺铨院士:边缘计算“新十问”

来源:C114通信网作者:水易两年前的边缘计算技术峰会上,中国工程院院士邬贺铨就边缘计算提出十问,直戳技术演进与产业发展的核心问题,引起业内巨大反响。在过去两年中,边缘计算产业得到了长足发展&#xff0…

java 字符串第一个字符_深入Java源码剖析之字符串常量

字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键。那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个个的字符来组拼成字符串。…

耗时11年,120页论文,中科大数学家成功证明微分几何核心猜想

大数据文摘出品近日,中国科技大学几何与物理研究中心创始主任陈秀雄教授与王兵教授团队发布论文“Space of Ricci flows (II)—Part B: Weak compactness of the flows”,在全球范围内率先证明了“哈密尔顿-田”和“偏零阶估计”这两个困扰数学界20多年的…

java 写入txt_Java线程转储的8个选项

线程转储是诊断CPU尖峰,死锁,内存问题,无响应的应用程序,较差的响应时间以及其他系统问题的重要工件。有很多很棒的在线线程转储分析工具,可以分析和发现问题。但是对于那些工具,您需要提供适当的线程转储作…