深度學習11個實用技巧
深度學習工程師George Seif發表了一篇博文,總結了7個深度學習的技巧,本文增加了幾個技巧,總結了11個深度學習的技巧,主要從提高深度學習模型的准確性和速度兩個角度來分析這些小技巧。在使用深度學習的時候,我們不能僅僅把它看成一個黑盒子,因為網絡設計、訓練過程、數據處理等很多步驟都需要精心的設計。作者分別介紹了7個非常實用小技巧:數據量、優化器選擇、處理不平衡數據、遷移學習、數據增強、多個模型集成、加快剪枝。相信掌握了這7個技巧,能讓你在實際工作中事半功倍!
深度學習已經成為解決許多具有挑戰性問題的方法。 在目標檢測,語音識別和語言翻譯方面,深度學習是迄今為止表現最好的方法。 許多人將深度神經網絡(DNNs)視為神奇的黑盒子,我們輸入一些數據,出來的就是我們的解決方案! 事實上,事情要復雜得多。
在設計和應用中,把DNN用到一個特定的問題上可能會遇到很多挑戰。 為了達到實際應用所需的性能標准,數據處理、網絡設計、訓練和推斷等各個階段的正確設計和執行至關重要。
1. 過擬合與欠擬合
“欠擬合”常常在模型學習能力較弱,而數據復雜度較高的情況出現,此時模型由於學習能力不足,無法學習到數據集中的“一般規律”,因而導致泛化能力弱。與之相反,“過擬合”常常出現在模型學習
能力過強的情況,此時的模型學習能力太強,以至於將訓練集單個樣本自身的特點都能捕捉到,並將其認為是“一般規律”,同樣這種情況也會導致模型泛化能力下降。過擬合與欠擬合的區別在於,欠擬合在訓練集和測試集上的性能都較差,而過擬合往往能完美學習訓練集數據的性質,而在測試集上的性能較差。
下圖(a)與圖(b)分別展示了對二維數據進行擬合時過擬合與欠擬合的情況。其中藍色虛線代表數據的真實分布,橙色圓點為訓練數據,黑色實線代表模型的擬合結果。圖(a)使用簡單的線性模型擬合,由於模型過於簡單,沒有能力捕捉模型的真實分布,產生了欠擬合。圖(b)使用了高次多項式模型進行擬合,由於模型過於復雜,因此對每個測試數據都能精確預測,但模型擬合的結果沒有抓住數據分布的本質特征,出現了過擬合。
2. 數據,數據,數據
這不是什么大秘密,深度學習機需要大量的“燃料”, 那“燃料”就是數據。擁有的標簽數據越多,模型的表現就越好。 更多數據產生能更好性能的想法,已經由谷歌的大規模數據集(有3億圖像)證明!為了感受數據帶給深度學習模型的性能提升,在部署Deep Learning模型時,你應該不斷地為其提供更多的數據和微調以繼續提高其性能。 Feed the beast:如果你想提高你的模型的性能,就要提供更多的數據!
上圖中顯示數據量的增加會得到更好的性能
3. 應該選擇哪一個優化器
多年來,已經開發了許多梯度下降優化算法,他們各有其優缺點。 一些最流行的方法如下:
- Stochastic Gradient Descent (SGD) with momentum
- Adam
- RMSprop
- Adadelta
RMSprop,Adadelta和Adam被認為是自適應優化算法,因為它們會自動更新學習率。 使用SGD時,您必須手動選擇學習率和動量參數,通常會隨着時間的推移而降低學習率。
在實踐中,自適應優化器傾向於比SGD更快地收斂, 然而,他們的最終表現通常稍差。 SGD通常會達到更好的minimum,從而獲得更好的最終准確性。但這可能需要比某些優化程序長得多的時間。 它的性能也更依賴於強大的初始化和學習率衰減時間表,這在實踐中可能非常困難。
因此,如果你需要一個優化器來快速得到結果,或者測試一個新的技術。 我發現Adam
很實用,因為它對學習率並不是很敏感。 如果您想要獲得絕對最佳的表現,請使用SGD + Momentum,並調整學習率,衰減和動量值來使性能最優化。
兩全其美的辦法
最近已經證明,可以得到兩全其美的結果:從 Adam 到SGD的高性能高速訓練! 這個想法是,實際上由於在訓練的早期階段SGD對參數調整和初始化非常敏感。 因此,我們可以通過使用Adam來開始訓練,這將節省相當長的時間,而不必擔心初始化和參數調整。 那么,一旦Adam獲得較好的參數,我們可以切換到SGD +動量優化,以達到最佳性能!
Adam vs SGD 性能
4 . Dropout
Dropout是一種隨機斷開神經元的技術,其具體內容前文已有介紹。Dropout控制過擬合的原理有兩點。第一是在神經網絡的局部構造集成學習模型,在處理測試集樣本時,網絡作出的推斷實際上是不同神經元斷開時的子網絡所做出推斷的平均。集成學習模型,如隨機森林,梯度提升樹等在控制過擬合上往往效果明顯。
第二是減少神經元之間的耦合,由於Dropout每次斷開的神經元都不相同,這就阻止了神經元耦合起來提取同一種特征的可能性,使得網絡在缺失一些信息的情況下仍然能夠做出正確推斷。
5. EarlyStopping
EarlyStopping是一種在訓練中使用的回調函數,其基本思想是在訓練過程中監視神經網絡在驗證集上的性能,當驗證集上的性能在連續的多輪訓練中沒有得到提高,則提前終止訓練。EarlyStopping控制過擬合的原理是控制模型的擬合程度,在適當時機阻止模型繼續學習而達到過擬合狀態。當模型在驗證集性能沒有提升時,意味着訓練集已經不能提供更多的提高模型泛化能力的信息了,若繼續訓練下去,模型會開始擬合訓練集樣本中的自身特點,從而進入過擬合。
6. BatchNormalization
BatchNormalization在前文已有介紹。通常而言,BatchNormalization的主要作用是加速網絡的訓練。但同時,它也具有一定的控制過擬合的能力。實驗驗證,使用BatchNormalization時可以不用或者以較低的斷開率使用Dropout,或降低L2正則的系數。使用BatchNormalization控制過擬合的原理是,過擬合通常發生在數據邊界,而BatchNormalization可以協助將初始化權重調整落入數據的內部,從而協助控制過擬合。
7. 如何處理不平衡數據
在很多情況下,都要處理不平衡的數據,特別是實際應用程序中。 一個簡單而實際的例子如下:訓練您的深度網絡以預測視頻流中是否有人持有致命武器。 但是在你的訓練數據中,你只有50個拿着武器的人的視頻和1000個沒有武器的人的視頻! 如果你只是用這些數據來訓練你的網絡,那么你的模型肯定會非常偏向於預測沒有人有武器!
你可以做用以下的方法來解決它:
- 在損失函數中使用類權重。 本質上就是,讓實例不足的類在損失函數中獲得較高的權重,因此任何對該類的錯分都將導致損失函數中非常高的錯誤。
- 過度采樣:重復一些實例較少的訓練樣例,有助於平衡分配。 如果可用的數據很小,這個方法最好。
- 欠采樣:一些類的訓練實例過多,可以簡單地跳過一些實例。 如果可用數據非常大,這個方法最好。
- 為少數類增加數據。可以為少數類創建更多的訓練實例! 例如,在前面檢測致命武器的例子中,你可以改變屬於具有致命武器的類別的視頻的顏色和光照等。
8. 遷移學習
正如我們所看到的,深層網絡需要大量的數據。遺憾的是,對於許多新的應用程序來說,這些數據可能很難得到並且開銷很大。 如果我們希望模型表現良好,可能需要數萬或數十萬個新的訓練樣例來進行訓練。 如果數據集不易獲取,則必須全部手動收集並標記。
這就是遷移學習的起點。 通過遷移學習,我們不需要太多的數據! 這個想法是從一個在數百萬圖像上訓練過的網絡開始的,比如在ImageNet上預訓練的ResNet。 然后,我們將“重新調整ResNet模型,只重新訓練最后幾層。
我們將ResNet從數百萬圖像中學到的信息(圖像特征)進行微調,以便將其應用於不同的任務。 因為跨域的圖像的特征信息經常是非常相似的所以這個方法是可行的,但是這些特征的分析根據應用而不同。
一個基本的遷移學習示例
9. 用數據增強提高性能
前面已經說過:更多的數據=更好的表現。 除了遷移學習之外,另一種快速而簡單提高模型的性能的方法是數據增強。 數據增強是使用原始類別標簽的同時,改變數據集的原始圖像以合成一些新的訓練示例。例如,用於圖像數據增強的常見方式包括:
- 水平和/或垂直旋轉翻轉圖像
- 改變圖像的亮度和顏色
- 隨機模糊圖像
- 隨機從圖像裁剪塊
基本上,你可以進行任何改變,改變圖像的外觀但不改變整體內容。
10. 通過集成提升模型!
在機器學習中,集成訓練多個模型,然后將它們組合在一起以獲得更高的性能。 這個想法是在相同的數據集上對同一任務訓練多個深度網絡模型。 然后,模型的結果可以通過投票進行組合,即具有最高票數的類勝出。
為了確保所有模型不同,可以使用隨機權重初始化和隨機數據增強。眾所周知,由於使用了多個模型,因此集成通常比單個模型更精確,從而從不同角度完成任務。在實際應用中,尤其是競賽中,幾乎所有頂級模型都使用集合方式。
集成模型
11. 加快剪枝
我們知道模型精度隨深度而增加,但速度又如何呢? 更多的層意味着更多的參數,更多的參數意味着更多的計算,更多的內存消耗和更慢的速度。理想情況下,我們希望在提高速度的同時保持高精度。我們可以通過剪枝來做到這一點。
深度神經網絡剪枝策略
這個想法是,網絡中的許多參數是多余的,對輸出沒有太大貢獻。 如果可以根據貢獻值對網絡中的神經元進行排名,那么就可以從網絡中移除低排名的神經元,從而形成更小更快的網絡。 可以根據神經元權重的L1 / L2均值(平均激活)、一些驗證集上神經元不為零的次數以及其他方法來進行排序。 獲得更快/更小的網絡對於在移動設備上運行深度學習網絡非常重要。
修剪網絡的最基本的方法是簡單地放棄某些卷積濾波器。 最近文章表明,這樣做是相當成功的。 這項工作中的神經元排名相當簡單:每個濾波器的權重按照L1規范排名。 在每個修剪迭代中,對所有的過濾器進行排序,在所有層中修剪m個排名最低的過濾器,重新訓練和重復!
最近的另一篇分析殘差網絡結構的論文中提出了修剪“過濾器”的關鍵特點。 作者指出,在刪除層的時候,具有殘差快捷連接(例如ResNets)的網絡比不使用任何快捷連接(例如VGG或AlexNet)的網絡在保持良好的准確性方面更為穩健。這個有趣的發現具有重大的實際意義,因為它告訴我們,在修剪網絡進行部署和應用時,網絡設計至關重要(例如ResNets)。 所以使用最新最好的方法總是很好的!