乾貨分享 | 可以幫你稱霸Kaggle的十大深度學習技巧

2021-02-19 一碗數據湯

轉自:量子位

作者:Samuel Lynn-Evans

是什麼秘訣讓新手們在短期內快速掌握並能構建最先進的DL算法?

在各種Kaggle競賽的排行榜上,都有不少剛剛進入深度學習領域的程式設計師,其中大部分有一個共同點:都上過Fast.ai的課程。

這些免費、重實戰的課程非常鼓勵學生去參加Kaggle競賽,檢驗自己的能力。當然,也向學生們傳授了不少稱霸Kaggle的深度學習技巧。

是什麼秘訣讓新手們在短期內快速掌握並能構建最先進的DL算法?一位名叫塞繆爾(Samuel Lynn-Evans)的法國學員總結了十條經驗。

他這篇文章發表在FloydHub官方博客上,因為除了來自Fast.ai的技巧之外,他還用了FloydHub的免設置深度學習GPU雲平臺。

接下來,我們看看他從fast.ai學來的十大技藝:


1. 使用Fast.ai庫

這一條最為簡單直接

from fast.ai import *

Fast.ai庫是一個新手友好型的深度學習工具箱,而且是目前復現最新算法的首要之選。


每當Fast.ai團隊及AI研究者發現一篇有趣論文時,會在各種數據集上進行測試,並確定合適的調優方法。他們會把效果較好的模型實現加入到這個函數庫中,用戶可以快速載入這些模型。

於是,Fast.ai庫成了一個功能強大的工具箱,能夠快速載入一些當前最新的算法實現,如帶重啟的隨機梯度下降算法、差分學習率和測試時增強等等,這裡不逐一提及了。

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

這個函數庫是基於PyTorch構建,構建模型時可以流暢地使用。

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


2. 使用多個而不是單一學習率


差分學習率(Differential Learning rates)意味著在訓練時變換網絡層比提高網絡深度更重要。

基於已有模型來訓練深度學習網絡,這是一種被驗證過很可靠的方法,可以在計算機視覺任務中得到更好的效果。

大部分已有網絡(如Resnet、VGG和Inception等)都是在ImageNet數據集訓練的,因此我們要根據所用數據集與ImageNet圖像的相似性,來適當改變網絡權重。

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

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

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

創建學習對象之後(learn object),通過快速凍結前面網絡層並微調後面網絡層來解決問題:

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

當後面網絡層產生了良好效果,我們會應用差分學習率來改變前面網絡層。在實際中,一般將學習率的縮小倍數設置為10倍:

learn.unfreeze()

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

learning_rate = [0.001, 0.01, 0.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. 如何找到合適的學習率

學習率是神經網絡訓練中最重要的超參數,沒有之一,但之前在實際應用中很難為神經網絡選擇最佳的學習率。

Leslie Smith的一篇周期性學習率論文發現了答案,這是一個相對不知名的發現,直到它被Fast.ai課程推廣後才逐漸被廣泛使用。

這篇論文是:

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

在這種方法中,我們嘗試使用較低學習率來訓練神經網絡,但是在每個批次中以指數形式增加,相應代碼如下:

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

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

每次迭代後學習率以指數形式增長

同時,記錄每個學習率對應的Loss值,然後畫出學習率和Loss值的關係圖:

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

找出Loss值在下降但仍未穩定的點

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


4. 餘弦退火

在採用批次隨機梯度下降算法時,神經網絡應該越來越接近Loss值的全局最小值。當它逐漸接近這個最小值時,學習率應該變得更小來使得模型不會超調且儘可能接近這一點。

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

餘弦值隨著x增大而減小

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

learn.fit(0.1, 1)
# Calling learn fit automatically takes advantage of cosine annealing

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

在一個需要200次迭代的周期中學習率不斷降低

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


5. 帶重啟的SGD算法

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

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

梯度下降算法可以通過突然提高學習率,來「跳出」局部最小值並找到通向全局最小值的路徑。這種方式稱為帶重啟的隨機梯度下降方法(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)函數時,學習率在每個周期開始時重置為參數輸入時的初始值,然後像上面餘弦退火部分描述的那樣,逐漸減小。

每當學習率下降到最小點,在上圖中為每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.

每個循環所包含的周期都是上一個循環的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

預先存在的架構提供了最先進的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函數,允許將分類變量快速轉換為嵌入矩陣。

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

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

在這類任務上,傳統做法是創建虛擬變量,即進行一次熱編碼。與之相比,這種方式的優點是用四個數值代替一個數值來描述每一天,因此可獲得更高的數據維度和更豐富的關係。

這種方法在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庫加載它就更容易了。

 空格表示Dropout函數的作用點

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, TTA)。這裡會為原始圖像造出多個不同版本,包括不同區域裁剪和更改縮放程度等,並將它們輸入到模型中;然後對多個版本進行計算得到平均輸出,作為圖像的最終輸出分數,可調用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/

掃碼回復「一起學習」

加入DF學習交流群 

DataFountain

中國領先的人工智慧協同創新平臺

基於Jupyter實驗環境,課程全部由中科院、頂尖AI專家打造,以專業技能的「學、練、訓、賽、評」閉環的人才培養思路為指導,提供在線學科相關課程及實驗練習環境。通過深入淺出的知識構架、海量真實案例庫、專業核心課程等內容教學,打造國內品質第一的人工智慧人才培養實訓平臺。首款針對傳統行業開發的數據分析及AI協同建模工具,打造企業內部「數據科學組織」,幫助企業高效探索數據科學任務。圍繞企業發展目標高效創造成果,沉澱項目、數據、經驗和技能,配合企業打造內部「數據科學組織」,致力於幫助企業高效探索數據科學任務、驅動企業增長,實現傳統行業的數位化轉型重要戰略。內部競賽:由大數據行業專家聯手打造的專業題庫,為企業提供自動化、可視化人才考評機制,協助企業高效組建AI人才隊伍。公開競賽:覆蓋政府、機構、高校、學會協會、企業等多層面尖端客戶,助力提高您的品牌影響力;通過數據競賽,精準打通企業與人才的橋梁,數十萬數據科學家助力突破企業的技術瓶頸,聚集全球領先的技術和算法方案,低成本解決大問題。

相關焦點

  • 有關藝術畫作分類的 Kaggle 比賽經驗分享
    在這個項目中,我將使用遷移學習和深度學習框架Keras對kaggle數據集中的不同藝術作品圖像進行分類。你將學到什麼!接下來調用「fit_generator()」來訓練模型,並添加「history」,這樣就可以可視化之後的訓練。
  • Kaggle知識點:偽標籤Pseudo Label
    在競賽中偽標籤不是萬能的,一般情況下偽標籤適用於:非結構化數據,使用深度學習的常見下;模型的精度較高的情況下,加入的偽標籤才精確;雖然Kernel機制防止了選手人工標註,但還是這屆選手有水平呀!軟標籤一般使用在模型蒸餾和某些數據集的訓練中,可以讓模型學習到樣本整體類別分布。
  • 最新Kaggle年度報告!年輕多金、年薪百萬的數據科學家你愛了嗎?
    基於 Python 的工具仍然在機器學習框架這一項上佔據主導,從統計結果可以看出,scikit-learn 適用於大部分項目,82.8% 的數據科學家都在使用它。各有 50% 左右的數據科學家使用過 TensorFlow 和 Keras,尤其是用於深度學習項目之中。
  • 【乾貨】圖神經網絡的十大學習資源分享
    字幕組雙語原文:【乾貨】圖神經網絡的十大學習資源分享英語原文:Top 10 Learning Resources for Graph Neural Networks>翻譯:雷鋒字幕組(聽風1996)圖神經網絡(GNNs)是深度學習的一個相對較新的領域,從最近開始越來越流行。
  • 幫你從頭到尾 帶打kaggle比賽,100%實戰
    你可能會想,為什麼每次都找不到讓自己滿意的工作?而別人卻可以。因為你在面試的時候,需要有一段優秀的項目實戰經驗放在簡歷裡,更重要的是,擁有一個完善的項目實經驗 能幫你更深層次的加深理解知識點,並在求職過程中,取得一個「質的飛躍」。
  • 在參加了39場Kaggle比賽之後,有人總結了一份圖像分割煉丹的「奇技淫巧」
    點擊上方「AI算法修煉營」,選擇加星標或「置頂」標題以下,全是乾貨一個經歷了 39 場
  • 圖像分類:13個Kaggle項目的經驗總結
    機器學習和圖像分類也不例外,工程師們可以通過參加像Kaggle這樣的競賽來展示最佳實踐。在這篇文章中,我將給你很多資源來學習,聚焦於從13個Kaggle比賽中挑選出的最好的Kaggle kernel。://www.kaggle.com/c/aesthetic-visual-analysis/notebooks數據每一個機器學習/深度學習解決方案都從原始數據開始。
  • 全面拆解Kaggle經典案例,100%實戰
    你可能會想,為什麼每次都找不到讓自己滿意的工作?而別人卻可以。因為你在面試的時候,需要有一段優秀的項目實戰經驗放在簡歷裡,更需要用一個完善的項目經驗,來歸納總結那些零零散散學到的內容,實打實地感受到自己掌握的技能。更重要的是,擁有一個完善的項目實戰的經驗能幫你更深層次的加深理解,並在求職過程中,取得一個「質的飛躍」。
  • 經驗 | 圖像分割的實用技巧
    39 場 Kaggle 比賽的團隊在 reddit 上發帖表示,他們整理了一份結構化的圖像分割技巧列表,涵蓋數據增強、建模、損失函數、訓練技巧等多個方面,不失為一份可以參考的圖像分割技巧資料。除了密切的團隊配合、給力的 GPU 配置等條件,技巧在這類比賽中也發揮了很大的作用。但這些技巧去哪裡找呢?Medium、大牛博客、參賽經驗帖中都散落著各種技巧分享,但這些資源往往比較零散,於是就有人想到,為什麼不把它們集中到一起呢?
  • kaggle、TDS、arXiv等,我最喜歡的數據科學資源
    你可以找到大量的教程,從經典的統計建模方法(線性回歸,ARIMA),到最新最偉大的機器/深度學習解決方案。文章總是非常實用,並且包含將特定概念應用到特定數據集的Python代碼。這個網站真正偉大的地方在於,Jason清楚地解釋了概念,也為那些想要深入了解理論背景的人提供了進一步地閱讀機會。你也可以按主題過濾所有文章,使得你只對不平衡學習或如何編寫你的第一個LSTM網絡感興趣。
  • 入門 | 深度學習模型的簡單優化技巧
    選自toward data science作者:Jonathan Balaban機器之心編譯參與:張倩、劉曉坤本文介紹了幾個深度學習模型的簡單優化技巧以下是我與同事和學生就如何優化深度模型進行的對話、消息和辯論的摘要。如果你發現了有影響力的技巧,請分享。首先,為什麼要改進模型?像卷積神經網絡(CNN)這樣的深度學習模型具有大量的參數;實際上,我們可以調用這些超參數,因為它們原本在模型中並沒有被優化。
  • 參賽3年,斬獲6金3銀2銅:Kaggle Grandmaster親授實戰經驗
    team 也是比 solo 高效多了,團隊裡有比你更勤奮,更有經驗,更多技巧的隊友那就走運了。終極武器是打出名氣後可以在最後階段搭金牌區的順風車(笑)。Q4: keras 患者。keras 還沒用紮實。學 pytorch 沒動力,但到處都是 pytorch,如何建立這種學習動力?更別說 tensorflow 了。
  • 深度學習的7個技巧,幫你訓練出好的模型
    ,不過和之前的那篇文章側重點有所不同,這篇文章更加注重於如何在實際的項目的數據集中訓練出好的模型出來,與其說是深度學習的技巧,不如說是深度學習項目的技巧。在這裡,我將和你分享7個實用的技巧,讓你充分利用你的深層神經網絡。1  數據,數據,數據這不是什麼大秘密。一直運轉良好的深度學習機器需要燃料——大量的燃料,這裡燃料就是數據。我們擁有的標註的數據越多,我們的模型的性能就越好。
  • 重啟數據科學:如何開啟第二次的學習?
    但隨著課程推進,可以通過實踐進行學習。在使用Pandas時,也許需要找到Python課程,回憶之前學習的概念。又或者碰到機器學習課程入門的新功能時,需要找到Pandas文件,對這些新功能進行了解。看起來有點兒亂,但實際上能幫你更好地掌握這些內容。通過前面5項課程,你會掌握必需的探索性資料分析技能以及創建基線模型的技能,接著就可以參加一些簡單的Kaggle競賽了,將所學的知識付諸實踐。
  • 圖神經網絡的十大學習資源分享
    字幕組雙語原文:【乾貨】圖神經網絡的十大學習資源分享英語原文:Top 10 Learning Resources for Graph Neural Networks翻譯:雷鋒字幕組(聽風1996)圖神經網絡(GNNs)是深度學習的一個相對較新的領域,從最近開始越來越流行。
  • 機器學習Kaggle入門,房價預測比賽
    現在這篇文章,會側重介紹kaggle的實際操作」現場「,方便大家去跟著思路學習進入到kaggle的真實世界,不僅知道怎麼做模型預測,還知道數據在哪下載,在哪提交。其次,這個房價預測的比賽相比之前的兩個案例是特徵多了很多,面對特徵突然」爆炸「,本文提供簡單的處理思路。
  • 重磅 | 帶學斯坦福CS231n計算機視覺課+帶打全球頂級kaggle大賽
    簡單來說,對於深度學習工程師真正看重的已經不是簡單的調包和調參,而是你對使用python實現底層框架的掌握程度。我們一位在京東AI研究院的老師也曾說,面試京東,考察的是應聘者底層框架的代碼實現能力,只有懂這些,才能明顯提高結果的準確率。但現在市面上99%的課程,大多是調包。並沒有教學生真正的原理,這也是為什麼很多大廠看不起只有培訓經驗的人。
  • 教程 | Kaggle CTO Ben Hamner :機器學習的八個步驟
    挑一個你感興趣的問題從一個你想要解決的問題而不是令人生畏的、不系統的主題列表(你可以從谷歌上搜索到很多的機器需誒心資源列表,這裡我就不在提供)出發,你會很容易地專注、主動學習。解決問題會促使你更深入更投入,而不是僅僅被動地閱讀一些有關機器學習的文章。
  • 參加了39場Kaggle比賽之後,有人總結了圖像分割煉丹的奇技淫巧
    機器之心報導機器之心編輯部一個經歷了 39 場 Kaggle 比賽的團隊在 reddit 上發帖表示,他們整理了一份結構化的圖像分割技巧列表,涵蓋數據增強、建模、損失函數、訓練技巧等多個方面,不失為一份可以參考的圖像分割技巧資料。
  • 深度高能粒子對撞追蹤:Kaggle TrackML粒子追蹤挑戰賽亞軍訪談
    為了幫忙解決這個問題,一個在 CGRN(世界上最大的高能物理實驗室)工作,由機器學習專家和物理學家組成的小組,已經與 kaggle 和著名的贊助商合作來回答這個問題:機器學習能幫助高能物理學發現並描述新粒子嗎?具體來說,在這次競賽中,參賽者們面臨著一個挑戰,那就是建立一個算法,它需要能夠從矽探測器上留下的 3D 點快速重建粒子軌跡。