1. 程式人生 > >深度學習中的Xavier初始化和He Initialization(MSRA初始化)、Tensorflow中如何選擇合適的初始化方法?

深度學習中的Xavier初始化和He Initialization(MSRA初始化)、Tensorflow中如何選擇合適的初始化方法?

Xavier初始化:

論文:Understanding the difficulty of training deep feedforward neural networks

論文地址:http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

“Xavier”初始化方法是一種很有效的神經網路初始化方法。“Xavier”初始化方法初始化方法的目標就是使得每一層輸出的方差應該儘量相等。xavier權重初始化使得訊號在經過多層神經元后保持在合理的範圍(不至於太小或太大)。Xavier初始化可以幫助減少梯度彌散問題, 使得訊號在神經網路中可以傳遞得更深。

Xavier初始化演算法的推導:

Xavier 的推導過程主要基於以下三個假設:

1、忽略偏置項對網路的影響;

2、所有的非線性函式均為雙曲正切函式Tanh ,且非線性函式的前向後向計算都近似為線性計算,因此它的影響也可以忽略;

3、輸入資料和引數相互獨立。

我們假設神經網路的隱藏層計算公式為:

 其中n是上一層神經元的數量。那麼,根據概率統計裡的兩個隨機變數乘積的方差展開式為:

如果E(xi)=E(wi)=0(可以通過批量標準化Batch Normalization來滿足這個條件),則上式變為:

如果隨機變數xi、wi還滿足獨立同分布,則上式變為:

即輸出的方差var(z)與輸入的方差var(x)有關,為使輸出的方差var(z)與輸入的方差var(x)相同,則只要nVar(Wi)=1。

即:

對於前向傳播時,wi的方差為:

反向傳播時wi的方差為:

我們需要保證正向傳播和反向傳播時的方差相等。而實際情況中, 往往不相等,因此,我們就取一種折衷方案,即令方差為:

又在概率統計學中,[a,b] 間的均勻分佈的方差為: 

我們這裡假設引數初始化的範圍是[-a,a]。將b=-a帶入上面的的公式,得:

上面兩式是相等的,故可以解出:

故Xavier初始化就是下面的均勻分佈:

因此,假如我們定義引數所在層的輸入維度為n,輸出維度為m,那麼這層的權重w的初始化就是從範圍內的均勻分佈內取隨機值。

Xavier初始化方法適用的啟用函式需要滿足一定限制:關於0對稱;線性(或可以近似看成線性)。而ReLU和PReLU啟用函式不滿足前面的條件一。

He Initialization(MSRA初始化):

論文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification 

論文地址:https://arxiv.org/pdf/1502.01852.pdf

上面的Xavier初始化的非線性函式選擇的是tanh,那麼如果非線性函式選擇RELU時,我們仍然想使得每一層輸出的方差儘量相等,該怎麼做呢?

He Initialization推導過程:

這裡又有一個假設:

假定在ReLU網路中,每一層有一半的神經元被啟用,另一半為0。也就是說,我們假定前面的線性計算部分輸出的值有一半大於0,另一半小於0。

假設卷積層的線性計算部分公式為:

我們假設wl和xl仍然都是獨立同分布的,則:

我們令wl的均值為0,則有:

,故xl的均值顯然不為0。

如果我們讓wl-1對稱分佈在0附近,bl-1=0,那麼yl-1也關於0對稱分佈,yl-1的均值也為0,令其上界為k,則有:

按照我們最開始的假設,經過ReLU 層後,xl的資料有一半變成了0,另一半變成了從0到k的均勻分佈,那麼有:

即當非線性函式是RELU時,有

注意上面的推導式基於假設xl的資料經過Relu層後,有一半變成了0,另一半變成了從0到k的均勻分佈。

代回上式,得:

如果將前面的層都帶入,則:

故可得:

於是我們在初始化w時,就可以在一個一個均值為0,方差為的高斯分佈中取隨機值。

可以類比上面的Xavier初始化的推導過程,我們發現就是右邊多乘了一個1/2。

注意我們的第一層的w應該滿足,因為輸入資料沒有經過relu函式就進入了第一層。

類似地,對於反向傳播,我們也能得出類似的結論:

注意:

有的文章將He Initialization這種初始化方法稱為MSRA初始化,且引用的論文也是同一篇,推導過程完全一樣,可以認為He Initialization與MSRA初始化就是同一種方法。

Tensorflow中如何選擇合適的初始化方法?

如果使用sigmoid和tanh等關於0對稱且為線性(或近似線性)的啟用函式,最好使用xavier初始化;

如果使用relu和Prelu啟用函式,則最好使用He Initialization。