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超參數調試注意事項