不知道如何提升深度學習效能?我們為你整理了這份速查清單
公眾號/AI前線
作者 | Christopher Dossman
譯者 | 姚佳靈
編輯 | Vincent
AI 前線導讀:我被問到最多的問題是“我如何獲得更高的精度?”。機器學習工程師,無論是新手還是有經驗的,都會問這個問題。
因為對業務來講,機器學習最有價值的地方通常是它的預測能力,所以這個問題很有意義。提高預測精度是從現有系統中榨取更多價值的簡單方法。
本指南將分成 4 個不同的部分,每個部分都包含一些策略。
– 資料優化(Data Optimization)
– 演算法調整(Algorithm tuning)
– 超引數優化(Hyper-Parameter Optimization)
– 合併,合併還是合併(Ensembles, Ensembles, Ensembles)
並非所有這些想法都可以提升效能,越把它們應用到同樣的問題上,就越能看到有限的效果。如果嘗試了它們中的一些還是沒有起色?那就表明,應該重新考慮一下業務問題的核心解決方案了。本文只是一張速查單,因此,在每個部分,我都會給出更詳細資源的連結。
更多優質內容請關注微信公眾號“AI 前線”(ID:ai-front)
資料優化
平衡資料集(Balance your data set)
如果是分類問題,那麼,提高表現不佳的深度學習模型效能的最簡單方法之一是平衡資料集。真實世界的資料集通常是不平衡的,如果希望有最好的精度,那麼深度學習系統要學習如何在兩個類之間根據特徵而不是通過複製它的分佈進行選擇。
常用方法包括:
- 二次取樣多數類(Subsample Majority Class) :可以通過對多數類進行二次取樣來平衡類分佈。
- 過度取樣少數類(Oversample Minority Class) :可以使用替換取樣來提高少數類的比例。
這裡有篇好文章,它詳細介紹了處理這個問題的更多細節:
http://amsantac.co/blog/en/2016/09/20/balanced-image-classification-r.html
更多資料
我們中的許多人都熟悉這張圖。它顯示了深度學習和分類機器學習方法中資料的數量和效能之間的關係。如果你不知道這個,那麼試試這個清晰明瞭的課程。如果想要模型有更好的效能,就需要有更多資料。這取決於可以選擇的預算以建立更多標籤資料或收集更多沒有標籤的資料,並更多地訓練特徵提取子模型。
開源標籤軟體
- 影象(Images):https://github.com/Labelbox/Labelbox
- 音訊(Audio):http://www.fon.hum.uva.nl/praat/
- 視訊(Video):http://www.anvil-software.org/
生成更多資料
或者假裝一下,直到成功。用於提高精度一個常被忽視的方法是,從已有的資料中建立新資料。以照片為例,工程師常常通過旋轉和隨機移動現有影象來建立更多圖片。這種變換還增加了訓練集的減弱過度擬合。
這裡有一個建立更多資料的絕佳資源,可以用於影象問題:
https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced
演算法調整
複製研究人員的方法
你是否正在研究一個問題,而該問題的背後有很多研究?如果是的,那麼你很走運,因為可能有很多工程師已經考慮過如何為該問題獲取更好的精度。讀讀跟這個主題有關的研究論文並注意他們用來解決問題的不同方法!甚至,他們或許已經在 GitHub 上釋出了程式碼,而這些程式碼讓你愛不釋手。
谷歌學術搜尋(Google Scholar)是開始進行搜尋的絕佳地方。他們還提供很多工具幫助你尋找相關的研究。
我使用 Mendeley 來儲存和組織研究論文。
演算法抽查
你不是失敗者,你只是還沒成功。無法知道哪個機器學習演算法最適合用來解決問題。每當我碰到新問題時,如果新問題背後沒有很多研究方法,那麼我會看看一些可用的方法,並全部試上一遍。
深度學習(CNN、RNN 等等)和經典機器學習方法(隨機森林、梯度提升等等)。
對所有試驗結果進行排序,然後對錶現最佳的演算法進行加倍。
檢視資料驅動方法來選擇機器學習演算法:
https://machinelearningmastery.com/a-data-driven-approach-to-machine-learning/
超引數優化
學習速率(Learning rates)
亞當優化演算法(the Adam optimization algorithm)是經過驗證的。它在所有的深度學習問題常常有令人驚訝的結果。即使它有出色的效能,但是它仍然會讓你深陷區域性最小問題的迷津。具有亞當優化演算法的好處,並有助於消除陷入區域性最小問題迷津的一個更好的演算法是熱重啟的隨機梯度下降法(Stochastic Gradient Descent with Warm Restarts)。
關於學習速率的好文章在這裡:
https://towardsdatascience.com/estimating-optimal-learning-rate-for-a-deep-neural-network-ce32f2556ce0
批(batch)的大小和期(epoch)的數量
標準程式使用具有大量的期的大型批來處理現代深度學習實施,但是共同的策略產生共同的結果。用你的批大小和訓練期的數量來做試驗。
提前停止(Early Stopping)
這是減少深度學習系統泛化錯誤的絕佳方法。持續訓練也許會提高資料集上的精度,但是到了某一時刻,在模型尚未觀察到的資料上的模型精度就會降低。為了提高真實世界的效能,試試提前停止。
提前停止的示例:
https://stats.stackexchange.com/questions/231061/how-to-use-early-stopping-properly-for-training-deep-neural-network
網路架構(Network Architecture)
如果想試試一些更有趣的東西,那就試試高效的神經架構搜尋(Efficient Neural Architecture Search ,簡稱 ENAS)。該演算法將建立一個自定義網路設計,在資料集上把精度最大化,比起雲機器學習用到的標準神經架構搜尋更高效。
正則化(Regularization)
停止過度擬合的有效方法是使用正則化。有很多不同方法來使用正則化,可以在深度學習專案上訓練。如果還沒有嘗試過這些方法,那麼我建議在每個專案中都試試。
- Dropout:在訓練期間中,它們隨機關閉一定比例的神經元。Dropout 有助於防止神經元組對自己的過度擬合。
- 權重損失 L1 和 L2(Weight penalty L1 and L2):權重在大小上失控是深度學習中的真正問題,並會降低精度。其中的一個解決方法是給所有權重新增衰減。
這些嘗試保持在網路中的所有權重儘可能小,除非有大的梯度可以抵消它。除了經常提高效能之外,它還有易於理解模型的好處。
合併,合併還是合併
無法選擇最好的模型來用?通常,可以把不同模型的輸出組合一下,獲得更好的精度。這些演算法中的每一個都有兩個步驟。
- 在原始資料的子集上生成簡單機器學習模型的分佈
- 把該分佈合併成一個“聚合”模型
合併模型 / 檢視(Bagging)
在這種方法中,可以在同樣的資料上訓練一些不同的模型,這些模型在某種程度上有所不同,然後把這些輸出平均一下以建立最終輸出。Bagging 可以減少模型中的變化。可以直觀地把它看作具有不同背景的人對同一個問題進行思考,但是這些人具有不同的起始位置。就像在團隊中一樣,可以成為獲得正確答案的有力工具。
堆積(Stacking)
這類似於 bagging,區別是沒有經驗公式來計算合併的輸出。可以建立基於輸入資料的元級學習器,選擇如何給來自不同模型的結果賦予權重,以產生最終輸出。
還有問題?
重構問題
休息一下吧。這個方案是從頭開始重新考慮問題。我發現這有助於集思廣益來解決問題。可以從問問自己這些簡單問題開始:
- 分類問題是迴歸問題還是相反?
- 可以把問題分解成更小的問題嗎?
- 有沒有收集有關資料的觀察結果,而這些結果可能改變問題的範圍?
- 二進位制輸出是否可以變成 softmax 輸出,還是相反?
- 是否在用最有效的方式來看待這個問題?
重新考慮問題是提高效能最難的方法,但是,它常常會產生最好的結果。和其他有深度學習經驗的人聊聊,有助於找到解決問題的新方法。
閱讀英文原文:
https://towardsdatascience.com/deep-learning-performance-cheat-sheet-21374b9c4f45