1. 為什么要初始化權重
為了使網絡中的信息更好的傳遞,每一層的特征的方差(標准差)應該盡可能相等,否則可能會導致梯度爆炸或者消失。
權重初始化的目的是在深度神經網絡中前向傳遞時,阻止網絡層的激活函數輸出爆炸(無窮大)或者消失(0)。如果網絡層的輸出爆炸或者消失,損失函數的梯度
也會變得很大或者很小,無法有效后向傳遞,使得神經網絡需要更長的時間才能收斂甚至無法收斂。
矩陣乘法是神經網絡中的基本數學操作。在深度神經網絡中,前向傳遞需要在每一層的輸入與權重之間執行矩陣相乘,前一層的相乘結果作為后面一層的輸入。
舉個簡單的例子,假設我們有一個網絡的輸入向量x。訓練神經網絡的標准做法,是對輸入x歸一化,讓它的值落入一個均值為0,標准差為1的正態分布中。

x正態分布
假設我們有一個不含激活函數的100層網絡,並且每層都有一個權重矩陣w。為了完成前向傳遞,我們使每層的輸入和權重相乘,總共100次。
事實證明,把網絡層的權重值用標准正態分布進行初始化並不好。為了弄明白其原因,我們可以模擬網絡的前向傳播。

輸出爆炸
在100次的矩陣相乘后,輸出爆炸(nan)。
看一下前向傳遞多久會輸出爆炸。第28次的輸出就為nan了,顯然權重初始化的值偏大。

第28次輸出爆炸, i=0,...,27
不過我們還得考慮網絡層的輸出消失的問題。當權重w的初始化值太小的時候,觀察一下效果。使用均值為0,標准差0.01的正態分布去初始化權重。

輸出消失
上面的前向傳遞,激活輸出消失了。
總結就是,如果權重初始化的值太大或者太小,網絡無法有效學習。
2. 如何找到最優的初始化值
如前所述,一次完整的前向傳遞只需要連續地使網絡層的輸入和權重進行矩陣相乘就可以。如果輸出y是輸入x和權重w的矩陣乘積,那么y中第\(i\)個元素\(y_i\)如下,
其中\(i\)是權重w給定行的索引,\(k\)既是給定列的索引又是輸入向量x的元素索引,\(n\)是x中元素的個數。這個公式可以在Python中表示為:
y[i] = sum([c*d for c,d in zip(a[i], x)])
可以證明,在給定的某一層,利用標准正態分布初始化的輸入x和權重w的乘積,平均情況下,這個乘積的標准差非常接近網絡層的輸入單元的數目(如512)的平方根,本例中是\(\sqrt{512}\)。

10000次矩陣相乘的平均標准差
如果我們從矩陣乘法的定義來看待這個值就再正常不過了:為了計算y,我們將輸入x乘以權重矩陣w的一列512個元素的點積求和,得到y中的一個元素。
在我們下面的例子中使用了標准正態分布來初始化x和w,所以y的每個元素\(y_i\)都是均值為0,標准差為1。

標准正態分布的2個元素相乘10000次
因此,y的均值為0,方差為512,標准差就為\(\sqrt{512}\)。
因此在上面的例子中,經過27次傳遞后網絡層的輸出就爆炸了。在我們100層的網絡結構中,我們想要的是對於每一層的輸出,其標准差為1,這樣就可以連續地在網絡層之間
進行矩陣相乘,而層的輸出不會爆炸或者消失。
如果我們將權重初始值除以\(\sqrt{512}\)進行縮小,那么y中各元素值的方差會變成\({1} \over {512}\),即標准差\({1} \over {\sqrt{512}}\),如下。

標准差sqrt(1/512)
這意味着y的標准差為1,因為y有512個標准差為\({1} \over {\sqrt{512}}\)的元素。實驗證實如下,

y的標准差1
再運行一下這個100層的網絡。首先初始化權重w,用標准正態分布初始化,再除以\(1 \over \sqrt{n}\),\(n\)是網絡層的輸入數目,本例是\(n=512\)。

100層網絡的輸出既不爆炸,也不消失。
可見,100層網絡的輸出既不會爆炸,也不會消失。
雖然乍一看似乎真的搞定了,但是真正的神經網絡模型並不像我們這個例子那么簡單。為了簡單起見,我們省略了激活函數。但是,在實際中我們永遠不會這樣做。正是因為有了這些非線性激活函數,深度神經網絡才能非常近似地模擬真實世界那些錯綜復雜的現象,並且生成那些令人驚訝的預測,例如手寫樣本的分類。
3. Xavier初始化
直到幾年前,最常用的激活函數是關於某個給定的值對稱的,雙曲正切函數和softsign函數就是這類激活函數。

Tanh和softsign激活函數
我們在假設的100層網絡中每一層添加雙曲正切激活函數,然后觀察使用我們的權重初始化方案時會發生什么,這里層的權重按\(1 \over \sqrt{n}\)縮小。

使用random.normal正態分布隨機初始化,100次后輸出
第100層的輸出的標准差約為0.087,這個值是偏小的,但至少激活並沒有完全消失!
現在回想起來,發現我們自己的權重初始化策略還是很直觀的。但你可能會發現,就在2010年,這還不是初始化網絡層權重的傳統方法。當Xavier Glorot和Yoshua Bengio發表了他們的
標志性文章《Understanding the difficulty of training deep feedforward neural networks》,
他們在實驗中對比的“啟發式”方法是:使用[-1,1]的均勻分布來初始化權重,然后按\(1 \over \sqrt{n}\)的比例縮放權重。事實證明,這種“標准”方法實際上並不能很好地發揮作用。

使用[-1,1)均勻分布來初始化,100次后輸出消失
使用這種“標准”權重初始化方法重新運行我們的100層\(tanh\)網絡會導致激活梯度變得無限小--就像消失了一樣。
這種糟糕的結果促使Glorot和Bengio提出他們自己的權重初始化策略,他們在論文中稱之為“normalized initialization”,現在通常被稱為“Xavier初始化”。
Xavier初始化策略是使用以\(\pm \sqrt{6} \over {\sqrt{n_i+n_{i+1}}}\)為邊界的隨機均勻分布對權重進行初始化。 其中\(n_i\)是輸入數目("fan-in"),\(n_{i+1}\)是輸出數目("fan-out")。
Glorot和Bengio認為Xavier權重初始化將保持激活函數的前向傳播的方差和梯度反向傳播的方差。在實驗中,他們觀察到Xavier初始化使一個5層網絡能夠將每層的權重梯度維持在幾乎同樣的方差。

使用Xavier初始化
相反,若不使用Xavier初始化,而是直接使用“標准”初始化,會導致網絡的下層權重梯度(較大)與最上層(接近零)的權重梯度之間的差異更大。

不使用Xavier初始化
重點就是,Glorot和Bengio證明了使用Xavier初始化的網絡在CIFAR-10圖像分類任務上實現了更快的收斂速度和更高的精度。
讓我們再次重新運行我們的100層\(tanh\)網絡,這次使用Xavier初始化:

使用Xavier初始化
在我們所做的實驗中,Xavier初始化方法與我們之前自定義的方法非常相似,之前的方法是從隨機正態分布中采樣,並使用輸入數目\(n\)的平方根進行縮放。
4. Kaiming初始化
理論上,當使用關於0對稱並且在[-1,1]內有輸出的激活函數(例如softsign和tanh)時,我們希望每層的輸出平均值為0,平均標准差為1。這正是我們的自定義方法和Xavier都能實現的。
但是,如果我們使用\(ReLU\)激活函數呢?以同樣的方式縮放初始權重值是否仍然有意義?

ReLU激活函數
為了弄明白會發生什么,讓我們在先前假設的100層網絡層中使用\(ReLU\)激活來代替\(tanh\),並觀察其輸出的標准差。

使用ReLU激活函數
事實證明,當使用\(ReLU\)激活時,單層的平均標准差非常接近輸入數目的平方根除以2的平方根,在我們的例子中也就是\(\sqrt{512} \over \sqrt{2}\)。
使用該值縮放權重w將會導致每個\(ReLU\)層的輸出具有1的標准差,如下例,

使用\sqrt(2/512)縮放初始化權重
研究如何最優的初始化以\(ReLU\)為激活函數的網絡的權重,何凱明提出他們自己的方案,專門用來處理這些非對稱、非線性激活的深層神經網絡。
在他們的2015年論文中何凱明等人證明了如果采用以下輸入權重初始化策略,深層網絡(例如22層CNN)會更快收斂:
-
創建合適的權重矩陣w,並使用標准正態分布隨機初始化權重。
-
將每個隨機選擇的數字乘以\(\sqrt{2 \over n}\),其中\(n\)是前一層輸出到本層的連接數目(也稱為“fan-in”)。
-
偏差bias初始化為零。
我們可以按照這些指示來實現Kaiming初始化,並驗證在100層網絡所有層使用\(ReLU\),它確實可以防止輸出爆炸或消失。

使用kaiming初始化,ReLU激活
最后再來對比,對所有層使用\(ReLU\)激活函數,但是用Xavier初始化,

使用Xavier初始化,ReLU激活
使用Xavier初始化,輸出在第100非常接近0,幾乎消失了。
當他們使用\(ReLU\)訓練更深層的網絡時,何凱明等人發現使用Xavier初始化的30層CNN完全停止並且不再學習。然而使用上面的He初始化相同的網絡時,它的收斂效果非常好。

當我們從頭開始訓練的任何網絡,特別是計算機視覺應用,幾乎肯定會包含\(ReLU\)激活函數,並且是深度網絡。在這種情況下,Kaiming初始化應該是我們首選的權重初始化策略。
-----------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------
第1部分參考: https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79
第2部分參考: