當前位置:
首頁 > 最新 > 不需要大把的GPU如何贏得Kaggle比賽?fast.ai給出的十個技巧

不需要大把的GPU如何贏得Kaggle比賽?fast.ai給出的十個技巧

編譯:yxy

出品:ATYUN訂閱號

Jeremy Howard是fast.ai的聯合創始人,目前在Kaggle的植物幼苗分類競賽中獲得了第105名,但他的成績下降得很快。因為,他自己的學生擊敗了他。這群學生的名字現在已經在整個Kaggle的排行榜的頂部了。

那些讓新手在短短几周內實施世界級演算法的秘訣是什麼呢?他們是怎樣甩開經驗豐富的深度學習從業者的呢?讓我用分十個簡單的步驟告訴你。

文章閱讀說明(總之就是讓你繼續讀)

在我們開始之前,你應該知道需要訪問GPU才能有效地運行fast.ai內容。就我而言,我一直在使用FloydHub。經過對其他基於雲的解決方案的大量實驗和研究後,我發現FloydHub是在雲GPU上訓練深度學習模型的最佳且最簡單的方法。我喜歡能夠在FloydHub上的項目中輕鬆跟蹤我的實驗,並且可以輕易可視化和篩選最佳模型。他們還擁有最簡單的解決方案來管理(並自動版本化)你的數據集,你將了解到,在任何DL項目中,這些解決方案都是非常有價值的。

好的,讓我們開始吧。


fast.ai庫不僅是讓新手快速實施深度學習的工具包,而且是當前最佳實踐的強大而便捷的來源。每當fast.ai團隊(以及他們的AI研究人員和合作者網路)發現一篇特別有趣的論文時,他們就會在各種數據集上進行測試,並找出優化它的方法。如果它們成功,它將在庫中實現,並且用戶可以快速訪問該技術。

最後,生成一個功能強大的工具箱,包括快速訪問最佳實踐,例如帶重啟的隨機梯度下降(Stochastic Gradient Descent with restarts),差分學習率(Differential Learning rates)和 test-time augmentation(更不用說更多)。

下面將介紹這些技術中的每一種,我們將展示如何使用fast.ai庫快速實現它們。該庫是基於PyTorch構建。要開始使用FloydHub上的庫,請查看安裝說明。

安裝:https://docs.floydhub.com/getstarted/get_started/


差異學習率意味著在訓練期間更高層的變化比更深層要大。在預先存在的架構之上構建深度學習模型是一種經過驗證的可以在計算機視覺任務中產生更好結果的方法。大多數這些架構(即Resnet,VGG,初始......)都是在ImageNet上進行訓練的,根據數據與ImageNet上的圖像的相似度,這些權重需要或多或少地進行修改。在修改這些權重時,模型的最後幾層通常需要進行最大的修改,而已經訓練好的且檢測基本特徵(例如邊緣和輪廓)的較深的層則需要更少的修改。

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

from fastai.conv_learner import *# import library for creating learning object for convolutional #networksmodel = VVG16()# assign model to resnet, vgg, or even your own custom modelPATH = "./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 folderslearn = ConvLearner.pretrained(model, data, precompute=True)# create a learn object to quickly utilise state of the art# techniques from the fast ai library

通過現在已經創建的學習對象,我們可以解決通過快速凍結第一層來精細調優最後一層的問題:

learn.freeze()# freeze layers up to the last one, so weights will not be updated.learning_rate = 0.1learn.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 updatedlearning_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


學習率是訓練神經網路最重要的超參數,但直到最近才確定它的價值。萊斯利?史密斯(Leslie Smith)在論文中偶然發現了答案;一個相對冷門的發現,直到它被fast.ai課程推廣。

論文:https://arxiv.org/abs/1506.01186

在這種方法中,我們進行試運行並使用較低的學習率訓練神經網路,但每個批次以指數方式增加它。使用以下代碼:

每次迭代,學習率都呈指數增長

同時,為學習率的每個值記錄損失。然後我們根據學習率繪製損失:

找出損失仍在減少但尚未穩定的地方。

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


隨著每次隨機梯度下降(SGD),網路應該越來越接近損失的全局最小值。因為它越來越接近這個最小值,因此學習率應該變得更小以使你的演算法不會超調,而是儘可能接近這個全局最小值。餘弦退火通過降低餘弦函數控制的學習率來解決這個問題,如下圖所示。

隨著我們增加x,我們看到餘弦(x)隨著這個波浪形減少。

從上面的圖中,我們看到隨著我們增加x,餘弦值首先緩慢下降,然後變快,然後再稍微慢一些。這種降低模式與學習率很好地集合,在計算效率方面產生很好的結果。

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

該技術在使用learn.fit()時由fast ai庫自動實現。上面的代碼將使我們的學習率在整個周期內降低,如下圖所示。

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

然後,我們甚至可以更進一步,引入重啟


在訓練期間,梯度下降可能會陷入局部最小值而非全局最小值。

梯度下降可能會陷入局部最小值

通過突然提高學習率,梯度下降可以「跳出」局部最小值並找到通向全局最小值的路。這樣做被稱為帶重啟的隨機梯度下降(SGDR),這一想法在Loshchilov和Hutter的論文中被證明是非常有效。

fast.ai庫也會自動為你處理SGDR。在調用learn.fit(learning_rate, epochs)時,學習率在每個紀元的開始處重置為你作為參數輸入的初始值,然後在餘弦退火中如上所述在周期上再次減小。

在每個周期之後,學習率恢復到其原始值。

每次學習率下降到最小點(上圖中每100次迭代),我們稱之為循環(cycle)。

cycle_len = 1# decide how many epochs it takes for the learning rate to fall to# its minimum point. In this case, 1 epochcycle_mult=2# at the end of each cycle, multiply the cycle_len value by 2learn.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用戶在圖像分類問題上表現良好的關鍵技術。

並進行了討論:http://forums.fast.ai/t/understanding-cycle-len-and-cycle-mult/9413/8


Softmax喜歡只挑選一件事。Sigmoid想知道你在-1和1之間的位置,超出這些值就不再關心你增加了多少。Relu是一名俱樂部保鏢,他不會讓負數進門。

以這種方式討論激活函數似乎很傻,但給它們賦予「性格」可以確保不將它們用於錯誤的任務。正如傑里米·霍華德所指出的那樣,即使是學術論文也經常使用softmax進行多類分類,而且在我研究DL的短暫時間裡,也曾在博客和論文中看到過它被錯誤地使用。

正如使用預訓練的模型已被證明在計算機視覺中非常有效一樣,自然語言處理(NLP)模型可以從此受益。

在fast.ai 的第4課中,傑里米·霍華德建立了一個模型,通過遷移學習來確定IMDB評論是積極的還是消極的。效果立竿見影,他所達到的準確性超過了Bradbury等人在論文中提出的所有先前的努力。

現有的架構提供最先進的NLP結果。

成功的秘訣在於首先訓練模型以獲得對語言的一些理解,然後再使用這種預訓練的模型作為模型的一部分來分析情緒。

為了創建第一模型,訓練遞歸神經網路(RNN)以預測文本序列中的下一個單詞。這就是眾所周知的語言建模。一旦網路經過高度準確的訓練,其對每個單詞的編碼就會傳遞給用於情感分析的新模型。

在該示例中,我們看到該語言模型與模型集成以執行情感分析,而同樣的方法可以用於從翻譯到數據提取的任何NLP任務。

再次,同樣的原理也適用於計算機視覺,在這裡凍結(freezing )和使用差分學習率可以產生更好的結果。

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


Fast.ai展示了在結構化數據上快速生成出色結果的技術,無需藉助特徵工程或應用領域特定知識。

他們的庫充分利用了PyTorch的嵌入功能,允許將分類變數快速轉換為嵌入矩陣。

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

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

與創建虛擬變數(即執行獨熱編碼)的傳統方法相比,這樣做的好處是可以用四個數字代替一個數字,因此我們獲得更高的維度和更豐富的關係。

在Rossman Kaggle競賽中,本節課展示的實現獲得了第三名。

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


4月30日,fast.ai團隊在Imagenet和CIFAR10分類上贏得了DAWNBench競賽(由斯坦福大學主辦)。在Jeremy將自己的成功歸功於fast.ai庫中的一些額外功能。

其中之一是,兩年前Geoffrey Hinton在提出的Dropout概念。儘管它最初受歡迎,但在最近的計算機視覺論文中,它似乎有些被忽視了。然而,PyTorch使其實現變得異常簡單,並且在fast.ai的支持下,它比以往更容易。

空格表示由Dropout函數敲除的激活。

Dropout克服了過擬合問題,因此在CIFAR10這樣一個相對較小的數據集上獲勝是非常重要的。在創建學習對象時,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

他們用於解決過擬合和提高準確性的另一種非常簡單有效的方法是對較小的圖像尺寸進行訓練,然後再增加尺寸再次訓練相同的模型。

最後一種可以將精確度提高1%或2%的技術是TTA(test time augmentation)。這涉及捕捉原始圖像的一系列不同版本(例如裁剪不同區域,或更改縮放)並通過模型傳遞它們。然後計算不同版本的平均輸出,並將其作為圖像的最終輸出分數。可以通過運行learn.TTA()來調用它。

preds, target = learn.TTA()

這種技術很有效,因為原始的圖像裁剪可能會漏掉一個必要的特徵。為模型提供圖片的多個版本並取平均值會降低這種影響。


fast.ai團隊不僅在DAWNBench比賽中以最快的速度贏得了大獎,而且這些演算法也因為最便宜的運行而獲得了獎勵。這裡要吸取的教訓是,創建成功的DL應用程序不僅僅是在這個問題上拋棄大量的GPU,而是一個關於創造力、直覺和創新的問題。

本文中討論的大多數突破實際上就是有人想以不同的方式解決問題的時候誕生的。

不要以為你不能挑戰谷歌的大牛或者大型的GPU。事實上,時你可以把約束看成是一種祝福;畢竟,需要是發明之母。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ATYUN訂閱號 的精彩文章:

MIT研究團隊開發由磁鐵控制的小型機器人,可在人體內提供治療
微軟改進Face API,顯著降低膚色識別錯誤率

TAG:ATYUN訂閱號 |