我們知道,神經網絡的訓練大體可以分為下面幾步:
- 初始化 weights 和 biases
- 前向傳播,用 input X, weights W ,biases b, 計算每一層的 Z 和 A,最後一層用 sigmoid, softmax 或 linear function 等作用 A 得到預測值 Y
- 計算損失,衡量預測值與實際值之間的差距
- 反向傳播,來計算損失函數對 W, b 的梯度 dW ,db,
- 然後通過隨機梯度下降等算法來進行梯度更新,重複第二到第四步直到損失函數收斂到最小。
其中第一步 權重的初始化 對模型的訓練速度和準確性起著重要的作用,所以需要正確地進行初始化。
下面兩種方式,會給模型的訓練帶來一些問題。
1. 將所有權重初始化為零
會使模型相當於是一個線性模型,因為如果將權重初始化為零,那麼損失函數對每個 w 的梯度都會是一樣的,這樣在接下來的迭代中,同一層內所有神經元的梯度相同,梯度更新也相同,所有的權重也都會具有相同的值,這樣的神經網絡和一個線性模型的效果差不多。(將 biases 設為零不會引起多大的麻煩,即使 bias 為 0,每個神經元的值也是不同的。)
2. 隨機初始化
將權重進行隨機初始化,使其服從標準正態分佈 ( np.random.randn(size_l, size_l-1) )
在訓練深度神經網絡時可能會造成兩個問題,梯度消失和梯度爆炸。
- 梯度消失
是指在深度神經網絡的反向傳播過程中,隨著越向回傳播,權重的梯度變得越來越小,越靠前的層訓練的越慢,導致結果收斂的很慢,損失函數的優化很慢,有的甚至會終止網絡的訓練。
解決方案有:
- Hessian Free Optimizer With Structural Dumping,
- Leaky Integration Units,
- Vanishing Gradient Regularization,
- Long Short-Term Memory,
- Gated Recurrent Unit,
- Orthogonal initialization
- 梯度爆炸
和梯度消失相反,例如當你有很大的權重,和很小的激活函數值時,這樣的權重沿著神經網絡一層一層的乘起來,會使損失有很大的改變,梯度也變得很大,也就是 W 的變化(W - * dW)會是很大的一步,這可能導致在最小值周圍一直振盪,一次一次地越過最佳值,模型可能一直也學不到最佳。爆炸梯度還有一個影響是可能發生數值溢出,導致計算不正確,出現 NaN,loss 也出現 NaN 的結果。
解決方案有:
- Truncated Backpropagation Through Time (TBPTT),
- L1 and L2 Penalty On The Recurrent Weights,
- Teacher Forcing,
- Clipping Gradients,
- Echo State Networks
關於梯度消失請看 梯度消失問題與如何選擇激活函數
梯度消失和爆炸的應對方案有很多,本文主要看權重矩陣的初始化
對於深度網絡,我們可以根據不同的非線性激活函數用不同方法來初始化權重。
也就是初始化時,並不是服從標準正態分佈,而是讓 w 服從方差為 k/n 的正態分佈,其中 k 因激活函數而不同。這些方法並不能完全解決梯度爆炸/消失的問題,但在很大程度上可以緩解。
- 對於 RELU(z),用下面這個式子乘以隨機生成的 w,也叫做 He Initialization:
- 對於 tanh(z),用 Xavier 初始化方法,即用下面這個式子乘以隨機生成的 w,和上一個的區別就是 k 等於 1 而不是 2。
在 TensorFlow 中:
W = tf.get_variable('W', [dims], tf.contrib.layers.xavier_initializer())
- 還有一種是用下面這個式子乘以 w:
上面這幾個初始化方法可以減少梯度爆炸或消失, 通過這些方式,w 既不會比 1 大很多,也不會比 1 小很多,所以梯度不會很快地消失或爆炸,可以避免收斂太慢,也不會一直在最小值附近震盪。
學習資料:
https://medium.com/usf-msds/deep-learning-best-practices-1-weight-initialization-14e5c0295b94
https://www.leiphone.com/news/201703/3qMp45aQtbxTdzmK.html
閱讀更多 慕課網 的文章