(轉) 深度模型優化性能 調參


原地址:https://blog.csdn.net/qq_16234613/article/details/79596609

注意

  1. 調參看驗證集。trainset loss通常能夠一直降低,但validation set loss在經過一段降低期后會開始逐漸上升,此時模型開始在訓練集上過擬合。
  2. 着重關注val loss變化,val acc可能會突變,但loss衡量的整體目標。
  3. 優先調參學習率。
  4. 通過對模型預測結果,可以判斷模型的學習程度,如果softmax輸出在0或1邊緣說明還不錯,如果在0.5邊緣說明模型有待提高。
  5. 調參只是為了尋找合適的參數。一般在小數據集上合適的參數,在大數據集上效果也不會太差。因此可以嘗試采樣部分數據集,以提高速度,在有限的時間內可以嘗試更多參數。

學習率(重要)

這里寫圖片描述

  畫圖分析是種不錯調參學習率的方式:學習率過大,loss曲線可能會上升,或者不能一直下降,出現震盪情況,由於學習率較大,導致參數在最優點附近徘徊,loss大小一下大一下小,就是卻無法到達最優點,容易擬合在局部最小值。學習率太小loss曲線可能下降速度過於緩慢。好的學習率loss呈平滑的下降曲線。 
  學習率代表了參數的更新步長,你走的距離越短當然不會錯過每個最低點,但是耗時間。而且步長越小,越容易得到局部最優化(到了比較大的山谷,就出不去了),而太大了可能會直接越過全局最優點。

  1. lr:學習率太大,容易梯度爆炸,loss變nan。取1 0.1 0.01 .0001 … 10e-6(取對數變化)。常取0.1。通過對驗證集的預測,可以選擇一個較好的lr。如果當前的學習率不能在驗證集上繼續提高,可以將學習率除以2或者5試試。
  2. decay:訓練集的損失下降到一定的程度后就不再下降了,而且train loss在某個范圍內來回震盪,不能進一步下降(也就是loss一下跳到最低點左側,一下跳到最低點右側,由於學習率過高就是不能繼續下降)。可采用衰減學習率,學習率隨着訓練的進行逐漸衰減。取0.5。比如當val loss滿足 no-improvement規則時,本來應該采取early stopping,但是可以不stop,而是讓learning rate減半繼續跑。如此反復。衰減方法有:衰減到固定最低學習率的線性衰減,指數衰減,或每次val loss停滯時衰減2-10倍。
  3. fine-tuning的時候,可以把新加層的學習率調高,重用層的學習率可以設置的相對較低。 
    這里寫圖片描述

CLR中文

參數初始化

  1. 破壞不同單元間對稱性,如果兩個單元相同,接受相同的輸入,必須使其具有不同的初始化參數,否則模型將一直以相同方式更新這兩個單元。更大的初始化權重會更容易破壞對稱性,且避免在梯度前向和反向傳播過程中丟失信號,但如果權重初始化太大,很容易產生爆炸值(梯度爆炸可以使用梯度截斷緩解);而在CNN中會導致模型對輸入高度敏感,導致確定性的前向傳播過程表現的隨機;而且容易導致激活函數產生飽和的梯度,導致梯度丟失。
  2. 不可取: 
    初始化為0,模型無法更新,而且模型權重的相同,導致模型的高度對稱性。 
    初始化為 very small random numbers(接近0,但不是0),模型效果不好,會導致梯度信息在傳播中消失。
  3. 推薦: 
    一般bias全初始化為0,但在RNN中有可能取1(LSTM)。 
    random_uniform 
    random_normal 
    glorot_normal 
    glorot_uniform(無腦xavier,為了使得網絡中信息更好的流動,每一層輸出的方差盡量相等。)
  4. 推薦:使用方差縮放初始化。在 TensorFlow 中,該方法寫作 tf.contrib.layers.variance_scaling_initializer()。根據我們的實驗,這種初始化方法比常規高斯分布初始化、截斷高斯分布初始化及 Xavier 初始化的泛化/縮放性能更好。粗略地說,方差縮放初始化根據每一層輸入或輸出的數量(在 TensorFlow 中默認為輸入的數量)來調整初始隨機權重的方差,從而幫助信號在不需要其他技巧(如梯度裁剪或批歸一化)的情況下在網絡中更深入地傳播。Xavier 和方差縮放初始化類似,只不過 Xavier 中每一層的方差幾乎是相同的;但是如果網絡的各層之間規模差別很大(常見於卷積神經網絡),則這些網絡可能並不能很好地處理每一層中相同的方差。 
    這里寫圖片描述

激活函數

  1. ReLu:通用激活函數,防止梯度彌散問題。最后一層慎用ReLu做激活。
  2. Sigmoid的可微分的性質是傳統神經網絡的最佳選擇,但在深層網絡中會引入梯度消失和非零點中心問題。除了gate之類的地方,需要把輸出限制成0-1之外,盡量不要用sigmoid,。sigmoid函數在-4到4的區間里,才有較大的梯度。之外的區間,梯度接近0,很容易造成梯度消失問題。輸入0均值,sigmoid函數的輸出不是0均值的。
  3. tanh范圍在-1到1之間,且zero-center,但比sigmoid要好,但仍有飽和時梯度消失問題。
  4. relu比sigmoid和tanh好,導數易計算收斂速度快,不會飽和。唯一問題就是x小於0時梯度為0,可能會導致許多神經元死亡。使用時尤其注意lr的設置
  5. Leaky_ReLu及ReLu變種,maxout可以試試。
  6. 通常使用ReLu,及其變種,PReLU and RReLU 效果挺好。tanh可以試試,但不要使用sigmoid。
  7. 原版rnn 只有tauh不會爆炸,所以有了lstm 在最后drop以及改進的GRU 靠閾值砍梯度。所以lstm/gru 無論用什么激活函數都不會爆。標准rnn 哪怕梯度是1,一路×下來不是消失就是爆炸;於是就有了irnn https://arxiv.org/abs/1504.00941就是把 權矩陣初始為單位陣;當然還有去年的ind rnn 不但解決了梯度爆炸的問題,順便還解決了可解釋性

maxout增加大量參數,計算圖如下: 
這里寫圖片描述 
普通網絡: 
z=W*X+b 
out=f(z) 
這里寫圖片描述 
maxout層,其中z個數自定 
z1=w1*x+b1 
z2=w2*x+b2 
z3=w3*x+b3 
z4=w4*x+b4 
z5=w5*x+b5 
out=max(z1,z2,z3,z4,z5)

模型

  1. 如果輸入向量固定大小,可考慮使用全連接前饋網絡,如果輸入為圖像等二維結構,可考慮卷積網絡,如果輸入為序列,可考慮循環神經網絡。
  2. BN:提高性能,加速訓練,有時可省去dropout。注意BN在batch size過小時性能不是很好。刪掉批歸一化層。再將批處理大小減小為 1 時,這樣做會暴露是否有梯度消失和梯度爆炸等問題。我們曾經遇到過一個好幾個星期都沒有收斂的網絡,當我們刪除了批歸一化層(BN 層)之后,我們才意識到第二次迭代的輸出都是 NaN。在這里使用批量歸一化層,相當於在需要止血帶的傷口上貼上了創可貼。批歸一化有它能夠發揮效果的地方,但前提是你確定自己的網絡沒有 bug。
  3. 盡量選擇更多的隱層單元,小filter,利用非線性,而過擬合通過正則化的方法避免。
  4. 一開始需要驗證模型是否有問題,可采取小量數據集、很深模型快速看模型是否能夠對訓練集很好的過擬合,而測試集准確率很低。
  5. batch_size:常取2的n次方。通常影響不大。 取 32 64 128。batch越大,一般模型加速效果明顯。不考慮時間成本的情況下,batch size=1可作為一個regularizer。將批處理大小減小到 1 可以向你提供與權重更新相關的更細粒度的反饋,你應該將該過程在 TensorBoard(或者其他的調試/可視化工具)中展示出來。
  6. 不同尺寸的feature maps的concat,利用不同尺度的信息。
  7. resnet的shortcut有作用,shortcut的支路一定要是identity。
  8. 可以利用Inception方法來提取不同抽象程度的高階特征。
  9. 梯度歸一化:計算出來梯度之后,除以Minibatch的數量。
  10. 利用pre-trained model和fine-tune可以實現很好的性能。
  11. 為每一層添加一個偏置項。偏置項將一個平面轉換到最佳擬合位置。在 y=mx+b 式中,b 是偏置項,使直線能夠向上或向下移動到最佳的擬合位置。

這里寫圖片描述

優化函數

  1. Adam:收斂速度快。可以無腦用。在 TensorFlow 環境下使用 ADAM 時,請注意:如果你想要保存和恢復模型權重,請記住在設置完 AdamOptimizer 后設置 Saver,這是因為 ADAM 也有需要恢復的狀態(即對應於每個權重的學習率)。在隨機梯度下降(SGD)中,降低學習率是很常見的,但是 ADAM 天然地就考慮到了這個問題。可以不使用學習率衰減。
  2. SGD+Momentum:效果比Adam可能好,但速度稍慢。m取值0.5 0.95 0.9 0.99
  3. 梯度截斷: 限制最大梯度 或者設置閥值,讓梯度強制等於5,10,20等。

卷積步幅,池化

  1. strides:取小值,常取1,2,
  2. filter數量翻倍(數量2^n,第一層不宜太少,n為層數)。反卷積相反。
  3. kernel size:流行使用小size(3*3),注意對於大目標,感受野太小可能影響性能。尤其對於FCN,FC全連接畢竟具有全局視野。
  4. pooling:常取2*2

數據集、輸入預處理和輸出

如何判斷是否應該收集更多數據: 
  首先判斷當前模型是否在該訓練集上性能良好,如果在當前訓練集上性能就很差,此時應該注重提高模型,增加網絡層或隱藏單元等。如果使用更大模型后還是效果不佳,此時應考慮是否是數據集質量不佳(包含太多噪聲等),或模型存在根本錯誤。 
  然后如果模型在訓練集上性能可以接受,但在測試集上很差,此時可以考慮收集更多數據。但此時需要考慮收集數據的可行性和代價。如果代價太高,一個可行辦法是降低模型大小,改進正則化,調參等。通常在對數尺度上收集數據。 
   
1. 盡可能獲得更多的數據(百萬級以上),移除不良數據(噪音、假數據或空值等,數據中出現nan值時會導致模型loss變成nan)。 
2. 數據不足時做好Data Augment。對於圖像可以水平翻轉,隨機裁剪crop,旋轉,扭曲,縮放,拉伸,改變色調,飽和度(HSV)等,還可以同時隨機組合。需注意改變后的圖片(垂直翻轉)是否符合實際,是否丟失重要特征等問題。AlexNet對256的圖片進行224的隨機crop采樣,對每一張圖片,產生2048種不同的樣本,使用鏡像后,數據集翻了2048*2=4096倍。雖然大量的重采樣會導致數據的相關性,但避免了過擬合。至少比多個epoch輸入相同圖像要好。AlexNet中還有一種Fancy PCA采樣方法。 
2. 輸入訓練集一定要shuffle。注意keras中自帶的shuflle針對的是batch內部的打亂。 
3. 輸入特征歸一化,zero-center和normalize。PCA whitening一般不需要。還有處理到-1~1之間或0~1之間。當網絡的權重在各個方向上延伸和擴展的程度越小,你的網絡就能更快、更容易地學習。保持數據輸入以均值為中心且方差不變有助於實現這一點。 
4. 預測目標(label)都做好歸一化。比如回歸問題中,label相差過大(0.1和1000),做好normalization能統一量綱 
5. 數據集類別不平衡問題:上采樣、下采樣。或者使用data augment方式對較少類別數據進行采樣。對類別不平衡進行loss,權重調整。或者將數據集按類別拆分,優先訓練數量多的類別數據,再訓練數量少的類別數據。 
6. 不僅訓練集做好增強,測試集也最好做增強。保持二者分布的一致性。 
7. label smoothing針對解決過擬合,不一定work。new_labels = (1.0 - label_smoothing) * one_hot_labels + label_smoothing / num_classes

# zero-center normalize X -= np.mean(X, axis = 0) X /= np.std(X, axis = 0)
  • 1
  • 2
  • 3

目標函數

  1. 多任務情況下, 各loss盡量限制在一個量級上, 初期可以着重一個任務的loss。
  2. focal loss可能有點作用

正則化

這里寫圖片描述 
  如何判斷是否過擬合或者欠擬合:若訓練集准確率一直大幅度高於驗證集,說明模型過擬合,可以增大正則化強度,如增大L2正則懲罰,增加dropout的隨機失活率等。如果訓練集一直小幅度低於驗證集,說明稍微過擬合,而如果訓練集和驗證集的准確率不相上下,說明此時模型有點欠擬合,沒有很好地學習到特征,可以調整模型寬度、深度等。 
  在訓練過程中L2范數使得權重分量盡可能均衡,即非0分量個數盡量稠密,而L1范數和L0范數盡可能使權重分量稀疏,即非0分量個數盡量少。 
  稀疏性能實現特征的自動選擇。在我們事先假定的特征中,有很多特征對輸出的影響較小,可以看作是不重要的特征。而正則化項會自動對特征的系數參數進行懲罰,令某些特征的權重系數為0或接近於0,自動選擇主要自變量或特征。 
  如果當神經元的輸出接近於1的時候我們認為它被激活,而輸出接近於0的時候認為它被抑制,那么使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。 
  建議開始將正則項懲罰系數λ設置為0,待確定比較好的learning rate后,固定該learning rate。給λ一個值(比如1.0),然后根據validation accuracy,將λ增大或者減小10倍進行粗調,然后進行細調。 
   
1. 注意除非數據集比較多(千萬級),否則一開始最好采用溫和一點的正則化。 
2. Dropout:相當簡單有效的一種方式,防止過擬合,取0.3 0.5(推薦,0.5時生成的組合網絡最多) 0.7 
2. L2正則:較為常用的正則方式。在目標函數中添加關於權重的部分這里寫圖片描述。 
3. L1正則:較為常用的正則方式。在目標函數中添加關於權重的部分這里寫圖片描述。可以與L2連用這里寫圖片描述。 
4. Max norm Constraints:由於它限制了權重大小,使用這個約束后,網絡一般不會出現“爆炸”問題。

Esemble

  1. 同樣的參數,不同的初始化方式。使用cross-validation找出最佳超參,然后使用不同參數初始化方式訓練多個模型。
  2. 不同的參數,通過cross-validation,選取最好的幾組或性能較好的top-K組。
  3. 同樣的參數,模型訓練的不同階段,即不同迭代次數的模型。
  4. 不同的模型,進行線性融合. 例如RNN和傳統模型。
  5. 不同訓練集訓練的模型提取不同特征進行融合。

簡單點:投票法、平均法、加權平均法 
stacking法: 
這里寫圖片描述 
這里寫圖片描述 
第一層你有模型M1和M3,首先對M1使用5-fold訓練,得到5個模型,然后分別預測訓練集(5折中某1折)合並后生成第二層的訓練集F1,然后使用M1的5個子模型對測試集預測取均值T1,得到第二層的測試集。第一層模型M3同樣采用此方法生成F3和T3。這樣你的第二層模型M2就有訓練集(F1,F2),測試集(T1,T2),使用第二層模型進行訓練預測。 
Blending法: 
將數據划分成train,test,然后將train划分成不相交的兩部分train_1,train_2。 
使用不同的模型對train_1訓練,對train_2和test預測,生成兩個1維向量,有多少模型就生成多少維向量。 
第二層使用前面模型對train_2生成的向量和label作為新的訓練集,使用LR或者其他模型訓練一個新的模型來預測test生成的向量。

圖像可視化調參

  1. 可視化激活層、參數層
  2. 可視化分析1 可視化分析2
  3. 可視化輸出錯誤:通過判斷模型輸出錯誤的樣本,分析原因。
  4. 可視化激活函數值和梯度的直方圖:隱藏單元的激活值可以告訴我們單元飽和程度;梯度的快速增長和消失不利於模型優化;在一次小批量參數更新過程中梯度參數的更新最好在原參數的1%左右,而不是50%或0.001%。注意如果數據是稀疏的(如自然語言),那么有些參數可能很少更新。
  5. tensorboard

其他

  1. 早停
  2. label smothing,在ground truth和predication之間加上一個隨機值
  3. batchsize和lr存在一定關系,更大batch,梯度更穩定。在大的lr導致loss nan時可以試試。 
    learning_rate/batch_size: see https://github.com/pjreddie/darknet/blob/master/src/convolutional_layer.c#L530 
    decay * batch_size: see https://github.com/pjreddie/darknet/blob/master/src/convolutional_layer.c#L529
  4. 檢查你矩陣的重構「reshape」。大幅度的矩陣重構(比如改變圖像的 X、Y 維度)會破壞空間局部性,使網絡更不容易學習,因為這時網絡也必須學習重構。使用多個圖像/通道進行重構時要特別小心;可以使用 numpy.stack() 進行適當的對齊操作。

樣本不平衡問題

  1. 過采樣:隨機采樣、SMOTE、RAMO、Random Balance;Cluster-based oversampling;DataBoost-IM;class-aware sampling
  2. 欠采樣:隨機剔除、EasyEnsemble,one-sided selection;data decontamination
  3. 閾值移動:
  4. 代價敏感學習:
  5. focalloss,OHEM等

自動調參

  1. Random Search
  2. Gird Search
  3. Bayesian Optimization

減小內存

  1. 使用更大步態
  2. 使用1*1線性卷積核降維
  3. 使用池化降維
  4. 減小mini-batch大小
  5. 將數據類型由32為改成為16位
  6. 使用小的卷積核

Must Know Tips/Tricks in Deep Neural Networks 
模型調參:超參調節tips總結 
構建深度神經網絡,我有20條「不成熟」的小建議


免責聲明!

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



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