作者丨Samuel Lynn-Evans
来源量子位
极市平台编辑
在各种Kaggle在竞赛排名中,有许多程序员刚刚进入深度学习领域,其中大多数都有一个共同点:
都上过Fast.ai的课程。
这些免费、实用的课程鼓励学生参加Kaggle比赛,测试你的能力。当然,我也教了很多学生称霸。Kaggle深度学习技能。
什么秘密让?在短期内快速掌握并建立最先进的DL算法?一个名字叫塞缪尔?(Samuel Lynn-Evans)法国学生总结了十项经验。

这篇文章发表在他身上FloydHub官方博客,因为除了来自Fast.ai除了技巧,他还用了FloydHub免设置深度学习GPU云平台。
接下来,让我们看看他。fast.ai十大技能:
1. 使用Fast.ai库
这篇文章最简单直接。
fromfast.aiimport*
是新手友好型深度学习工具箱,是目前复制最新算法的首选。
每当Fast.ai团队及AI当研究人员发现一篇有趣的论文时,他们会测试各种数据集,并确定适当的优化方法。在此函数库中,用户可以快速输入这些模型。
于是,Fast.ai图书馆已成为一个强大的工具箱,可以快速输入一些最新的算法,如随机梯度下降算法、差异学习率和测试增强等,这里不逐一提及。
下面将分别介绍这些技术,并展示如何使用它们Fast.ai库来快速使用它们。
基于此函数库在构建模型时,可利使用。
Fast.ai库地址:https://github.com/fastai/fastai
2. 使用多个而不是单一的学习率
(Differential Learning rates)这意味着改变网络层比提高网络深度更重要。
在计算机视觉任务中,基于现有模型训练深度学习网络是一种可靠的方法。
大多数现有网络(如Resnet、VGG和Inception等)都是在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
当后面的网络层产生良好的效果时,我们将应用它改变前面的网络层。实际上,学习率的降低倍数通常设置为倍:
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
同时,记录每个学习率对应的记录Loss然后画出学习率和价值Loss值关系图:
learn.sched.plot() #plotsthelossagainstthelarning rate
通过找出学习率最高且Loss值仍在下降的值来确定最佳学习率。在上述情况中,该值将为0.01。
4. 余弦退火
在采用算法时,神经网络应该越来越接近Loss值的全局最小值。当它逐渐接近这个最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点。
余弦退火(Cosine annealing)利用余弦函数来,进而解决这个问题,如下图所示:
从上图可以看出,随着x的增加,余弦值首先下降,然后下降,下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。
learn.fit(0.1, 1)
# Calling learn fit automatically takes advantage of cosine annealing
我们可以用Fast.ai库中的**learn.fit()**函数,来快速实现这个算法,在整个周期中不断降低学习率,如下图所示:
同时,在这种方法基础上,我们可以进一步引入重启机制。
5. 带重启的SGD算法
在训练时,算法可能陷入局部最小值,而不是全局最小值。
梯度下降算法可以通过,来“跳出”局部最小值并找到通向全局最小值的路径。这种方式称为随机梯度下降方法(stochastic gradient descent with restarts, ),这个方法在Loshchilov和Hutter的ICLR论文中展示出了很好的效果。
这篇论文是:SGDR: Stochastic Gradient Descent with Warm Restartshttps://arxiv.org/abs/1608.03983
用Fast.ai库可以快速导入SGDR算法。当调用learn.fit(learning_rate, epochs)函数时,学习率在每个周期开始时重置为参数输入时的初始值,然后像上面余弦退火部分描述的那样,逐渐减小。
每当学习率下降到最小点,在上图中为每100次迭代,我们称为一个循环。
cycle_len = 1
# decide how many epochs it takes for the learning rate to fall to
# its minimum point. In this case, 1 epoch
cycle_mult=2
# at the end of each cycle, multiply the cycle_len value by 2
learn.fit(0.1, 3, cycle_len=2, cycle_mult=2)
# in this case there will be three restarts. The first time with
# cycle_len of 1, so it will take 1 epoch to complete the cycle.
# cycle_mult=2 so the next cycle with have a length of two epochs,
# and the next four.
利用这些参数,和使用差分学习率,这些技巧是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。
这个模型的关键在于先训练模型来获得对语言的一些理解,然后再使用这种预训练好的模型作为新模型的一部分来分析情绪。
为了创建第一个模型,我们训练了一个循环神经网络(RNN)来预测文本序列中的下个单词,这称为。当训练后网络的准确率达到一定值,它对每个单词的编码模式就会传递给用于情感分析的新模型。
在上面的例子中,我们看到这个语言模型与另一个模型集成后用于情感分析,但是这种方法可以应用到中,包括和。
而且,计算机视觉中的一些技巧,也同样适用于此,如上面提到的冻结网络层和使用差分学习率,在这里也能取得更好的效果。
这种方法在NLP任务上的使用涉及很多细节,这里就不贴出代码了,可访问相应课程和代码。
课程:http://course.fast.ai/lessons/lesson4.html
代码:https://github.com/fastai/fastai/blob/master/courses/dl1/lesson4-imdb.ipynb
8. 深度学习在处理结构化数据上的优势
Fast.ai课程中展示了深度学习在处理结构化数据上的突出表现,且无需借助特征工程以及领域内的特定知识。
这个库充分利用了PyTorch中函数,允许将快速转换为嵌入矩阵。
他们展示出的技术比较简单直接,只需将分类变量转换为数字,然后为每个值分配嵌入向量:
在这类任务上,传统做法是创建虚拟变量,即进行一次热编码。与之相比,这种方式的优点是用四个数值代替一个数值来描述每一天,因此可获得更高的数据维度和更丰富的关系。
这种方法在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库中的一些额外函数。
其中之一是层,由Geoffrey Hinton两年前在一篇开创性的论文中提出。它最初很受欢迎,但在最近的计算机视觉论文中似乎有所忽略。这篇论文是:
Dropout: A Simple Way to Prevent Neural Networks from Overfitting:
https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf
然而,PyTorch库使它的实现变得很简单,用Fast.ai库加载它就更容易了。
Dropout函数能效应,因此要在CIFAR-10这样一个相对较小的数据集上取胜,这点很重要。在创建learn对象时,Fast.ai库会自动加入dropout函数,同时可使用ps变量来修改参数,如下所示:
learn = ConvLearner.pretrained(model, data, ps=0.5, precompute=True)
# creates a dropout of 0.5 (i.e. half the activations) on test dataset.
# This is automatically turned off for the validation set
有一种很简单有效的方法,经常用来处理过拟合效应和提高准确性,它就是,然后并相同模型。
# create a data object with images of sz * sz pixels
def get_data(sz):
tmfs = tfms_from_model(model, sz)
# tells what size images should be, additional transformations such
# image flips and zooms can easily be added here too
data = ImageClassifierData.from_paths(PATH, tfms=tfms)
# creates fastai data object of create size
return data
learn.set_data(get_data(299))
# changes the data in the learn object to be images of size 299
# without changing the model.
learn.fit(0.1, 3)
# train for a few epochs on larger versions of images, avoiding overfitting
还有一种先进技巧,可将准确率提高若干个百分点,它就是(test time augmentation, )。这里会为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中;然后对多个版本进行计算得到平均输出,作为图像的最终输出分数,可调用learn.TTA()来使用该算法。
preds, target = learn.TTA()
这种技术很有效,因为原始图像显示的区域可能会缺少一些重要特征,在模型中输入图像的多个版本并取平均值,能解决上述问题。
10. 创新力很关键
在DAWNBench比赛中,Fast.ai团队提出的模型不仅速度最快,而且计算成本低。要明白,要构建成功的DL应用,不只是一个利用大量GPU资源的计算任务,而应该是一个需要创造力、直觉和创新力的问题。
本文中讨论的一些突破,包括Dropout层、余弦退火和带重启的SGD方法等,实际上是研究者针对一些问题想到的不同解决方式。与简单地增大训练数据集相比,能。
硅谷的很多大公司有大量GPU资源,但是,不要认为他们的先进效果遥不可及,你也能靠创新力提出一些新思路,来挑战效果排行榜。
事实上,有时计算力的局限也是一种机会,因为需求是创新的动力源泉。
关于作者
Samuel Lynn-Evans过去10年一直在教授生命科学课程,注意到机器学习在科学研究中的巨大潜力后,他开始在巴黎42学校学习人工智能,想将NLP技术应用到生物学和医学问题中。
原文:https://blog.floydhub.com/ten-techniques-from-fast-ai/
本文仅做学术分享,如有侵权,请联系删文。
后台回复:
后台回复:
后台回复:
1.面向自动驾驶领域的多传感器数据融合技术
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进4.国内首个面向工业级实战的点云处理课程5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)
9.从零搭建一套结构光3D重建系统[理论+源码+实践]
10.单目深度估计方法:算法梳理与代码实现
11.自动驾驶中的深度学习模型部署实战
12.相机模型与标定(单目+双目+鱼眼)
13.重磅!四旋翼飞行器:算法与实战
14.ROS2从入门到精通:理论与实战
15.国内首个3D缺陷检测教程:理论、源码与实战
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在
▲长按加微信群或投稿
▲长按关注公众号
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题