0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何快速掌握并能构建最先进的DL算法

新机器视觉 来源:量子位 作者:Samuel Lynn-Evans 2022-04-13 08:35 次阅读

导读

是什么秘诀让新手们在短期内快速掌握并能构建最先进的DL算法?一位名叫塞缪尔的法国学员总结了十条经验。

在各种Kaggle竞赛的排行榜上,都有不少刚刚进入深度学习领域的程序员,其中大部分有一个共同点:

都上过Fast.ai的课程。

这些免费、重实战的课程非常鼓励学生去参加Kaggle竞赛,检验自己的能力。当然,也向学生们传授了不少称霸Kaggle的深度学习技巧。

是什么秘诀让新手们在短期内快速掌握并能构建最先进的DL算法?一位名叫塞缪尔(Samuel Lynn-Evans)的法国学员总结了十条经验。

他这篇文章发表在FloydHub官方博客上,因为除了来自Fast.ai的技巧之外,他还用了FloydHub的免设置深度学习GPU云平台。

接下来,我们看看他从fast.ai学来的十大技艺:

1. 使用Fast.ai库

这一条最为简单直接。

fromfast.aiimport*

Fast.ai库是一个新手友好型的深度学习工具箱,而且是目前复现最新算法的首要之选。

每当Fast.ai团队及AI研究者发现一篇有趣论文时,会在各种数据集上进行测试,并确定合适的调优方法。他们会把效果较好的模型实现加入到这个函数库中,用户可以快速载入这些模型。

于是,Fast.ai库成了一个功能强大的工具箱,能够快速载入一些当前最新的算法实现,如带重启的随机梯度下降算法、差分学习率和测试时增强等等,这里不逐一提及了。

下面会分别介绍这些技术,并展示如何使用Fast.ai库来快速使用它们。

这个函数库是基于PyTorch构建,构建模型时可以流畅地使用。

Fast.ai库地址:
https://github.com/fastai/fastai

2. 使用多个而不是单一学习率

如何快速掌握并能构建最先进的DL算法

差分学习率(Differential Learning rates)意味着在训练时变换网络层比提高网络深度更重要。

基于已有模型来训练深度学习网络,这是一种被验证过很可靠的方法,可以在计算机视觉任务中得到更好的效果。

大部分已有网络(如Resnet、VGG和Inception等)都是在ImageNet数据集训练的,因此我们要根据所用数据集与ImageNet图像的相似性,来适当改变网络权重。

在修改这些权重时,我们通常要对模型的最后几层进行修改,因为这些层被用于检测基本特征(如边缘和轮廓),不同数据集有着不同基本特征。

首先,要使用Fast.ai库来获得预训练的模型,代码如下:

fromfastai.conv_learnerimport*

#importlibraryforcreatinglearningobjectforconvolutional#networks
model=VVG16()

#assignmodeltoresnet,vgg,orevenyourowncustommodel
PATH='./folder_containing_images'
data=ImageClassifierData.from_paths(PATH)

#createfastaidataobject,inthismethodweusefrom_pathswhere
#insidePATHeachimageclassisseparatedintodifferentfolders

learn=ConvLearner.pretrained(model,data,precompute=True)

#createalearnobjecttoquicklyutilisestateoftheart
#techniquesfromthefastailibrary

创建学习对象之后(learn object),通过快速冻结前面网络层并微调后面网络层来解决问题:

learn.freeze()

#freezelayersuptothelastone,soweightswillnotbeupdated.

learning_rate=0.1
learn.fit(learning_rate,epochs=3)

#trainonlythelastlayerforafewepochs

当后面网络层产生了良好效果,我们会应用差分学习率来改变前面网络层。在实际中,一般将学习率的缩小倍数设置为10倍:

learn.unfreeze()

#setrequires_gradstobeTrueforalllayers,sotheycanbeupdated

learning_rate=[0.001,0.01,0.1]
#learningrateissetsothatdeepestthirdoflayershavearateof0.001,#middlelayershavearateof0.01,andfinallayers0.1.

learn.fit(learning_rate,epochs=3)
#trainmodelforthreeepochwithusingdifferentiallearningrates

3. 如何找到合适的学习率

学习率是神经网络训练中最重要的超参数,没有之一,但之前在实际应用中很难为神经网络选择最佳的学习率。

Leslie Smith的一篇周期性学习率论文发现了答案,这是一个相对不知名的发现,直到它被Fast.ai课程推广后才逐渐被广泛使用。

这篇论文是:Cyclical Learning Rates for Training Neural Networks

https://arxiv.org/abs/1506.01186

在这种方法中,我们尝试使用较低学习率来训练神经网络,但是在每个批次中以指数形式增加,相应代码如下:

learn.lr_find()
#runonlearnobjectwherelearningrateisincreasedexponentially

learn.sched.plot_lr()
#plotgraphoflearningrateagainstiterations
如何快速掌握并能构建最先进的DL算法△ 每次迭代后学习率以指数形式增长

同时,记录每个学习率对应的Loss值,然后画出学习率和Loss值的关系图:

learn.sched.plot()
#plotsthelossagainstthelearningrate
如何快速掌握并能构建最先进的DL算法△ 找出Loss值在下降但仍未稳定的点

通过找出学习率最高且Loss值仍在下降的值来确定最佳学习率。在上述情况中,该值将为0.01。

4. 余弦退火

在采用批次随机梯度下降算法时,神经网络应该越来越接近Loss值的全局最小值。当它逐渐接近这个最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点。

余弦退火(Cosine annealing)利用余弦函数来降低学习率,进而解决这个问题,如下图所示:

如何快速掌握并能构建最先进的DL算法△ 余弦值随着x增大而减小

从上图可以看出,随着x的增加,余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。

learn.fit(0.1,1)
#Callinglearnfitautomaticallytakesadvantageofcosineannealing

我们可以用Fast.ai库中的**learn.fit()**函数,来快速实现这个算法,在整个周期中不断降低学习率,如下图所示:

如何快速掌握并能构建最先进的DL算法△ 在一个需要200次迭代的周期中学习率不断降低

同时,在这种方法基础上,我们可以进一步引入重启机制。

5. 带重启的SGD算法

在训练时,梯度下降算法可能陷入局部最小值,而不是全局最小值。

如何快速掌握并能构建最先进的DL算法△ 陷入局部最小值的梯度下降算法

梯度下降算法可以通过突然提高学习率,来“跳出”局部最小值并找到通向全局最小值的路径。这种方式称为带重启的随机梯度下降方法(stochastic gradient descent with restarts,SGDR),这个方法在Loshchilov和Hutter的ICLR论文中展示出了很好的效果。

这篇论文是:SGDR: Stochastic Gradient Descent with Warm Restarts
https://arxiv.org/abs/1608.03983

用Fast.ai库可以快速导入SGDR算法。当调用learn.fit(learning_rate, epochs)函数时,学习率在每个周期开始时重置为参数输入时的初始值,然后像上面余弦退火部分描述的那样,逐渐减小。

如何快速掌握并能构建最先进的DL算法

每当学习率下降到最小点,在上图中为每100次迭代,我们称为一个循环。

cycle_len=1
#decidehowmanyepochsittakesforthelearningratetofallto
#itsminimumpoint.Inthiscase,1epoch

cycle_mult=2
#attheendofeachcycle,multiplythecycle_lenvalueby2

learn.fit(0.1,3,cycle_len=2,cycle_mult=2)
#inthiscasetherewillbethreerestarts.Thefirsttimewith
#cycle_lenof1,soitwilltake1epochtocompletethecycle.
#cycle_mult=2sothenextcyclewithhavealengthoftwoepochs,
#andthenextfour.
如何快速掌握并能构建最先进的DL算法△ 每个循环所包含的周期都是上一个循环的2倍

利用这些参数,和使用差分学习率,这些技巧是Fast.ai用户在图像分类问题上取得良好效果的关键。

Fast.ai论坛有个帖子专门讨论Cycle_mult和cycle_len函数,地址在这里:
http://forums.fast.ai/t/understanding-cycle-len-and-cycle-mult/9413/8

更多关于学习率的详细内容可参考这个Fast.ai课程:
http://course.fast.ai/lessons/lesson2.html

6. 人格化你的激活函数

Softmax只喜欢选择一样东西;

Sigmoid想知道你在[-1, 1]区间上的位置,并不关心你超出这些值后的增加量;

Relu是一名俱乐部保镖,要将负数拒之门外。

……

以这种思路对待激活函数,看起来很愚蠢,但是安排一个角色后能确保把他们用到正确任务中。

正如fast.ai创始人Jeremy Howard指出,不少学术论文中也把Softmax函数用在多分类问题中。在DL学习过程中,我也看到它在论文和博客中多次使用不当。

7. 迁移学习在NLP问题中非常有效

正如预训练好的模型在计算机视觉任务中很有效一样,已有研究表明,自然语言处理(NLP)模型也可以从这种方法中受益。

在Fast.ai第4课中,Jeremy Howard用迁移学习方法建立了一个模型,来判断IMDB上的电影评论是积极的还是消极的。

这种方法的效果立竿见影,他所达到的准确率超过了Salesforce论文中展示的所有先前模型:
https://einstein.ai/research/learned-in-translation-contextualized-word-vectors。

如何快速掌握并能构建最先进的DL算法△ 预先存在的架构提供了最先进的NLP性能

这个模型的关键在于先训练模型来获得对语言的一些理解,然后再使用这种预训练好的模型作为新模型的一部分来分析情绪。

为了创建第一个模型,我们训练了一个循环神经网络(RNN)来预测文本序列中的下个单词,这称为语言建模。当训练后网络的准确率达到一定值,它对每个单词的编码模式就会传递给用于情感分析的新模型。

在上面的例子中,我们看到这个语言模型与另一个模型集成后用于情感分析,但是这种方法可以应用到其他任何NLP任务中,包括翻译数据提取

而且,计算机视觉中的一些技巧,也同样适用于此,如上面提到的冻结网络层和使用差分学习率,在这里也能取得更好的效果。

这种方法在NLP任务上的使用涉及很多细节,这里就不贴出代码了,可访问相应课程和代码。

课程:
http://course.fast.ai/lessons/lesson4.html

代码:https://github.com/fastai/fastai/blob/master/courses/dl1/lesson4-imdb.ipynb

8. 深度学习在处理结构化数据上的优势

Fast.ai课程中展示了深度学习在处理结构化数据上的突出表现,且无需借助特征工程以及领域内的特定知识。

这个库充分利用了PyTorch中embedding函数,允许将分类变量快速转换为嵌入矩阵。

他们展示出的技术比较简单直接,只需将分类变量转换为数字,然后为每个值分配嵌入向量:

如何快速掌握并能构建最先进的DL算法△ 一周中的每一天都嵌入了四个值

在这类任务上,传统做法是创建虚拟变量,即进行一次热编码。与之相比,这种方式的优点是用四个数值代替一个数值来描述每一天,因此可获得更高的数据维度和更丰富的关系。

这种方法在Rossman Kaggle比赛中获得第三名,惜败于两位利用专业知识来创建许多额外特征的领域专家。

相关课程:
http://course.fast.ai/lessons/lesson4.html

代码:
https://github.com/fastai/fastai/blob/master/courses/dl1/lesson3-rossman.ipynb

这种用深度学习来减少对特征工程依赖的思路,也被Pinterest证实过。他也提到过,他们正努力通过深度学习模型,期望用更少的工作量来获得更好的效果。

9. 更多内置函数:Dropout层、尺寸设置、TTA

4月30日,Fast.ai团队在斯坦福大学举办的DAWNBench竞赛中,赢得了基于Imagenet和CIFAR10的分类任务。在Jeremy的夺冠总结中,他将这次成功归功于fast.ai库中的一些额外函数。

其中之一是Dropout层,由Geoffrey Hinton两年前在一篇开创性的论文中提出。它最初很受欢迎,但在最近的计算机视觉论文中似乎有所忽略。这篇论文是:

Dropout: A Simple Way to Prevent Neural Networks from Overfitting:

https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

然而,PyTorch库使它的实现变得很简单,用Fast.ai库加载它就更容易了。

如何快速掌握并能构建最先进的DL算法△ 空格表示Dropout函数的作用点

Dropout函数能减弱过拟合效应,因此要在CIFAR-10这样一个相对较小的数据集上取胜,这点很重要。在创建learn对象时,Fast.ai库会自动加入dropout函数,同时可使用ps变量来修改参数,如下所示:

learn=ConvLearner.pretrained(model,data,ps=0.5,precompute=True)
#createsadropoutof0.5(i.e.halftheactivations)ontestdataset.
#Thisisautomaticallyturnedoffforthevalidationset

有一种很简单有效的方法,经常用来处理过拟合效应和提高准确性,它就是训练小尺寸图像,然后增大尺寸再次训练相同模型。

#createadataobjectwithimagesofsz*szpixels
defget_data(sz):
tmfs=tfms_from_model(model,sz)
#tellswhatsizeimagesshouldbe,additionaltransformationssuch
#imageflipsandzoomscaneasilybeaddedheretoo

data=ImageClassifierData.from_paths(PATH,tfms=tfms)
#createsfastaidataobjectofcreatesize

returndata

learn.set_data(get_data(299))
#changesthedatainthelearnobjecttobeimagesofsize299
#withoutchangingthemodel.

learn.fit(0.1,3)
#trainforafewepochsonlargerversionsofimages,avoidingoverfitting

还有一种先进技巧,可将准确率提高若干个百分点,它就是测试时增强(test time augmentation,TTA)。这里会为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中;然后对多个版本进行计算得到平均输出,作为图像的最终输出分数,可调用learn.TTA()来使用该算法。

preds,target=learn.TTA()

这种技术很有效,因为原始图像显示的区域可能会缺少一些重要特征,在模型中输入图像的多个版本并取平均值,能解决上述问题。

10. 创新力很关键

在DAWNBench比赛中,Fast.ai团队提出的模型不仅速度最快,而且计算成本低。要明白,要构建成功的DL应用,不只是一个利用大量GPU资源的计算任务,而应该是一个需要创造力、直觉和创新力的问题。

本文中讨论的一些突破,包括Dropout层、余弦退火和带重启的SGD方法等,实际上是研究者针对一些问题想到的不同解决方式。与简单地增大训练数据集相比,能更好地提升准确率

硅谷的很多大公司有大量GPU资源,但是,不要认为他们的先进效果遥不可及,你也能靠创新力提出一些新思路,来挑战效果排行榜。

事实上,有时计算力的局限也是一种机会,因为需求是创新的动力源泉。

关于作者

Samuel Lynn-Evans过去10年一直在教授生命科学课程,注意到机器学习在科学研究中的巨大潜力后,他开始在巴黎42学校学习人工智能,想将NLP技术应用到生物学和医学问题中。

原文标题:关于作者

文章出处:【微信公众号:机器视觉智能检测】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4415

    浏览量

    126642
  • 算法
    +关注

    关注

    23

    文章

    4454

    浏览量

    90747
  • 深度学习
    +关注

    关注

    73

    文章

    5236

    浏览量

    119896

原文标题:关于作者

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    先进算法讲义

    先进算法讲义在本讲义中,我们将着重讲述一些数学建模中常用的算法,包括神经网络算法、遗传算法、模拟退火算法
    发表于 09-15 12:33

    基于PXI构建先进自动化测试系统

    基于PXI构建先进自动化测试系统
    发表于 10-18 10:30

    λ算法 - 瑞萨先进电机控制解决方案

    变得尤为重要。针对中国市场,瑞萨在积极推广高性能,低功耗RX单片机的同时,还开发了完全自主知识产权的先进电机控制解决方案 - λ算法,用以构建高性能、高可靠性的永磁同步电动机的驱动解决方案,帮助客户开发
    发表于 01-22 10:51

    最先进的数字CMOS图像传感器MIS1011(兼容AR0130)

    MIS1011 是最先进的130万像素,数字CMOS图像传感器,兼容AR0130,特别在低照时要比APTINA的AR0130还要清晰。
    发表于 08-27 13:09

    TI-RTOS 2.12的最先进电源管理软件

    今天,我们推出了TI-RTOS 2.12 —— 我们用来加快开发物联网(IoT)应用的软件平台。对许多IoT应用而言,电池寿命均是一个关键的优劣区分因素,因此,TI-RTOS的最先进电源管理软件使
    发表于 09-10 15:16

    安捷伦科技公司推出业界最先进的固定配置逻辑分析仪

    安捷伦科技公司推出业界最先进的固定配置逻辑分析仪
    发表于 09-29 10:20

    如何快速掌握一门技术

    ,以前学过的专业课程:编程类,电路类,传感器类,嵌入式类,图像处理类等非常重要。后悔当初没有用心学了,才开始重视专业知识的学习。然后各种途径寻找:如何快速掌握一门技术(专业、技能)?一部分自学能力强的人
    发表于 07-18 15:37

    掌握PID算法

    掌握PID算法?要深刻理解反馈机构和执行机构PID算法,不管是原理上,还是代码上都比较简单。主要运用在电机控制、开关电源、电源管理芯片等领域。 PID算法,不管是原理上,还是代码上都比
    发表于 09-13 06:20

    什么是先进后出滤波算法

    什么是先进后出滤波算法有没有实例参考一下
    发表于 10-27 07:05

    先进算法讲义

    各种算法的,如:神经网络。蚁群算法,等一些先进算法
    发表于 05-19 14:31 0次下载

    最先进的电池充电器

    voicor batmod最先进的电池充电器
    发表于 06-02 15:41 39次下载

    White博士:最先进算法与最专业的人类相结合有可能使社会更公正,更安全

    一项最新研究表明,专业人员在人脸识别上的表现仍优于机器,但将两者结合起来可以取得近乎完美的结果。“人脸识别的准确度在很大程度上决定了我们能否生活在一个安全公正的社会中,” White博士说。“我认为,最先进算法与最专业的人类相结合有可能使社会更公正,更安全。”
    的头像 发表于 06-03 10:07 3395次阅读

    高通最先进5G基带芯片问世 号称迄今最先进的调制解调器

    高通宣布推出第二代5G调制解调器骁龙X55,采用7纳米工艺,号称迄今最先进的调制解调器,目前已有30多款5G手机在研发,预计今年年底前问世。
    的头像 发表于 02-21 15:19 4516次阅读

    东芝模拟分叉算法最先进超算还要好

    计算效率是评判算法优劣的一个重要指标,然而日本著名跨国集团东芝近日声称,其打造了一套可比当今最先进的超算还要更快地分析市场数据的新算法
    的头像 发表于 01-17 15:34 2709次阅读
    东芝模拟分叉<b class='flag-5'>算法</b>比<b class='flag-5'>最先进</b>超算还要好

    中国目前最先进的***是哪个?

    中国目前最先进的国产芯片是哪个呢?
    的头像 发表于 05-29 09:44 1.9w次阅读