LSTM調參經驗


0、開始訓練之前先要做些什么?

在開始調參之前,需要確定方向,所謂方向就是確定了之后,在調參過程中不再更改

1、根據任務需求,結合數據,確定網絡結構。

例如對於RNN而言,你的數據是變長還是非變長;輸入輸出對應關系是many2one還是many2many等等,更多結構參考如下

 

非RNN的普通過程,從固定尺寸的輸入到固定尺寸的輸出(比如圖像分類)
輸出是序列(例如圖像標注:輸入是一張圖像,輸出是單詞的序列)
輸入是序列(例如情緒分析:輸入是一個句子,輸出是對句子屬於正面還是負面情緒的分類)
輸入輸出都是序列(比如機器翻譯:RNN輸入一個英文句子輸出一個法文句子)
同步的輸入輸出序列(比如視頻分類中,我們將對視頻的每一幀都打標簽)

2、確定訓練集、驗證集和測試集,並盡可能的確保它們來自相同的分布,並且訓練集與測試集的划分通常是7:3,然后在訓練集中在進行驗證集的划分,驗證集的划分可以是交叉驗證,也可以是固定比例。

一旦確定了數據集的划分,就能夠專注於提高算法的性能。如果能夠保證三者來自相同的分布,對於后續的問題定位也會有着極大的意義。

例如,某個模型在訓練集上效果很好,但是在測試集上的結果並不如意,如果它們來自相同的分布,那么就可以肯定:模型在訓練集上過擬合了(overfitting),那么對應的解決辦法就是獲取更多的訓練集。

但是如果訓練集和測試集來自不同的分布,那么造成上述結果的原因可能會是多種的:

(i).在訓練集上過擬合;(ii).測試集數據比訓練集數據更難區分,這時,有必要去進行模型結構,算法方面的修改;(iii).測試集並不一定更難區分,只是與訓練集的分布差異比較大,那么此時如果我們去想方設法提高訓練集上的性能,這些工作都將是白費努力。

3、確定單一的評估算法的指標。

這里需要注意的是,在進行調參之前,我們需要明確我們的目的是什么,是盡可能的分的准(查准率,precision)還是盡可能的找的全(查全率,recall)亦或者兩者都要考慮(F1或者ROC曲線下面積);還或者說,我不僅要關注准確率還要考慮時間效率(此時可以將准確率與算法的運行時間做一個簡單的加權,來構建出一個新的指標)。

我們需要確定使用的指標,並且在優化過程中不再更改,否者你會不知道究竟哪個參數好,因為兩個不同的指標之間不容易比較。另外,需要明確使用一個指標,這樣能夠更加直觀的觀察不同參數之間的好壞。

4、對數據進行歸一化/標准化處理。

歸一化的原因:統一量綱、便於梯度的計算、加快收斂等

                                               歸一化之前

                                                     歸一化之后

 

歸一化:一般采用max-min歸一化,使得數據縮放到大小為(-1,1)或者(0,1)之間。

標准化:z-scores標准化,使得數據整體的均值為0,方差為1。

對於圖像數據的歸一化可以采用除以255(如果圖像像素在0-255之間)的方式。

數據歸一化的方式是對訓練集進行歸一化,然后將這種歸一化方式應用到驗證集和測試集中。

5、打印你的網絡參數個數,與你的數據量進行一個對比。網絡越大,功能越強,但也更容易過擬合。不要嘗試用10,000個樣本來學習一百萬個參數。

1、開始調參之前先要做些什么?

1、首先不使用Dropout以及正則化項,使用一個較小的數據集(從原始數據集中取出一小部分),讓你的網絡去訓練擬合這個數據集,看看能否做到損失為0 / 准確率為1 (前提是這個小數據集不能只包含一類樣本)。

2、在一輪epoch中,打印出輸入、輸出,檢測數據的正確性(例如圖像數據確保size,其他數據檢查是否輸入為0,以及檢查是否每個batch都是相同的值,檢查特征與標簽是否對應)

3、去除正則化項,觀察初始的loss值,並對loss進行預估。

例如,一個二分類問題,使用softmax分類器,那么當樣本屬於兩個類的概率都為0.5的時候,此時的loss = -ln(0.5) = 0.69,后續當網絡的loss不再變化時,看看那時候的loss與這個值的關系。如果最終不再變化的loss值等於這個值,那么也就是說網絡完全不收斂。

4、可視化訓練過程,在每一輪epoch訓練完成后,計算驗證集上的loss與准確率(你的評價指標),並記錄下每一輪epoch后訓練集與驗證集的loss與評價指標。如果是圖像數據,可以進行每一層的可視化。

5、如果可以的話,在開始訓練之前,嘗試用經典的數據集(網上公開數據集,經常在深度學習的網絡中使用的數據集,例如MNIST,CIFAR10)先進行訓練,因為這些經典數據集都有參考標准(baseline),而且沒有數據方面的問題(如噪聲、不平衡、隨機性過大導致難以學習的問題等等,尤其是在你自己設計了一個新的網絡結構時。

2、如何調參?

1、在確保了數據與網絡的正確性之后,使用默認的超參數設置,觀察loss的變化,初步定下各個超參數的范圍,再進行調參。對於每個超參數,我們在每次的調整時,只去調整一個參數,然后觀察loss變化,千萬不要在一次改變多個超參數的值去觀察loss。

2、對於loss的變化情況,主要有以下幾種可能性:上升、下降、不變,對應的數據集有train與val(validation),那么進行組合有如下的可能:

train loss 不斷下降,val loss 不斷下降——網絡仍在學習;

train loss 不斷下降,val loss 不斷上升——網絡過擬合;

train loss 不斷下降,val loss 趨於不變——網絡欠擬合;

train loss 趨於不變,val loss 趨於不變——網絡陷入瓶頸;

train loss 不斷上升,val loss 不斷上升——網絡結構問題;

train loss 不斷上升,val loss 不斷下降——數據集有問題;

其余的情況,也是歸於網絡結構問題與數據集問題中。

3、當loss趨於不變時觀察此時的loss值與1-3中計算的loss值是否相同,如果相同,那么應該是在梯度計算中出現了nan或者inf導致oftmax輸出為0。

此時可以采取的方式是減小初始化權重、降低學習率。同時評估采用的loss是否合理。

3、解決方式

1、當網絡過擬合時,可以采用的方式是正則化(regularization)與丟棄法(dropout)以及BN層(batch normalization),正則化中包括L1正則化與L2正則化,在LSTM中采用L2正則化。另外在使用dropout與BN層時,需要主要注意訓練集和測試集上的設置方式不同,例如在訓練集上dropout設置為0.5,在驗證集和測試集上dropout要去除。

2、當網絡欠擬合時,可以采用的方式是:去除 / 降低 正則化;增加網絡深度(層數);增加神經元個數;增加訓練集的數據量。

3、設置early stopping,根據驗證集上的性能去評估何時應該提早停止。

4、對於LSTM,可使用softsign(而非softmax)激活函數替代tanh(更快且更不容易出現飽和(約0梯度))

5、嘗試使用不同優化算法,合適的優化器可以是網絡訓練的更快,RMSProp、AdaGrad或momentum(Nesterovs)通常都是較好的選擇。

6、使用梯度裁剪(gradient clipping),歸一化梯度后將梯度限制在5或者15。

7、學習率(learning rate)是一個相當重要的超參數,對於學習率可以嘗試使用余弦退火或者衰減學習率等方法。

7、可以進行網絡的融合(網絡快照)或者不同模型之間的融合。

 

參考文獻:

1、深度學習筆記(四):循環神經網絡的概念,結構和代碼注釋

2、Machine Learning Yearning,吳恩達

3、神經網絡為什么要歸一化

4、LSTM超參數調試注意事項


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM