天天看點

深度學習中神經網絡的權重初始化方法

在介紹Xavier 之前,我們先來看看四種簡單的參數初始化方法:

1) 全部初始化為零;2)初始化為相同的随機數;3)初始化為較小的随機數;4)初始化為較大的随機數;分别分析它們的優缺點,再引出本文要介紹的Xavier Initialization和He initialization。

1) 全部初始化為零;

這種方式最簡單,我們線上性回歸,logistics回歸的時候,經常把參數初始化為0,我們的模型也能夠很好的工作。

W = np.zeros(input_layer_neurons, hidden_layer_neurons)      

但是将權重w全部初始化為零,那麼每一層所學到的參數都是一樣的,因為它們的梯度一樣,是以在反向傳播的過程中,每一層的神經元也是相同的。是以會導緻代價函數在開始的一段時間内,明顯下降,但是一段時間以後,停止繼續下降。

深度學習中神經網絡的權重初始化方法

2)初始化為相同的随機數;

其實将權重w初始化為相同的随機數和全部初始化為零是一樣的,都會導緻同樣的問題,即Symmetry problem。

W = np.zeros(input_layer_neurons, hidden_layer_neurons)*T      

随機初始化可以打破對稱,讓我們随機初始化權重。在随機初始化之後,每個神經元可以繼續學習其輸入的不同功能。這裡我們隻是随機初始化權重參數,偏差還是繼續初始化為零。

3)初始化為較小的随機數;

權重參數随機初始化為服從均值為零和方差為1的高斯分布函數。

W = np.random.randn(input_layer_neurons, hidden_layer_neurons)*0.01      

開始模型可以很好的運作一段時間,但是随着時間增加,前向傳遞時,方差開始減少,梯度也開始向零靠近,會導緻Gradient Vanishing。特别地,當激活函數為sigmoid時,梯度接近0.5;當激活函數為時tanh,梯度接近0。

4)初始化為較大的随機數;

W = np.random.randn(input_layer_neurons, hidden_layer_neurons)      

反向傳播時,倒數趨于零,梯度也會消失。此外,權重較大且當輸入也很大時,如果使用sigmoid做激活函數,會使輸出趨向于0和1,會導緻更多問題。

The above two arguments showed us that in both the cases either initializing weights as small values or large they tend to vanish. In small values, the gradient vanishes because of repeated chain multiplication while in large it vanishes because the derivative itself becomes zero. Hence they both can’t be used.

引出本文正題,上圖

深度學習中神經網絡的權重初始化方法

為了簡化,假設我們的輸入x服從均值為0,方差為1的正态分布,那麼有

a1的方差

因為輸入均值為0,那麼有

輸入方差為1,有

同理,可以推出ak的方差

很明顯,當 時,梯度會爆炸;當,梯度會消失。 是以我們需要嚴格限制或者在1附近波動,有

是以我們有

,其中n為前一層的神經元個數,這就是Xavier/Glorot Initialization。

1 Xavier/Glorot Initialization(适用于激活函數是sigmoid和tanh)

W = np.random.randn(input_layer_neurons, hidden_layer_neurons)* sqrt(1/input_layer_neurons)      

Xavier initialization是 Glorot 等人為了解決随機初始化的問題提出來的另一種初始化方法,他們的思想很簡單,就是盡可能的讓輸入和輸出服從相同的分布,這樣就能夠避免後面層的激活函數的輸出值趨向于0。

2 MSRA/He initialization(适用于激活函數relu)

W = np.random.randn(input_layer_neurons,hidden_layer_neurons)* sqrt(2/input_layer_neurons)      

繼續閱讀