1. 程式人生 > >神經網路之權重初始化(附程式碼)

神經網路之權重初始化(附程式碼)

摘要

神經網路/深度學習模型訓練的過程本質是對權重進行更新,在對一個新的模型進行訓練之前,需要每個引數有相應的初始值。對於多層神經網路/深度學習而言,如何選擇引數初始值便成為一個值得探討的問題。本文從實現啟用值的穩定分佈角度來探討神經網路的效率優化問題


權重在神經網路/深度學習中的作用(個人領受)

神經網路的作用是從大量不同的待訓練資料中發現數據本身的內在規律(提取特徵資料)。這就要求輸入資料不能過於集中,資料相對來說要有一定的分散空間,這樣神經網路才能發揮它不斷學習和歸類的優勢。資料過於集中要麼說明資料集本身分佈就不全面,要麼說明資料已經分類得比較好了,作為訓練資料會誤導神經網路。這樣神經網路也就失去了意義,甚至會起反作用

按照上述推導,在多層神經網路中,因為存在各層級聯的情況,前一層的輸出會成為下一層的輸入。所以為了使各層神經網路真正的發揮作用,就要求各層(非輸出層)的輸出符合資料本身的分佈特性,而不能過於集中。不然下一級的神經網路就失去了意義,甚至會起反作用

為了使各層(非輸出層)的輸出符合某種分佈,而不過於集中。f(wx+b)中的每一項都需要研究和優化。包括啟用函式f、權重w和偏置b。本文主要討論權重w初始值對神經網路的影響

神經網路一個理想的初始狀態應該是各層輸出值比較分散,而且能反映輸入資料本身的分佈特性。這樣在反向傳播時,各權重值的變化方向和大小也能呈現出離散性,有利於網路的快速收斂

什麼樣的初始狀態利於學習和調整

學習和調整實際上是反向傳播的過程,通過梯度下降法調整權重和偏置。那麼有利於使用梯度下降法改善權重和偏置的狀態就是一個比較好的狀態。如何有利於使用梯度下降法?梯度大的地方收斂就快。這就需要看具體的啟用函式特性
為了使得網路中資訊更好的流動,每一層輸出分佈應當儘量與輸入一致,方差應該儘量相等
在初始化的時候使各層神經元的方差保持不變, 即使各層有著相同的分佈. 很多初始化策略都是為了保持每層的分佈不變。

ff

梯度爆炸與梯度消失

針對多次神經網路,在神經網路的反向傳播過程中,根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話,那麼即使這個結果是0.99,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於0。都大於1的話,梯度會隨著反向傳播層數的增加而呈指數增長,導致梯度爆炸。

權重初始化方法

附圖為輸入0均值,1標準差,10層網路,經過初始態,一次正向傳播後各層輸出分佈。具體程式碼見GITHUB

固定值(0值)

極不建議。因為如果網路中的每個神經元都計算出同樣的輸出,然後它們就會在反向傳播中計算出同樣的梯度,從而進行同樣的引數更新。換句話說,如果權重被初始化為同樣的值,神經元之間就失去了不對稱性的源頭
經過10層網路後各層的輸出分佈

0值

隨機化

經過10層網路後各層的輸出分佈

隨機數
- 小隨機數

根據啟用函式的特性,選擇小隨機數

sigmod
tanh

只適用於小型網路。
權重初始值要非常接近0又不能等於0。解決方法就是將權重初始化為很小的數值,以此來打破對稱性。其思路是:如果神經元剛開始的時候是隨機且不相等的,那麼它們將計算出不同的更新,並將自身變成整個網路的不同部分。小隨機數權重初始化的實現方法是:W = 0.01 * np.random.randn(D,H)來生成隨機數的。根據這個式子,每個神經元的權重向量都被初始化為一個隨機向量,而這些隨機向量又服從一個多變數高斯分佈,這樣在輸入空間中,所有的神經元的指向是隨機的。
如果每層都用N(0, 0.01)隨機初始化的話, 各層的資料分佈不一致, 隨著層度的增加, 神經元將集中在很大的值或很小的值, 不利於傳遞資訊.

經過10層網路後各層的輸出分佈

小隨機數
- Xavier

最為常用的神經網路權重初始化方法
神經網路分佈的方差隨著輸入數量的增大而增大,可以通過正則化方差來提高權重收斂速率.不合適的權重初始化會使得隱藏層的輸入的方差過大,從而在經過sigmoid這種非線性層時離中心較遠(導數接近0),因此過早地出現梯度消失
前向傳播推導

1

2

3

4

5

反向傳播推導

6

最終分佈條件

7

8

本次僅使用前向傳播類進行類比
經過10層網路後各層的輸出分佈

Xavier
- HE/MSRA

Xavier推導的時候假設啟用函式是線性的。HE/MSRA是沿用Xavier的思想,針對relu型別的啟用函式做的進一步優化
Xavier初始化經過10層網路RELU啟用後各層的輸出分佈

HE/MSRA

HE/MSRA初始化經過10層網路RELU啟用後各層的輸出分佈

HE/MSRA

  • 稀疏初始化
    將所有權重矩陣設為0,但是為了打破對稱性,每個神經元都同下一層固定數目的神經元隨機連線(其權重數值由一個小的高斯分佈生成)。一個比較典型的連線數目是10個。

fine-turning

  • pre-training
    首先使用一個方法(貪婪演算法、無監督學習。。。)針對每一層的權重進行優化,用於提取有效的特徵值,然後用優化好的權重進行訓練
  • Transfer Learning
    用當前已訓練好的比較穩定的神經網路。這一塊研究文章較多,後面作為專題研究

另闢蹊徑-跳過權重問題————批量歸一化

在每次前向傳播過程中,都將輸入資料進行歸一化整理,使得輸入資料滿足某種分佈規律
公式

批量歸一化公式

隨機初始化經過10層網路批量歸一化後各層的輸出分佈

批量歸一化

例項

具體程式碼見GITHUB
- 訓練框架:TensorFlow
- 資料集:MNIST手寫識別
- 神經網路型別:4隱藏層,sigmoid啟用
- 針對全零初始化、小隨機數初始化、Xavier初始化和批量歸一化進行訓練次數和準確率對比

序號 初始化方法 達到80%的訓練次數 最終精確度
1 全零初始化 無法達到 11%
2 小隨機數初始化 無法達到 11%
3 Xavier初始化 6000 95%
4 小隨機數初始化+批量歸一化 1000 95%

全零初始化

全零初始化

小隨機數初始化

小隨機數初始化

Xavier初始化

Xavier初始化

小隨機數初始化+批量歸一化

小隨機數初始化+批量歸一化

結論

  • 優先使用批量歸一化
  • 優先使用Xavier初始化方法
  • ReLU啟用函式優先使用HE/MSRA初始化方法

參考資料
- 聊一聊深度學習的weight initialization
- Stacked Autoencoders
- CS231n neural-networks-2 對應翻譯筆記
- 深度學習——Xavier初始化方法
- 深度學習——MSRA初始化
- TensorFlow從0到1 | 第十五章 重新思考神經網路初始化
- 神經網路中啟用函式稀疏啟用性的重要性
- 譯文 | 批量歸一化:通過減少內部協變數轉移加速深度網路訓練