參考鏈接:
數據增強:
- 如何對圖像數據進行有效的數據增強?
- 空間幾何變換:翻轉(水平和垂直)、隨機裁剪、旋轉、放射變換、視覺變換(四點透視變換)、分段放射
- 像素顏色變換類:噪聲(高斯、椒鹽)、CoarseDropout(在面積大小可選定、位置隨機的矩形區域上丟失信息實現轉換,所有通道的信息丟失產生黑色矩形塊,部分通道的信息丟失產生彩色噪聲)、SimplexNoiseAlpha(產生連續單一噪聲的掩模后,將掩模與原圖像混合)、FrequencyNoiseAlpha(在頻域中用隨機指數對噪聲映射進行加權,再轉換到空間域。在不同圖像中,隨着指數值逐漸增大,依次出現平滑的大斑點、多雲模式、重復出現的小斑塊)
- 模糊類:高斯模糊、ElasticTransformation
- HSV對比度變換
- RGB顏色擾動
- 隨機擦除
- 超像素法
- 轉化法
- 邊界檢測
- Grayscale
- 銳化與浮雕
- 多樣本合成:SMOTE、SamplePairing、Mixup
初始學習率設置:

隨着訓練的不斷深入,我們看到loss逐漸下降,並在一段特定的學習率區間內產生了劇烈的下降,而到最后,由於學習率增長到實在太大了,所以loss開始增大了。
所以從這張圖中,我們該選擇哪個點作為最合適的學習率呢?圖中的最低點嗎?不是,因為這時候其實loss已經呈現出了loss爆炸的趨勢了,所以 要比
更適合作為最佳學習率,因為我們需要一個既能保證學習的速度,又能防止產生loss爆炸情況的學習率,所以
要更適合,可能有人要問為什么不選曲線下降梯度最大的地方作為學習率,要知道此處loss快速下降是模型因為經過不斷訓練快速擬合到數據上的結果,而不是說loss在這一學習率上下降最快,要了解這張圖的意義,我們要找的最佳點是能保證最快速擬合,又不至於發生loss爆炸情況發生的點,所以還是需要一點偽科學的知識,去主觀判斷這樣一個臨界點,只不過這樣一張圖給了我們一定的參考,也就是不那么偽了。
Warm up熱身
Warm up指的是用一個小的學習率先訓練幾個epoch,這是因為網絡的參數是隨機初始化的,假如一開始就采用較大的學習率容易出現數值不穩定。
然后等到訓練過程基本上穩定了就可以使用原始的初始學習率進行訓練了。
示例:
Resnet論文中使用一個110層的ResNet在cifar10上訓練時,先用0.01的學習率訓練直到訓練誤差低於80%(大概訓練了400個steps),然后使用0.1的學習率進行訓練。
學習率調整
loss在當前LR下一路降了下來, 但是半天不再降了,則需要進一步降低
驗證集acc和loss波動大
參考:
就是網絡在訓練集上已經趨於收斂,但是在測試集上存在很嚴重的LOSS震盪的情況,怎么辦?這時候,可以從以下幾個角度考慮:
- 訓練集和測試集分布是否存在較大的差異?
- 是否由於數據增強做的太過分了?增強后的樣本,理論上和我們的實際業務場景最接近的時候,才會達到性能最好。在進行增強的時候不要盲目增強,需要看一下看數據集增強之后的效果如何?
- 學習率是不是還很高?如果是,降低學習率,或者在等等,等到學習率到 10e-6/10e-7這樣的大小
- 測試集LOSS的計算是基於單個batch還是整個測試集?(一定要基於整個測試集來看)
- 網絡是否存在欠擬合的可能,如果欠擬合參考上面欠擬合的方法
以下轉自https://blog.ailemon.me/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/
訓練集loss不下降
訓練集的loss在訓練過程中遲遲不下降,一般是由這幾個方面導致的,這一點在我之前的文章《深度學習:欠擬合問題的幾種解決方案》中基本都涉及到了,詳細內容可以查看原文,本文中,將這些內容面再做一個擴充。
1.模型結構和特征工程存在問題
如果一個模型的結構有問題,那么它就很難訓練,通常,自己“自主研發”設計的網絡結構可能很難適應實際問題,通過參考別人已經設計好並實現和測試過的結構,以及特征工程方案,進行改進和適應性修改,可以更快更好的完成目標任務。當模型結構不好或者規模太小、特征工程存在問題時,其對於數據的擬合能力不足,是很多人在進行一個新的研究或者工程應用時,遇到的第一個大問題。
2.權重初始化方案有問題
神經網絡在訓練之前,我們需要給其賦予一個初值,但是如何選擇這個初始值,則要參考相關文獻資料,選擇一個最合適的初始化方案。常用的初始化方案有全零初始化、隨機正態分布初始化和隨機均勻分布初始化等。合適的初始化方案很重要,用對了,事半功倍,用不對,模型訓練狀況不忍直視。博主之前訓練一個模型,初始化方案不對,訓練半天都訓練不動,loss值遲遲居高不下,最后改了初始化方案,loss值就如斷崖式下降。
3.正則化過度
L1 L2和Dropout是防止過擬合用的,當訓練集loss下不來時,就要考慮一下是不是正則化過度,導致模型欠擬合了。一般在剛開始是不需要加正則化的,過擬合后,再根據訓練情況進行調整。如果一開始就正則化,那么就難以確定當前的模型結構設計是否正確了,而且調試起來也更加困難。
4.選擇合適的激活函數、損失函數
不僅僅是初始化,在神經網絡的激活函數、損失函數方面的選取,也是需要根據任務類型,選取最合適的。
比如,卷積神經網絡中,卷積層的輸出,一般使用ReLu作為激活函數,因為可以有效避免梯度消失,並且線性函數在計算性能上面更加有優勢。而循環神經網絡中的循環層一般為tanh,或者ReLu,全連接層也多用ReLu,只有在神經網絡的輸出層,使用全連接層來分類的情況下,才會使用softmax這種激活函數。
而損失函數,對於一些分類任務,通常使用交叉熵損失函數,回歸任務使用均方誤差,有自動對齊的任務使用CTC loss等。損失函數相當於模型擬合程度的一個評價指標,這個指標的結果越小越好。一個好的損失函數,可以在神經網絡優化時,產生更好的模型參數。
5.選擇合適的優化器和學習速率
神經網絡的優化器選取一般選取Adam,但是在有些情況下Adam難以訓練,這時候需要使用如SGD之類的其他優化器。學習率決定了網絡訓練的速度,但學習率不是越大越好,當網絡趨近於收斂時應該選擇較小的學習率來保證找到更好的最優點。所以,我們需要手動調整學習率,首先選擇一個合適的初始學習率,當訓練不動之后,稍微降低學習率,然后再訓練一段時間,這時候基本上就完全收斂了。一般學習率的調整是乘以/除以10的倍數。不過現在也有一些自動調整學習率的方案了,不過,我們也要知道如何手動調整到合適的學習率。
6.訓練時間不足
我有時會遇到有人問這樣的問題,為什么訓練了好幾個小時了,怎么loss沒降多少,或者怎么還沒收斂。心急吃不了熱豆腐!各種深度學習的訓練都有不同的計算量,當需要的計算量很大時,怎么可能幾個小時就訓練完,尤其是還在使用自己的個人電腦CPU來訓練模型的情況下。一般解決方案就是,使用更快的硬件加速訓練,比如GPU,在涉及到計算機視覺方面的任務時,加速效果顯著,主要是卷積網絡的緣故。當已經沒有辦法使用硬件來加速的時候,唯一的解決方案就是——等。
7.模型訓練遇到瓶頸
這里的瓶頸一般包括:梯度消失、大量神經元失活、梯度爆炸和彌散、學習率過大或過小等。
梯度消失時,模型的loss難以下降,就像走在高原上,幾乎任何地方都是高海拔,可以通過梯度的檢驗來驗證模型當前所處的狀態。有時梯度的更新和反向傳播代碼存在bug時,也會有這樣的問題。
在使用Relu激活函數的時候,當每一個神經元的輸入X為負時,會使得該神經元輸出恆為0,導致失活,由於此時梯度為0,無法恢復。有一種解決方案是使用LeakyRelu,這時,Y軸的左邊圖線會有一個很小的正梯度,使得神經網絡在一定時間后可以得到恢復。不過LeakyRelu並不常用,因為部分神經元失活並不影響結果,相反,這種輸出為0還有很多積極的作用。因為Relu方程輸入為負時,輸出值為0,利用此特性可以很好地忽略掉卷積核輸出負相關信息,同時保留相關信息。
Relu Function
LeakyRelu Function
梯度爆炸和梯度彌散產生的根本原因是,根據鏈式法則,深度學習中的梯度在逐層累積。如1.1的n次方無窮大,0.9的n次方無窮小。網絡中某些層過大的輸出也會造成梯度爆炸,此時應該為該輸出取一個上界,可用最大范數約束。
關於學習率,可按照第5項內容進行調整。
8.batch size過大
batch size過小,會導致模型后期搖擺不定,遲遲難以收斂,而過大時,模型前期由於梯度的平均,導致收斂速度過慢。一般batch size 的大小常常選取為32,或者16,有些任務下比如NLP中,可以選取8作為一批數據的個數。不過,有時候,為了減小通信開銷和計算開銷的比例,也可以調整到非常大的值,尤其是在並行和分布式中。
9.數據集未打亂
不打亂數據集的話,會導致網絡在學習過程中產生一定的偏見問題。比如張三和李四常常出現在同一批數據中,那么結果就是,神經網絡看見了張三就會“想起”李四。主要原因是,梯度更新時,總時張三和李四的梯度平均,導致出現固定的梯度走向,使得數據集的豐富度降低了。數據打亂后,張三還會跟王五一起平均,李四也會跟王五一起平均,那么梯度的走向會更豐富,也能更好地在整個數據集上學習到最有用的隱含特征。
10.數據集有問題
當一個數據集噪聲過多,或者數據標注有大量錯誤時,會使得神經網絡難以從中學到有用的信息,從而出現搖擺不定的情況。就像有人告訴你1+1=2,還有人告訴你1+1=3時,就會陷入困惑。或者還有可能時讀取數據出錯導致,這時實際情況跟數據標注錯誤是一樣的。另外,類別的不平衡也會使得較少類別由於信息量不足,難以習得本質特征。
11.未進行歸一化
未進行歸一化會導致尺度的不平衡,比如1km和1cm的不平衡,因此會導致誤差變大,或者在同樣的學習率下,模型會以秒速五厘米的步伐,左右兩邊搖擺不定地,向前走1km。有時,不平衡是由於不同的度量單位導致的,比如kg和m,我們都知道,1kg和1m沒有什么可比性,雖然數字都是1。因此,我們完全可以通過放縮,使得特征的數值分布更接近一些。
歸一化前
歸一化后
12.特征工程中對數據特征的選取有問題
數據特征的選取不合理,就像數據標注錯誤一樣,會使得神經網絡難以找到數據的本質特征進行學習。而機器學習的本質就是在做特征工程,以及清洗數據(逃)。
驗證集loss不下降
驗證集的loss不下降分為兩種。一種是訓練集上的loss也不下降,這時問題主要在訓練集的loss上,應當先參考上述方法解決。另一種是訓練集上的loss可以下降,但驗證集上的loss已經不降了,這里我們主要說明這種情況下的問題。
由於驗證集是從同一批訓練數據中划分出來的,所以一般不存在數據集的問題,所以主要是過擬合。過擬合解決起來,其實不怎么復雜,無非就幾種方法,但是對工程師自身的條件要求比較高。
1.適當的正則化和降維
正則化是用來解決模型過擬合問題的一個很重要的手段,博主之前在文章《機器學習:過擬合與欠擬合問題》里面寫到過,比如通過增加一個正則項,並且人為給定一個正則系數lambda,進行權重衰減,將一些相關性不大的特征項的參數衰減到幾乎為0,相當於去掉了這一項特征,這跟降維類似,相當於減少了特征維度。而去掉基本無關的維度,那么就避免了模型對於這一維度特征的過分擬合。還有在神經網絡兩個層之間增加Dropout和Normal等,也起到了抑制過擬合的作用。
2.適當降低模型的規模
過擬合很重要的一個原因也是模型的復雜度太高,就像一畝地只種了一棵小麥,那么其他地方不種就會長雜草,於是就會過擬合了一些噪聲。所以,除了正則化手段以外,適當減小模型的規模也是很重要的,盡量讓神經網絡結構的假設空間與預期目標模型需要存儲的信息量相匹配。
3.獲取更多的數據集
這是終極解決方案,深度學習就是在有大量數據的基礎上發展起來的。深度學習的三件套:數據、模型和硬件。模型可以直接拿來用,硬件可以花錢買,但是數據需要一點一點去收集,而且很多問題的解決就依賴於大量的數據,沒數據就沒有一切。
4.對數據集做擾動和擴增
這個是直接對現有的數據集做擴容,一定程度上可以再次提高驗證集上的准確率,比如對圖像做旋轉,對聲音文件進行加噪處理等。最終的效果雖然比不上同等情況下的數據量的增加帶來的效果增益,但是在現有條件下,算是擴增數據量的一個有效的方案。
測試集loss不下降
測試集一般為模型之前訓練時從未見過的新數據,或者目標應用場景下的真實數據。由於訓練集和驗證集的loss不下降時,應歸為前兩節的內容,所以這一節中,我們默認訓練集和驗證集的loss情況是正常的。所以,如果測試集的loss很高,或者正確率很低,那么一般是因為訓練數據的分布和場景與測試數據的分布和應用場景不一致。
1.應用場景不一致
比如,一個語音識別模型,輸入的數據集都是女性的錄音音頻,那么對於男性的聲音就不能很好的識別出來。這個也是博主之前做語音識別的時候遇到過的一個真實案例,解決方案就是增加含有大量男性錄音音頻的數據集來訓練。
2.噪聲問題‘
噪聲問題是實際應用場景下,頻繁遇到的問題。直接容易理解的案例就是,在語音識別中,標准語音數據集都是在安靜環境下采集的數據,但是在實際應用中,我們錄音時多多少少會有噪聲,那么我們需要專門去處理噪聲,比如進行一個降噪處理,或者在訓練數據中添加噪聲等。在圖像的識別中,那么就需要考慮圖片中的遮擋、霧霾、旋轉、鏡像和大小遠近等問題