翻譯 | AI科技大本營
參與 | 劉暢
[AI 科技大本營導讀]2017年,許多的人工智慧演算法得到了實踐和應用。名博Hack Noon作者 Brian Muhia 認為想要玩轉人工智慧,不僅要擁有必要的數學背景知識,還需要擁有實際的人工智慧專案經驗。
因此,Muhia參加了一個叫AI Grant的人工智慧比賽,並在去年9月,申請了 fast.ai 網站上傑里米·霍華德(Jeremy Howard)教授的“實用深度學習”(Practical Deep Learning for Coders,第二版)的第一部分。
僅用了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。
Muhia 設計了一個類似於狗與貓競賽的分類任務,即分類蜘蛛與蠍子圖片(Spiders vs. Scorpions)。通過在谷歌上搜尋“蜘蛛”和“沙漠蠍子”,作者從Google Images上下載了約1500張圖片,然後作者從中去除了非jpg影象和不完整的影象。剩下大約815張圖片用作任務分類的資料。
訓練集中每個類 [spiders,scorpions] 有290張圖片,在測試/驗證集中有118張蜘蛛圖片和117張蠍子圖片。通過一系列訓練後,作者採用的模型擁有高達95%的分類準確率。
如何構建任意類別(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