1. 程式人生 > >機器學習模型選擇:調參引數選擇

機器學習模型選擇:調參引數選擇

調參經驗

好的實驗環境是成功的一半

由於深度學習實驗超參眾多,程式碼風格良好的實驗環境,可以讓你的人工或者自動調參更加省力,有以下幾點可能需要注意:

  • 將各個引數的設定部分集中在一起。如果引數的設定分佈在程式碼的各個地方,那麼修改的過程想必會非常痛苦。
  • 可以輸出模型的損失函式值以及訓練集和驗證集上的準確率。
  • 可以考慮設計一個子程式,可以根據給定的引數,啟動訓練並監控和週期性儲存評估結果。再由一個主程式,分配引數以及並行啟動一系列子程式。

畫圖

畫圖是一個很好的習慣,一般是訓練資料遍歷一輪以後,就輸出一下訓練集和驗證集準確率。同時畫到一張圖上。這樣訓練一段時間以後,如果模型一直沒有收斂,那麼就可以停止訓練,嘗試其他引數了,以節省時間。
如果訓練到最後,訓練集,測試集準確率都很低,那麼說明模型有可能欠擬合。那麼後續調節引數方向,就是增強模型的擬合能力。例如增加網路層數,增加節點數,減少dropout值,減少L2正則值等等。
如果訓練集準確率較高,測試集準確率比較低,那麼模型有可能過擬合,這個時候就需要向提高模型泛化能力的方向,調節引數。

從粗到細分階段調參

實踐中,一般先進行初步範圍搜尋,然後根據好結果出現的地方,再縮小範圍進行更精細的搜尋。

  1. 建議先參考相關論文,以論文中給出的引數作為初始引數。至少論文中的引數,是個不差的結果。
  2. 如果找不到參考,那麼只能自己嘗試了。可以先從比較重要,對實驗結果影響比較大的引數開始,同時固定其他引數,得到一個差不多的結果以後,在這個結果的基礎上,再調其他引數。例如學習率一般就比正則值,dropout值重要的話,學習率設定的不合適,不僅結果可能變差,模型甚至會無法收斂。
  3. 如果實在找不到一組引數,可以讓模型收斂。那麼就需要檢查,是不是其他地方出了問題,例如模型實現,資料等等。可以參考我寫的深度學習網路除錯技巧

提高速度

調參只是為了尋找合適的引數,而不是產出最終模型。一般在小資料集上合適的引數,在大資料集上效果也不會太差。因此可以嘗試對資料進行精簡,以提高速度,在有限的時間內可以嘗試更多引數。

  • 對訓練資料進行取樣。例如原來100W條資料,先採樣成1W,進行實驗看看。
  • 減少訓練類別。例如手寫數字識別任務,原來是10個類別,那麼我們可以先在2個類別上訓練,看看結果如何。

某小皮

調參實戰

梯度下降迭代步長/學習率的選擇

learning rate α的設定對cost func的影響


左圖:α太小更新慢,執行時間長;α太大,走過了,可能一直到達不了極值。右圖:α設定太大會導致的另外兩種情形。

學習率怎麼選擇?

1 try running gradient descent with a range of values for α, like 0.001, 0.01,..., just plot j of theta as a function of number of iterations and then pick the value of alpha that seems to be causing j of theta to decrease rapidly.
2 trying out gradient descents with each value being about 3X bigger than the previous value.

learning rate: 1 0.1 0.01 0.001, 一般從1開始嘗試。很少見learning rate大於10的。學習率一般要隨著訓練進行衰減。衰減係數一般是0.5。

衰減時機,可以是驗證集準確率不再上升時,或固定訓練多少個週期以後。

3 線性搜尋

也就是將xk + 步長*梯度(只有梯度是未知引數)代入f(x)中,求解出梯度。

[統計學習方法]

4 自適應學習

自適應梯度的辦法,例如adam,adadelta,rmsprop等,這些一般使用相關論文提供的預設值即可,可以避免再費勁調節學習率。

在演算法迭代過程中逐步降低學習率(step_size)通常可以加快演算法的收斂速度。常用的用來更新學習率的方法有三種:

  • 逐步降低(Step decay),即經過一定迭代次數後將學習率乘以一個小的衰減因子。典型的做法包括經過5次迭代(epoch)後學習率乘以0.5,或者20次迭代後乘以0.1。
和多項式衰減類似:
global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) * (1 - global_step / decay_steps) ^ (power) + end_learning_rate
  • 指數衰減(Exponential decay),其數學表示式可以表示為:α=α0ekt,其中,α0k是需要設定的超引數,t是迭代次數。

指數衰減有自然指數衰減和指數衰減:

decayed_learning_rate = learning_rate * exp(-decay_rate * global_step)

或者decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)如 0.5 * 0.96 ^ (global_step / 1000)

  • 倒數衰減(1/t decay),其數學表示式可以表示為:α=α0/(1+kt),其中,α0k是需要設定的超引數,t是迭代次數。

即inverse_time_decay : decayed_learning_rate = learning_rate / (1 + decay_rate * t), 如inverse_time_decay(0.5, global_step, decay_steps=1000, decay_rate=0.5)

有人說實踐中發現逐步衰減的效果優於另外兩種方法,一方面在於其需要設定的超引數數量少,另一方面其可解釋性也強於另兩種方法。

對RNN來說,有個經驗,如果RNN要處理的序列比較長,或者RNN層數比較多,那麼learning rate一般小一些比較好,否則有可能出現結果不收斂,甚至Nan等問題。

gradient descent中α值的自動變化

實際上迭代步長自適應減小:在最終推匯出的更新公式中,可以得出以下直觀結論:如果遇到一個數據使得(y−hθ(x))比較小,這時候θ的更新也會很小,這也符合直觀感覺。當一個數據使得差值比較大時,θ的更新也會比較大。

the derivative here will be even smaller than it was at the green point.

As gradient descent runs. You will automatically take smaller and smaller steps until eventually you are taking very small steps.so actually there is no need to decrease alpha overtime.

[machine learning ng]

某小皮

規格化引數λ選擇

l2正則係數0.002, 1e-5。0.0表示不正則, -1表示0.25 / batch_size。超過10的很少見

[-1, 0.0, 5.0, 1.0, 0.1, 0.01, 0.001]

選擇交叉驗證集(而不是test set)上 error最小的模型及其對應的λ。

通過交叉驗證集上的的函式來選擇λ的值。

太大的λ對應高bias(underfit),這時訓練集和交叉驗證集可能都沒擬合好;太小的λ對應高variance(overfit),這時across validation error也會很高。

所以我們一般選擇適當大的λ,此時交叉驗證集上的error最小,而訓練集上的誤差也不大。

某小皮

深度學習網路調參技巧

[深度學習網路調參技巧]

ref: