訓練小技巧

1、參數初始化

幾種方式,結果差不多。但是一定要做。否則可能會減慢收斂速度,影響收斂結果,甚至造成Nan等一系列問題。

優秀的初始化應該使得各層的激活值和狀態梯度的方差在傳播過程中的方差保持一致。不然更新後的激活值方差發生改變,造成數據的不穩定。

Xavier初始化 :

WU[6ni+ni+1,6ni+ni+1] W \sim U[-\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}},\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}}]

  • 假設激活函數關於0對稱,且主要針對於全連接神經網絡。適用於tanh和sigmoid

He初始化

  • 條件:正向傳播時,狀態值的方差保持不變;反向傳播時,關於激活值的梯度的方差保持不變。

  • 論文:https://arxiv.org/abs/1502.01852

  • 理論方法

    • 適用於ReLU的初始化方法:

    WU[0,2n^i] W \sim U[0,\sqrt{\frac{2}{\hat{n}_i}}]

    • 適用於Leaky ReLU的初始化方法:

    WU[0,2(1+α2)n^i] W \sim U[0,\sqrt{\frac{2}{(1+\alpha^2)\hat{n}_i}}]

    其中
    n^i=hiwidihi,widi \hat{n}_i = h_i * w_i * d_i \\ h_i,w_i分別表示卷積層中卷積核的高和寬 \\ d_i表示當前層卷積核的個數

具體方法

下面的n_in爲網絡的輸入大小,n_out爲網絡的輸出大小,n爲n_in或(n_in+n_out)/2

  • uniform均勻分佈初始化:

    w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
    
    • Xavier初始法,適用於普通激活函數(tanh,sigmoid):scale = np.sqrt(3/n)
    • He初始化,適用於ReLU:scale = np.sqrt(6/n)
  • normal高斯分佈初始化:

    w = np.random.randn(n_in,n_out) * stdev # stdev爲高斯分佈的標準差,均值設爲0
    
    • Xavier初始法,適用於普通激活函數 (tanh,sigmoid):stdev = np.sqrt(n)
    • He初始化,適用於ReLU:stdev = np.sqrt(2/n)
  • svd初始化:對RNN有比較好的效果。參考論文:https://arxiv.org/abs/1312.6120

技巧

正確初始化最後一層的權重。如果迴歸一些平均值爲50的值,則將最終偏差初始化爲50。如果有一個比例爲1:10的不平衡數據集,請設置對數的偏差,使網絡預測概率在初始化時爲0.1。正確設置這些可以加速模型的收斂。

2、數據預處理方式

  • zero-center

    這個挺常用的.

    X -= np.mean(X, axis = 0)   # zero-center
    X /= np.std(X, axis = 0)    # normalize
    
  • PCA whitening

    這個用的比較少.

3、梯度裁剪

實現方法見**pytorch小操作**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章