10大稱霸Kaggle的深度學習技巧
本文約4032字,建議閱讀10分鐘。
一位法國學員為你分享他從fast.ai學來的十大技藝,助你短期內快速掌握並能構建最先進的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
在這種方法中,我們嘗試使用較低學習率來訓練神經網路,但是在每個批次中以指數形式增加,相應代碼如下:
每次迭代後學習率以指數形式增長
同時,記錄每個學習率對應的Loss值,然後畫出學習率和Loss值的關係圖:
找出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


※對話清華大學周昊,詳解IJCAI傑出論文及其背後的故事
※招生簡章@2018年第五屆清華大學大數據社會科學講習班
TAG:數據派THU |