小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

稱霸Kaggle的十大深度學(xué)習(xí)技巧

 yangtz008 2018-08-06
作者 Samuel Lynn-Evans
王小新 編譯自 FloydHub Blog
量子位 出品 | 公眾號 QbitAI

在各種Kaggle競賽的排行榜上,都有不少剛剛進入深度學(xué)習(xí)領(lǐng)域的程序員,其中大部分有一個共同點:

都上過Fast.ai的課程。

這些免費、重實戰(zhàn)的課程非常鼓勵學(xué)生去參加Kaggle競賽,檢驗自己的能力。當(dāng)然,也向?qū)W生們傳授了不少稱霸Kaggle的深度學(xué)習(xí)技巧。

是什么秘訣讓新手們在短期內(nèi)快速掌握并能構(gòu)建最先進的DL算法?一位名叫塞繆爾(Samuel Lynn-Evans)的法國學(xué)員總結(jié)了十條經(jīng)驗。

他這篇文章發(fā)表在FloydHub官方博客上,因為除了來自Fast.ai的技巧之外,他還用了FloydHub的免設(shè)置深度學(xué)習(xí)GPU云平臺。

接下來,我們看看他從學(xué)來的十大技藝:

1. 使用Fast.ai庫

這一條最為簡單直接。

from  import *

Fast.ai庫是一個新手友好型的深度學(xué)習(xí)工具箱,而且是目前復(fù)現(xiàn)最新算法的首要之選。

每當(dāng)Fast.ai團隊及AI研究者發(fā)現(xiàn)一篇有趣論文時,會在各種數(shù)據(jù)集上進行測試,并確定合適的調(diào)優(yōu)方法。他們會把效果較好的模型實現(xiàn)加入到這個函數(shù)庫中,用戶可以快速載入這些模型。

于是,F(xiàn)ast.ai庫成了一個功能強大的工具箱,能夠快速載入一些當(dāng)前最新的算法實現(xiàn),如帶重啟的隨機梯度下降算法、差分學(xué)習(xí)率和測試時增強等等,這里不逐一提及了。

下面會分別介紹這些技術(shù),并展示如何使用Fast.ai庫來快速使用它們。

這個函數(shù)庫是基于PyTorch構(gòu)建,構(gòu)建模型時可以流暢地使用。

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

2. 使用多個而不是單一學(xué)習(xí)率

差分學(xué)習(xí)率(Differential Learning rates)意味著在訓(xùn)練時變換網(wǎng)絡(luò)層比提高網(wǎng)絡(luò)深度更重要。

基于已有模型來訓(xùn)練深度學(xué)習(xí)網(wǎng)絡(luò),這是一種被驗證過很可靠的方法,可以在計算機視覺任務(wù)中得到更好的效果。

大部分已有網(wǎng)絡(luò)(如Resnet、VGG和Inception等)都是在ImageNet數(shù)據(jù)集訓(xùn)練的,因此我們要根據(jù)所用數(shù)據(jù)集與ImageNet圖像的相似性,來適當(dāng)改變網(wǎng)絡(luò)權(quán)重。

在修改這些權(quán)重時,我們通常要對模型的最后幾層進行修改,因為這些層被用于檢測基本特征(如邊緣和輪廓),不同數(shù)據(jù)集有著不同基本特征。

首先,要使用Fast.ai庫來獲得預(yù)訓(xùn)練的模型,代碼如下:

from fastai.conv_learner import *

# import library for creating learning object for convolutional #networks
model = VVG16()

# assign model to resnet, vgg, or even your own custom model
PATH = './folder_containing_images' 
data = ImageClassifierData.from_paths(PATH)

# create fast ai data object, in this method we use from_paths where 
# inside PATH each image class is separated into different folders

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

# create a learn object to quickly utilise state of the art
# techniques from the fast ai library

創(chuàng)建學(xué)習(xí)對象之后(learn object),通過快速凍結(jié)前面網(wǎng)絡(luò)層并微調(diào)后面網(wǎng)絡(luò)層來解決問題:

learn.freeze()

# freeze layers up to the last one, so weights will not be updated.

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

# train only the last layer for a few epochs

當(dāng)后面網(wǎng)絡(luò)層產(chǎn)生了良好效果,我們會應(yīng)用差分學(xué)習(xí)率來改變前面網(wǎng)絡(luò)層。在實際中,一般將學(xué)習(xí)率的縮小倍數(shù)設(shè)置為10倍:

learn.unfreeze()

# set requires_grads to be True for all layers, so they can be updated

learning_rate = [0.0010.010.1]
# learning rate is set so that deepest third of layers have a rate of 0.001, # middle layers have a rate of 0.01, and final layers 0.1.

learn.fit(learning_rate, epochs=3)
# train model for three epoch with using differential learning rates

3. 如何找到合適的學(xué)習(xí)率

學(xué)習(xí)率是神經(jīng)網(wǎng)絡(luò)訓(xùn)練中最重要的超參數(shù),沒有之一,但之前在實際應(yīng)用中很難為神經(jīng)網(wǎng)絡(luò)選擇最佳的學(xué)習(xí)率。

Leslie Smith的一篇周期性學(xué)習(xí)率論文發(fā)現(xiàn)了答案,這是一個相對不知名的發(fā)現(xiàn),直到它被Fast.ai課程推廣后才逐漸被廣泛使用。

這篇論文是:

Cyclical Learning Rates for Training Neural Networks
https:///abs/1506.01186

在這種方法中,我們嘗試使用較低學(xué)習(xí)率來訓(xùn)練神經(jīng)網(wǎng)絡(luò),但是在每個批次中以指數(shù)形式增加,相應(yīng)代碼如下:

learn.lr_find()
# run on learn object where learning rate is increased  exponentially

learn.sched.plot_lr()
# plot graph of learning rate against iterations

 每次迭代后學(xué)習(xí)率以指數(shù)形式增長

同時,記錄每個學(xué)習(xí)率對應(yīng)的Loss值,然后畫出學(xué)習(xí)率和Loss值的關(guān)系圖:

learn.sched.plot()
# plots the loss against the learning rate


 找出Loss值在下降但仍未穩(wěn)定的點

通過找出學(xué)習(xí)率最高且Loss值仍在下降的值來確定最佳學(xué)習(xí)率。在上述情況中,該值將為0.01。

4. 余弦退火

在采用批次隨機梯度下降算法時,神經(jīng)網(wǎng)絡(luò)應(yīng)該越來越接近Loss值的全局最小值。當(dāng)它逐漸接近這個最小值時,學(xué)習(xí)率應(yīng)該變得更小來使得模型不會超調(diào)且盡可能接近這一點。

余弦退火(Cosine annealing)利用余弦函數(shù)來降低學(xué)習(xí)率,進而解決這個問題,如下圖所示:

 余弦值隨著x增大而減小

從上圖可以看出,隨著x的增加,余弦值首先緩慢下降,然后加速下降,再次緩慢下降。這種下降模式能和學(xué)習(xí)率配合,以一種十分有效的計算方式來產(chǎn)生很好的效果。

learn.fit(0.11)
# Calling learn fit automatically takes advantage of cosine annealing

我們可以用Fast.ai庫中的learn.fit()函數(shù),來快速實現(xiàn)這個算法,在整個周期中不斷降低學(xué)習(xí)率,如下圖所示:

 在一個需要200次迭代的周期中學(xué)習(xí)率不斷降低

同時,在這種方法基礎(chǔ)上,我們可以進一步引入重啟機制。

5. 帶重啟的SGD算法

在訓(xùn)練時,梯度下降算法可能陷入局部最小值,而不是全局最小值。

 陷入局部最小值的梯度下降算法

梯度下降算法可以通過突然提高學(xué)習(xí)率,來“跳出”局部最小值并找到通向全局最小值的路徑。這種方式稱為帶重啟的隨機梯度下降方法(stochastic gradient descent with restarts, SGDR),這個方法在Loshchilov和Hutter的ICLR論文中展示出了很好的效果。

這篇論文是:

SGDR: Stochastic Gradient Descent with Warm Restarts
https:///abs/1608.03983

用Fast.ai庫可以快速導(dǎo)入SGDR算法。當(dāng)調(diào)用learn.fit(learning_rate, epochs)函數(shù)時,學(xué)習(xí)率在每個周期開始時重置為參數(shù)輸入時的初始值,然后像上面余弦退火部分描述的那樣,逐漸減小。

每當(dāng)學(xué)習(xí)率下降到最小點,在上圖中為每100次迭代,我們稱為一個循環(huán)。

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.13, 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.

 每個循環(huán)所包含的周期都是上一個循環(huán)的2倍

利用這些參數(shù),和使用差分學(xué)習(xí)率,這些技巧是Fast.ai用戶在圖像分類問題上取得良好效果的關(guān)鍵。

Fast.ai論壇有個帖子專門討論Cycle_mult和cycle_len函數(shù),地址在這里:
http://forums./t/understanding-cycle-len-and-cycle-mult/9413/8

更多關(guān)于學(xué)習(xí)率的詳細(xì)內(nèi)容可參考這個Fast.ai課程:
http://course./lessons/lesson2.html

6. 人格化你的激活函數(shù)

Softmax只喜歡選擇一樣?xùn)|西;

Sigmoid想知道你在[-1, 1]區(qū)間上的位置,并不關(guān)心你超出這些值后的增加量;

Relu是一名俱樂部保鏢,要將負(fù)數(shù)拒之門外。

……

以這種思路對待激活函數(shù),看起來很愚蠢,但是安排一個角色后能確保把他們用到正確任務(wù)中。

正如創(chuàng)始人Jeremy Howard指出,不少學(xué)術(shù)論文中也把Softmax函數(shù)用在多分類問題中。在DL學(xué)習(xí)過程中,我也看到它在論文和博客中多次使用不當(dāng)。

7. 遷移學(xué)習(xí)在NLP問題中非常有效

正如預(yù)訓(xùn)練好的模型在計算機視覺任務(wù)中很有效一樣,已有研究表明,自然語言處理(NLP)模型也可以從這種方法中受益。

在Fast.ai第4課中,Jeremy Howard用遷移學(xué)習(xí)方法建立了一個模型,來判斷IMDB上的電影評論是積極的還是消極的。

這種方法的效果立竿見影,他所達到的準(zhǔn)確率超過了Salesforce論文中展示的所有先前模型:
https:///research/learned-in-translation-contextualized-word-vectors。

 預(yù)先存在的架構(gòu)提供了最先進的NLP性能

這個模型的關(guān)鍵在于先訓(xùn)練模型來獲得對語言的一些理解,然后再使用這種預(yù)訓(xùn)練好的模型作為新模型的一部分來分析情緒。

為了創(chuàng)建第一個模型,我們訓(xùn)練了一個循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)來預(yù)測文本序列中的下個單詞,這稱為語言建模。當(dāng)訓(xùn)練后網(wǎng)絡(luò)的準(zhǔn)確率達到一定值,它對每個單詞的編碼模式就會傳遞給用于情感分析的新模型。

在上面的例子中,我們看到這個語言模型與另一個模型集成后用于情感分析,但是這種方法可以應(yīng)用到其他任何NLP任務(wù)中,包括翻譯數(shù)據(jù)提取。

而且,計算機視覺中的一些技巧,也同樣適用于此,如上面提到的凍結(jié)網(wǎng)絡(luò)層和使用差分學(xué)習(xí)率,在這里也能取得更好的效果。

這種方法在NLP任務(wù)上的使用涉及很多細(xì)節(jié),這里就不貼出代碼了,可訪問相應(yīng)課程和代碼。

課程:
http://course./lessons/lesson4.html

代碼:

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

8. 深度學(xué)習(xí)在處理結(jié)構(gòu)化數(shù)據(jù)上的優(yōu)勢

Fast.ai課程中展示了深度學(xué)習(xí)在處理結(jié)構(gòu)化數(shù)據(jù)上的突出表現(xiàn),且無需借助特征工程以及領(lǐng)域內(nèi)的特定知識。

這個庫充分利用了PyTorch中embedding函數(shù),允許將分類變量快速轉(zhuǎn)換為嵌入矩陣。

他們展示出的技術(shù)比較簡單直接,只需將分類變量轉(zhuǎn)換為數(shù)字,然后為每個值分配嵌入向量:

 一周中的每一天都嵌入了四個值

在這類任務(wù)上,傳統(tǒng)做法是創(chuàng)建虛擬變量,即進行一次熱編碼。與之相比,這種方式的優(yōu)點是用四個數(shù)值代替一個數(shù)值來描述每一天,因此可獲得更高的數(shù)據(jù)維度和更豐富的關(guān)系。

這種方法在Rossman Kaggle比賽中獲得第三名,惜敗于兩位利用專業(yè)知識來創(chuàng)建許多額外特征的領(lǐng)域?qū)<摇?/p>

相關(guān)課程:
http://course./lessons/lesson4.html

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

這種用深度學(xué)習(xí)來減少對特征工程依賴的思路,也被Pinterest證實過。他也提到過,他們正努力通過深度學(xué)習(xí)模型,期望用更少的工作量來獲得更好的效果。

9. 更多內(nèi)置函數(shù):Dropout層、尺寸設(shè)置、TTA

4月30日,F(xiàn)ast.ai團隊在斯坦福大學(xué)舉辦的DAWNBench競賽中,贏得了基于Imagenet和CIFAR10的分類任務(wù)。在Jeremy的奪冠總結(jié)中,他將這次成功歸功于庫中的一些額外函數(shù)。

其中之一是Dropout層,由Geoffrey Hinton兩年前在一篇開創(chuàng)性的論文中提出。它最初很受歡迎,但在最近的計算機視覺論文中似乎有所忽略。這篇論文是:

Dropout: A Simple Way to Prevent Neural Networks from Overfitting:
https://www.cs./~hinton/absps/JMLRdropout.pdf

然而,PyTorch庫使它的實現(xiàn)變得很簡單,用Fast.ai庫加載它就更容易了。

 空格表示Dropout函數(shù)的作用點

Dropout函數(shù)能減弱過擬合效應(yīng),因此要在CIFAR-10這樣一個相對較小的數(shù)據(jù)集上取勝,這點很重要。在創(chuàng)建learn對象時,F(xiàn)ast.ai庫會自動加入dropout函數(shù),同時可使用ps變量來修改參數(shù),如下所示:

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

有一種很簡單有效的方法,經(jīng)常用來處理過擬合效應(yīng)和提高準(zhǔn)確性,它就是訓(xùn)練小尺寸圖像,然后增大尺寸再次訓(xùn)練相同模型。

# 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.13)
# train for a few epochs on larger versions of images, avoiding overfitting

還有一種先進技巧,可將準(zhǔn)確率提高若干個百分點,它就是測試時增強(test time augmentation, TTA)。這里會為原始圖像造出多個不同版本,包括不同區(qū)域裁剪和更改縮放程度等,并將它們輸入到模型中;然后對多個版本進行計算得到平均輸出,作為圖像的最終輸出分?jǐn)?shù),可調(diào)用learn.TTA()來使用該算法。

preds, target = learn.TTA()

這種技術(shù)很有效,因為原始圖像顯示的區(qū)域可能會缺少一些重要特征,在模型中輸入圖像的多個版本并取平均值,能解決上述問題。

10. 創(chuàng)新力很關(guān)鍵

在DAWNBench比賽中,F(xiàn)ast.ai團隊提出的模型不僅速度最快,而且計算成本低。要明白,要構(gòu)建成功的DL應(yīng)用,不只是一個利用大量GPU資源的計算任務(wù),而應(yīng)該是一個需要創(chuàng)造力、直覺和創(chuàng)新力的問題。

本文中討論的一些突破,包括Dropout層、余弦退火和帶重啟的SGD方法等,實際上是研究者針對一些問題想到的不同解決方式。與簡單地增大訓(xùn)練數(shù)據(jù)集相比,能更好地提升準(zhǔn)確率。

硅谷的很多大公司有大量GPU資源,但是,不要認(rèn)為他們的先進效果遙不可及,你也能靠創(chuàng)新力提出一些新思路,來挑戰(zhàn)效果排行榜。

事實上,有時計算力的局限也是一種機會,因為需求是創(chuàng)新的動力源泉。

關(guān)于作者

Samuel Lynn-Evans過去10年一直在教授生命科學(xué)課程,注意到機器學(xué)習(xí)在科學(xué)研究中的巨大潛力后,他開始在巴黎42學(xué)校學(xué)習(xí)人工智能,想將NLP技術(shù)應(yīng)用到生物學(xué)和醫(yī)學(xué)問題中。

原文:
https://blog./ten-techniques-from-fast-ai/


加入社群

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多