經典 | 深度學習的7大實用技巧

編譯 | AI科技大本營

參與 | 林椿眄

編輯 | 谷 磊

對於許多具有挑戰性的現實問題,深度學習已經成為最有效的解決方法。

例如,對於目標檢測,語音識別和語言翻譯等問題,深度學習能夠表現出最佳的性能。許多人認為深度神經網路(DNNs)是一種神奇的黑盒子,我們只需要輸入一堆數據,網路就能夠輸出我們所要的解決方案!但是,在實踐中我們往往會碰到更多、更複雜的問題。

在設計網路模型並將DNNs應用到一個特定的問題上,往往會遇到很多挑戰。對於某一特定的實際問題,我們需要根據實際應用,正確地設計並訓練網路模型,同時數據的準備工作也是至關重要的,這將直接影響模型的訓練和推理過程。

通過這篇博文,我將與大家分享7個深度學習實用技巧,教你如何讓深度神經網路發揮最大作用。

Advertisements

1、數據!數據!數據!

眾所周知的是,如果把深度學習比作一台大型的機器,那麼數據就好比是這台機器的燃料,同時它的數量也能決定深度學習這台機器的性能好壞。有標籤的數據越多,模型的性能越好。

對於「更多的數據導致更好的性能」的這個觀點,已經得到了業界的一致認同,有興趣的可以看看這篇題為《重溫深度學習時代數據不可思議的有效性》的文章

(https://arxiv.org/abs/1707.02968),進一步了解谷歌公司關於大規模數據的探索以及3億張圖像數據集的構建!

在實際應用中,部署一個深度學習模型時你需要不斷地為其提供更多的數據,並通過微調參數來進一步提高模型的性能。如果你想提高模型性能的話,那就儘可能獲得更多的數據吧!

Advertisements

增加數據量能夠穩定地提高模型的性能

2、你應該使用哪種優化器呢?

經過多年的探索,研究人員開發了不同的梯度下降優化演算法(SGD),但各有各的優缺點。常被廣泛使用的演算法包括:

  • 帶動量的隨機梯度下降法

  • žAdam法

  • RMSprop法

  • Adadelta法

其中,RMSprop,Adadelta和Adam法都是一種自適應優化演算法,因為它們會自動更新學習速率。如果使用普通的隨機梯度下降法,你需要手動地選擇學習率和動量參數,設置動量參數是為了隨著時間的推移來不斷地降低學習率。

在實踐中,自適應優化器往往比普通的梯度下降法更快地讓模型達到收斂狀態。然而,選擇這些優化器的模型最終性能通常都不太好,而普通的梯度下降法通常能夠達到更好的收斂最小值,從而獲得更好的模型性能,但這可能比某些優化程序需要更多的收斂時間。此外,隨機梯度下降法也更依賴於有效的初始化方法和學習速率衰減指數的設置,這在實踐中是很難確定的。

因此,如果你只是想快速地獲得一些結果,或者只是想測試一個新的技術,自適應優化器將會是不錯的選擇。Adam是個容易上手的自適應優化器,因為它對初始學習率的設置沒有很嚴格的要求,對於學習率的變化過程也並不是很敏感,因此非常利於深度學習模型的部署。如果你想獲得模型的最優性能,可以嘗試選擇帶動量的隨機梯度下降法,並通過設置學習率,衰減率和動量參數來最大化模型的性能。

最近的研究表明,你可以混合地使用兩類優化器:由Adam優化器過渡到隨機梯度下降法來優化模型,能夠獲得最頂尖的訓練模型!具體的做法是,在訓練的早期階段,往往是模型參數的初始化和調整非常敏感的時候。因此,我們可以使用Adam優化器來啟動模型的訓練,這將為模型的訓練節省很多參數初始化和微調的時間。一旦模型的性能有所起伏,我們就可以切換到帶動量的隨機梯度下降法來進一步優化我們的模型,以達到最佳的性能!

Adam與SGD的性能對比。

由於自適應優化演算法能夠自適應地設置學習率,其魯棒性更好,

因此Adam在訓練的初期性能更佳,

而SGD能夠在訓練結束后獲得更好的全局最小值。

3、如何處理數據不平衡問題

在實際應用中,很多情況下我們將面對不平衡的數據分佈。舉一個簡單的實際例子:你要訓練一個深度網路來預測視頻Feed流中是否有人持有致命武器。但是訓練數據中,只有50個視頻中有拿著武器的人以及1000個不帶武器的視頻!如果只是用這些數據來訓練深度學習網路的話,那麼模型的性能將不會很好,預測的結果也將偏向於沒有武器!這種情況下,我們可以通過一些方法來解決數據的不平衡問題:

  • 對損失函數使用類別權重。簡單地說,對於數據量小,代表性不足的類別,在損失函數中使用較高的權重值,這樣的話對該類的任何錯誤都將導致非常大的損失值,以此來懲罰錯誤分類。

  • 過度抽樣:對於數據量小,代表性不足的訓練樣本,重複地進行採樣,這有助於平衡數據類別的分佈。對於一些很小的數據集來說,這是解決數據不均衡問題的最好方式。

  • 欠採樣:對於數據量大的類別,在模型訓練過程匯總可以簡單地跳過而不去選擇這些數據,這也能一定程度上緩解數據的不平衡現象,特別對於大數據集而言。

  • 數據增強(對少樣本的類別):可以對數據量不足的類別做數據增強操作,生成更多的訓練樣本!例如,在上面檢測致命武器的例子中,你可以改變那些帶致命武器視頻的顏色和光照條件,來生成更多的視頻數據。

4、遷移學習

正如上面所說的,深度學習模型通常需要大量的數據,數據量越多,模型的性能也將越好。然而,對於一些應用程序來說,大數據的獲取可能很困難,標記數據的成本花費也很高。如果我們希望模型的性能達到最佳的話,那麼可能至少需要數十萬級的數據來訓練深度模型。不僅如此,對於不帶標籤的數據,我們還需要手動地標記數據,這是項非常耗費成本的工作。

面對這種情況,遷移學習將展現其強大的一面。應用遷移學習策略,在不需要太多的訓練數據的情況下就能夠讓我們的模型達到最優的性能!舉個例子,例如在百萬級ImageNet資料庫上預訓練ResNet模型。然後凍結模型的前幾層權重參數,用我們的數據重訓練模型的最後幾層並微調ResNet模型。

如此,通過重訓練ResNet模型的部分層,我們就可以微調模型學到的圖像特徵信息,以便將其遷移應用於不同的任務。這是完全有可能實現的,因為圖像的低層特徵通常都是非常相似的,而高層次的特徵則會隨著應用的不同而改變。

遷移學習的基本流程

5、數據增強:快速而簡單地提高模型性能

我們反覆地提到:更多的數據 =更好的模型表現。除了遷移學習之外,提高模型性能的另一種快速而簡單的方法是數據增強。數據增強操作是在保證數據原始類別標籤的同時,對一些原始圖像進行非線性的圖像變換,來生成/合成新的訓練樣本。常見的圖像數據增強方式包括:

  • 水平或垂直旋轉/翻轉圖像

  • 隨機改變圖像的亮度和顏色

  • 隨機模糊圖像

  • 隨機裁剪圖像

基本上,你可以對圖像進行任何操作,改變圖像的外觀,但不能改變整體的內容。即對於一張狗的照片,你可以改變它的大小、角度、顏色、清晰度等,但你要保證它仍然是一張狗的照片。

豐富的數據增強樣本

6、集成你的模型!

在機器學習中,同時訓練多個模型,然後將它們組合在一起能夠獲得更高的整體性能。具體地說,對弈一個特定的任務,在相同的數據集上同時訓練多個深度網路模型。然後,組合模型並通過投票的方式為每個模型分配不同的權重值。最終根據模型的整體性能決定最優的組合方案。

為了保證每個訓練模型都有一定的差異性,我們可以對權重進行隨機初始化來處理訓練模型,還可以通過隨機地數據增強來豐富我們的訓練數據。一般說來,通過組合多個模型得到的集成模型通常會比單個模型的性能更好,因此這也更貼近實際應用的需要。特別地,在一些比賽中,獲勝方通常都是採用集成模型追求更佳的整體性能,來解決實際問題。

集成模型

7、剪枝——為你的訓練提速

隨著模型深度的增加,模型性能也將更好,但模型的訓練速度又如何呢?層數越深意味著參數量更多,而更多的參數意味著更多的計算和更多的內存消耗,訓練速度也將變慢。理想情況下,我們希望在提高訓練速度的同時保持模型的高性能。這可以通過剪枝來實現。

剪枝的核心思想是,深度網路中存在許多冗餘參數,這些參數對模型的輸出沒有太大貢獻。我們可以按網路的輸出貢獻來排列網路中的神經元,將排名低的那些神經元移除我們的模型,這樣就可以得到一個更小、更快的網路。此外,還可以根據神經元權重的L1/L2均值來平均激活每個神經元,再通過計算神經元在驗證集上不為零的次數或者其他創造性方法來對神經元進行排序。一個更快/更小的模型,對於深度學習模型在移動設備上部署是至關重要的。

最近的一些研究表明,僅僅丟棄一些卷積濾波器,就能夠在不損耗模型精度的同時加速模型的訓練,得到一個快而小的深度模型。在這項研究中,神經元的排名方式也是相當簡單:在每個修剪迭代中,利用每個濾波器權重的L1范數對所有的過濾器進行排序,然後在全部層中修剪掉m個排名最低的過濾器,再不斷重複以上的操作直到獲得我們想要的模型。這是個非常成功的剪枝案例。

深度神經網路修剪的步驟

此外,在最近的另一篇分析ResNet模型結構的文章中,作者提出了一種修剪過濾器的觀點。研究發現,在移除網路層的時候,帶殘餘連接的網路(如ResNets)與那些沒有使用快捷連接的網路(如VGG或AlexNet)相比,殘差網路的性能更加穩健,在剪枝的同時也不會過多地影響模型的性能。這項發現具有重要的實際意義,這就意味著我們在部署一個修剪網路時,網路設計最好要採用殘差網路結構(如ResNets),讓我們的模型魯棒性更好。

以上,就是你能學習到的7大深度學習實用技巧!

作者 | George Seif

原文鏈接:

https://towardsdatascience.com/7-practical-deep-learning-tips-97a9f514100e

Advertisements

你可能會喜歡