深度學習的7個技巧,幫你訓練出好的模型

2019-07-30     AI公園
作者:George Seif編譯:ronghuaiyang

導讀

這又是一篇介紹深度學習的技巧的文章,不過和之前的那篇文章側重點有所不同,這篇文章更加注重於如何在實際的項目的數據集中訓練出好的模型出來,與其說是深度學習的技巧,不如說是深度學習項目的技巧。對於使用深度學習來做實際項目的同學來說,很有啟發,一起來看看吧!

深度學習已經成為解決許多具有挑戰性的現實問題的首選方法。它是目前為止在物體檢測、語音識別和語言翻譯等方面表現最好的方法。許多人認為深度神經網絡(DNNs)是一個神奇的黑盒子,我們把一堆數據塞進去,然後拿出我們的解決方案!實際上,事情變得更加複雜……

在設計和應用DNN來解決特定問題時可能會遇到很多挑戰。為了達到實際應用所需的性能指標,pipeline中所有階段的正確設計和執行是至關重要的,包括數據準備、網絡設計、訓練和推理。在這裡,我將和你分享7個實用的技巧,讓你充分利用你的深層神經網絡。

1  數據,數據,數據

這不是什麼大秘密。一直運轉良好的深度學習機器需要燃料——大量的燃料,這裡燃料就是數據。我們擁有的標註的數據越多,我們的模型的性能就越好。谷歌甚至在3億張圖像的數據集中大規模地探索了更多數據帶來更好性能這個想法!

在實際應用程式中部署深度學習模型時,你應該不斷地為其提供更多的數據,並進行微調以繼續改進其性能。Feed the beast:如果你想提高你的模型的性能,那就去獲取更多的數據吧!

不斷增加數據可以獲得更好的性能

2   你應該使用什麼優化器?

近年來,許多梯度下降優化算法得到了發展,每種算法都有其優缺點,其中最受歡迎的有:

  • 具有動量的隨機梯度下降(SGD)
  • Adam
  • RMSprop
  • Adadelta

RMSprop、Adadelta和Adam被認為是自適應優化算法,因為它們自動更新學習率。使用SGD,你必須手動選擇學習速率和動量參數,通常會隨著時間的推移而衰減學習速率。

在實際應用中,自適應優化算法收斂速度快於SGD算法,然而,他們的最終表現通常稍差一些。SGD通常可以達到更好的最小值,從而獲得更好的最終精度,但它可能比某些優化器花費的時間要長得多。它還更加依賴於健壯的初始化和學習率衰減策略,這在實踐中是非常具有挑戰性的。

因此,如果你需要一些快速的結果,或者只是想測試一種新技術,請使用自適應優化器。我發現Adam很容易使用,因為它對你選擇完美的學習速度不是很敏感。如果你想獲得絕對最好的最終性能,那麼使用SGD + 動量,並使用學習率、衰減和動量值來最大化性能。

兩全其美的方法

最近有研究表明,通過從Adam切換到SGD,你可以同時獲得兩個世界的最佳效果:高速訓練,表現一流 (https://arxiv.org/pdf/1712.07628.pdf)!其思想是,訓練的早期階段實際上是SGD對參數調優和初始化非常敏感的時候。因此,我們可以從使用Adam開始我們的培訓,這將使你在不必擔心初始化和參數優化的情況下走得很遠。然後,一旦Adam讓我們開始,我們可以切換到SGD +動量優化,以達到最佳性能!

Adam vs SGD的表現。Adam由於具有魯棒性和自適應學習率,在開始時表現較好,而SGD最終達到了較好的全局最小值。

3 如何處理不均衡數據

在許多情況下,你將處理不平衡的數據,特別是在實際應用程式中。舉一個簡單但真實的例子:你正在訓練你的深層網絡,出於安全原因,預測視頻中的某人是否持有致命武器。但是在你的訓練數據中,你只有50個持有武器的人的視頻,1000個沒有武器的人的視頻!如果你直接使用這些數據來訓練你的網絡,那麼你的模型肯定會偏向於預測沒有人擁有武器!

你可以做一些事情來解決這個問題:

在loss函數中使用class weights。本質上,未充分表示的類在loss函數中獲得更高的權重,因此對特定類的任何分類錯誤都會導致loss函數中出現非常高的錯誤。

  • 樣本過採樣:重複一些包含代表性不足的類的訓練示例,有助於平衡分布。如果可用數據很小,那麼這種方法最有效。
  • 樣本欠採樣:你可以簡單地跳過一些包含過度表示類的訓練示例。如果可用數據非常大,那麼這種方法最有效。
  • 數據增強:對於少數類,你可以為代表性不足的類綜合創建更多的訓練樣本!例如,在上一個檢測致命武器的例子中,你可以更改屬於擁有致命武器類的視頻的一些顏色和燈光。

4 遷移學習 

正如我們在第一個技巧中看到的,深度網絡需要大量數據。不幸的是,對於許多新應用來說,獲取這些數據可能非常困難,而且代價高昂。如果我們希望我們的模型表現良好,我們可能需要成千上萬個新的訓練樣本來進行訓練。如果數據集不可用,則必須手動收集並標註。

這就是轉移學習發揮作用的地方。使用遷移學習,我們不需要很多數據!我們的想法是,從一個網絡開始,這個網絡以前訓練過數百萬張圖像,比如ResNet在ImageNet上預先訓練過。然後我們將對ResNet模型進行微調,只對最後幾層進行再訓練,而不對其他層進行訓練。通過這種方式,我們將ResNet從數百萬張圖像中學到的信息(圖像特徵)進行微調,以便將其應用於不同的任務。這是可能的,因為跨域圖像的特徵信息通常非常相似,但是對這些特徵的分析可能因應用的不同而不同。

一個基本的遷移學習的pipeline

5 快速簡單的數據增強提升性能

我們已經說過幾次了:更多的數據=更好的性能。除了轉移學習之外,另一種快速和簡單的提高模型性能的方法是數據增強。數據增強包括在使用原始類標籤的同時,通過修改數據集中的一些原始圖像來生成合成的訓練示例。例如,常用的圖像數據增強方法有:

  • 水平和垂直旋轉和/或翻轉圖像
  • 改變圖像的亮度和顏色
  • 隨機模糊圖像
  • 從圖像中進行隨機裁剪

基本上,你可以執行任何更改來更改圖像的外觀,但不能更改整個內容!你可以把一隻狗畫成藍色,但你仍然可以清楚地看到它是一隻狗。

數據增強

6 使用集成方法來提升你的模型

在機器學習中,可以集成訓練多個模型,然後將它們組合在一起以獲得更高的性能。因此,我們的想法是在相同的數據集上,針對相同的任務訓練多個深度網絡模型,然後通過投票的方案將模型的結果組合起來。得票最多的類別獲勝。

為了確保所有模型都是不同的,可以使用隨機權重初始化和隨機數據增強。眾所周知,由於使用了多個模型,因此從不同的角度處理任務,集成通常比單個模型要精確得多。在現實世界的應用中,特別是在比賽中,幾乎所有頂級模型都使用集成。

模型集成

7 通過剪枝來加速 

我們知道模型的精度隨著深度的增加而增加,但是速度呢?更多的層意味著更多的參數,更多的參數意味著更多的計算、更多的內存消耗和更慢的速度。理想情況下,我們希望在提高速度的同時保持較高的準確性。我們可以通過剪枝來做到這一點。

深度神經網絡剪枝的步驟

其思想是,在網絡中的許多參數中,有些是冗餘的,對輸出的貢獻不大。如果可以根據神經元的貢獻大小對網絡中的神經元進行排序,那麼就可以將排名靠後的神經元從網絡中移除,從而形成一個更小更快的網絡。排序可以根據神經元權重的L1/L2均值、神經元的平均激活度、某個驗證集上神經元不為零的次數等方法進行。更快/更小的網絡對於在移動設備上運行深度學習網絡非常重要。

剪枝網絡最基本的方法就是刪除某些卷積濾波器。在這篇最近的論文(https://arxiv.org/abs/1611.06440)中,這項工作做得相當成功。這項工作中的神經元排序相當簡單:它是每個濾波器權重的L1範數。在每次修剪疊代中,他們對所有的濾波器進行排序,在所有層中刪除所有級別最低的m個過濾器,然後重新訓練和重複。

另一篇最近的論文(https://arxiv.org/abs/1605.06431)分析了殘差網絡的結構,提出了剪枝濾波器的關鍵觀點。作者表明,在刪除層時,具有殘差快捷連接的網絡(如ResNets)在保持良好準確性方面要比不使用任何快捷連接的網絡(如VGG或AlexNet)健壯得多。這個有趣的發現具有非常重要的實際意義,因為它告訴我們,在為部署和應用進行網絡剪枝時,網絡設計非常重要(請使用ResNets!)所以使用最新最好的方法總是好的!

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

更多文章,請關注微信公眾號:AI公園

文章來源: https://twgreatdaily.com/zh-tw/MvLnR2wB8g2yegND_LHQ.html