八大深度學習最佳實踐

翻譯 | AI科技大本營
參與 | 劉暢


[AI 科技大本營導讀]2017年,許多的人工智能算法獲得了實踐和應用。名博Hack Noon做者 Brian Muhia 認爲想要玩轉人工智能,不只要擁有必要的數學背景知識,還須要擁有實際的人工智能項目經驗。算法

所以,Muhia參加了一個叫AI Grant的人工智能比賽,並在去年9月,申請了 fast.ai 網站上傑里米·霍華德(Jeremy Howard)教授的「實用深度學習」(Practical Deep Learning for Coders,第二版)的第一部分。redux

僅用了7周多,Muhia 就學會了如何使用8種人工智能技術來進行工程實踐,並進行了概括整理。網絡

對於每一種實踐方法,Muhia 都用了簡短的 fastai 代碼來概述整體思想,並指出該技術是否廣泛適用,例如:對於圖像識別和分類,天然語言處理,對結構化數據或協同過濾進行建模),或者對於某種特定的深度學習的數據類型。架構

原做者注:在這篇博文中,圖像識別技術使用的數據集來自於Kaggle上的兩個競賽。框架

Dogs vs. Cats: Kernels Edition, Dog Breed Identification
連接:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/
Planet: Understanding the Amazon from Space
連接:https://www.kaggle.com/c/planet-understanding-the-amazon-from-space

文中提到的全部實踐方法都是經過 Jupyter Notebook 這個高效接口來完成的,PyTorch 自己和 fastai 深度學習庫均支持 Jupyter Notebook。ide

Muhia 設計了一個相似於狗與貓競賽的分類任務,即分類蜘蛛與蠍子圖片(Spiders vs. Scorpions)。經過在谷歌上搜索「蜘蛛」和「沙漠蠍子」,做者從Google Images上下載了約1500張圖片,而後做者從中去除了非jpg圖像和不完整的圖像。剩下大約815張圖片用做任務分類的數據。函數

訓練集中每一個類 [spiders,scorpions] 有290張圖片,在測試/驗證集中有118張蜘蛛圖片和117張蠍子圖片。經過一系列訓練後,做者採用的模型擁有高達95%的分類準確率。工具

post

如何構建任意類別(world-class)的圖像分類器性能

八大深度學習最佳實踐

1. 經過微調的VGG-16和ResNext50模型來完成遷移學習(用於計算機視覺和圖像分類)

一般,對於圖像分類任務,採用神經網絡架構效果廣泛較好,針對具體問題,你能夠經過微調效果較好的神經網絡,來大幅改善分類器的性能。。

50層的卷積神經網絡-殘差網絡 ResNext50 就是一個不錯的選擇。該網絡使用了 ImageNet 數據集上的1000種類別進行了預訓練,效果表現很是好。它能夠將圖像數據中的特徵進行提取並屢次利用。

當咱們想要用它來解決實際問題時,咱們只需替換掉最後的輸出層,即用一個二維的輸出層替換原來 ImageNet 任務中的1000維輸出層。這兩個輸出類別存在於上面代碼片斷中的PATH文件夾中。

對於蜘蛛與蠍子分類任務的挑戰,我認爲如下幾點須要注意:



請注意,訓練集文件夾的兩個內容自己就是文件夾,每一個文件夾包含了290張圖像。

下圖顯示了一個微調過程的示例圖,它將最終層輸出從1000維調成了10維:



2. 週期性學習率(一般適用)

學習率應該是訓練深層神經網絡最重要的超參數。一種廣泛的作法是:在一個非自適應設置中(即不使用 Adam、AdaDelta 或它們變體的算法),由深度學習工程師/研究員進行多組並行實驗,每組實驗在學習率上有微小的差別。這種作法對數據和參與人員的要求都極高,經驗的缺失或者數據集龐大且易出錯均可能使整個過程消耗更多的時間。

然而,在2015年,美國海軍研究實驗室的Leslie N. Smith發現了一種自動搜索最有學習率的方法,即從極小值開始,在網絡中運行一些小批量( mini-batch )數據,調整學習率的同時觀察損失值的變化,直到損失值開始下降。

這裏有兩個fast.ai的學生解釋週期性學習速率方法的博客。

  • http://teleported.in/posts/cyclic-learning-rate/

  • https://techburst.io/improving-the-way-we-work-with-learning-rate-5e99554f163b

在fastai中,你只需在學習的對象上運行lr_find()函數,學習率退火算法就能發揮效用。同時,sched.plot()函數能夠用來肯定與最優學習速率相一致的點。



0.1彷佛是一個不錯的學習率

下面論文中的數據代表:0.1的學習率表現更好,能達到最高的準確性,而且在衰減速度上比原始的學習率和指數級的學習率快了兩倍。



Smith (2017) 「Cyclical learning rates for training neural networks.」

3. 可重啓的隨即梯度降低



SGD vs. snapshot ensembles (Huang et al., 2017)

另外一種加速隨機梯度降低的方法是,隨着訓練的進行,逐漸下降學習的速率。這種方法有助於觀察學習速率的變化與損失值的改善是否一致。當模型的參數接近最佳權重時,你須要採起更小的移動步長,由於若是步長過大,你可能會跳過損失值表面的最佳區域。

若是學習率和損失值之間的關係不穩定,即若是學習率中一個微小的變化就致使損失值的巨大變化。這就代表,當前的最優勢還不在一個穩定的區域(如上面的圖2所示)。應對策略則是週期性地提升學習率。

這裏的「週期」是指提升學習率的次數。在 fastai 中,可使用 cycle_len 和 cycle_mult 參數來設置 learner.fit。

在上面的圖2中,學習速率被重置了3次。在使用正常的學習速率時間表時,一般須要更長的時間才能找到最佳的損失。在這種狀況下,開發人員會等待全部的時間點完成後,再嘗試不一樣的學習速率。



4. 數據加強(計算機視覺和圖像分類任務 —如今的方法)

數據加強能夠用來增長現有的訓練和測試數據量。對於圖像問題,則取決於數據集中具備對稱性質的圖像數量。

一個例子是蜘蛛與蠍子圖片分類的挑戰。 在這個數據集中,許多圖片進行了垂直變換後,裏面的動物仍能正常顯示。 這就是所謂的 transforms_side_on。



從上到下,注意圖片不一樣角度的縮放和反射

5. 測試時間進行數據加強(計算機視覺和圖像分類任務 —如今的方法)

咱們也能夠在推理時間(或測試時間)中使用數據加強。在推理預測的時候,你可使用測試集中的單個圖像來完成數據加強。可是,若是訪問的測試集中的每一個圖像都能隨機生成幾個增量圖片,則該過程會變得更加魯棒。在fastai中,我在預測時使用了每一個測試圖像的4個隨機增量,並將各個預測的平均值用做該圖像的預測。

6. 用預訓練的循環神經網絡替換詞向量(word vectors)

這是一種不使用詞向量就能夠得到任意類別的情感分析框架方法。它的原理是,將須要分析的整個訓練數據進行集中,並從中構建一個深層的循環神經網絡語言模型。當訓練的模型精度增高時,就將此時模型的編碼器保存,並使用從編碼器中得到的嵌入來構建情感分析模型。

用循環神經網絡要優於單詞向量得到的嵌入矩陣,它能夠比單詞向量更好地追蹤長距離的依賴性。

7. 時間反向傳播(BPTT)(用於NLP)

深度循環神經網絡的隱藏狀態每每會隨着反向傳播的訓練時間變得愈來愈臃腫,也變得難以處理。

例如,在處理字符的循環神經網絡時,若是你有一百萬個字符,那麼你就須要創建一百萬個隱藏狀態向量以及他們對應的歷史信息。爲了訓練神經網絡,咱們還須要對每一個字符執行相同數量級的鏈式計算法則。這將消耗巨大的內存和計算資源。

因此,爲了下降內存需求,咱們設置了最大的反向傳播距離。因爲循環神經網絡中的每一個循環至關於一個時間步長,因此限制反向傳播並保持隱藏狀態的歷史層數的任務被稱爲時間反向傳播。雖然這個數字的值決定了模型計算的時間和內存要求,但它同時提升了模型處理長句或動做序列的能力。

8. 分類變量實體向量化。 (用於結構化數據和NLP)

當對結構化的數據集進行深度學習時,該方法能將包含連續數據的列,例如在線商店中的價格信息,和分類數據的列,例如,日期和接送地點等,以此進行區分。而後,這些分類列的單熱 (one-hot) 編碼過程會被轉換爲指向神經網絡全鏈接層的查找表。所以,神經網絡模型就有機會繞過列的分類性質,去了解那些被忽略的分類變量/列的信息。

這種方法能夠用來學習多年的數據集的週期性規律,例如一週中的哪一天銷售量最大,公衆假期以前和以後發生了什麼事。

這樣作的最終結果是能產生一個很是有效的方法,它能幫助協同過濾和預測產品的最優訂價。這也是目前全部擁有表格數據的公司進行標準數據分析和預測的方法。



結語

這一年來,深度學習進步斐然。大批研究人員和從業人員的努力,使得數據集和CPU愈來愈完善,開源的深度學習框架和工具也愈來愈多。

目前,咱們尚未創造出通用人工智能,可是咱們已經能夠將深度學習運用到不一樣的領域了。不過,我更期待人工智能在於教育和醫學領域的運用,尤爲是復興生物技術。由於,這會創造出更多的可能性。

做者 | Brian Muhia

原文連接

https://medium.com/@muhia/8-deep-learning-best-practices-i-learned-about-in-2017-700f32409512

相關文章
相關標籤/搜索