吳恩達深度學習筆記(37)-神經網絡的權重初始化再解析

神經網絡的權重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)

上節課,我們學習了深度神經網絡如何產生梯度消失和梯度爆炸問題,最終針對該問題,我們想出了一個不完整的解決方案,雖然不能徹底解決問題,卻很有用,有助於我們為神經網絡更謹慎地選擇隨機初始化參數,為了更好地理解它,我們先舉一個神經單元初始化地例子,然後再演變到整個深度網絡。

吳恩達深度學習筆記(37)-神經網絡的權重初始化再解析

我們來看看只有一個神經元的情況,然後才是深度網絡。

單個神經元可能有4個輸入特徵,從x_1到x_4,經過a=g(z)處理,最終得到^y,稍後講深度網絡時,這些輸入表示為a^([l]),暫時我們用x表示。

z=w_1 x_1+w_2 x_2+⋯+w_n x_n,b=0,暫時忽略b,

為了預防z值過大或過小,你可以看到n越大,你希望w_i越小,因為z是w_i x_i的和,如果你把很多此類項相加,希望每項值更小,最合理的方法就是設置w_i=1/n,n表示神經元的輸入特徵數量,實際上,你要做的就是設置某層權重矩陣

吳恩達深度學習筆記(37)-神經網絡的權重初始化再解析

,n^([l-1])就是我餵給第l層神經單元的數量(即第l-1層神經元數量)。

吳恩達深度學習筆記(37)-神經網絡的權重初始化再解析

結果,如果你是用的是Relu激活函數,而不是1/n,方差設置為2/n,效果會更好。

你常常發現,初始化時,尤其是使用Relu激活函數時,g^([l]) (z)=Relu(z),它取決於你對隨機變量的熟悉程度,這是高斯隨機變量,然後乘以它的平方根,也就是引用這個方差2/n。

這裡,我用的是n^([l-1]),因為本例中,邏輯迴歸的特徵是不變的。但一般情況下l層上的每個神經元都有n^([l-1])個輸入。

如果激活函數的輸入特徵被零均值和標準方差化,方差是1,z也會調整到相似範圍,這就沒解決問題(梯度消失和爆炸問題)。但它確實降低了梯度消失和爆炸問題,因為它給權重矩陣w設置了合理值,你也知道,它不能比1大很多,也不能比1小很多,所以梯度沒有爆炸或消失過快。

吳恩達深度學習筆記(37)-神經網絡的權重初始化再解析

我提到了其它變體函數,剛剛提到的函數是Relu激活函數,一篇由Herd等人撰寫的論文曾介紹過。

對於幾個其它變體函數,如tanh激活函數,有篇論文提到,常量1比常量2的效率更高,對於tanh函數來說,它是√(1/n^([l-1]) ),這裡平方根的作用與這個公式作用相同

(np.sqrt(1/n^([l-1]) )),它適用於tanh激活函數,被稱為Xavier初始化。

Yoshua Bengio和他的同事還提出另一種方法,你可能在一些論文中看到過,它們使用的是公式√(2/(n^([l-1])+n^[l] ))。

其它理論已對此證明,

但如果你想用Relu激活函數,也就是最常用的激活函數,

我會用這個公式np.sqrt(2/n^([l-1]) ),

如果使用tanh函數,可以用公式√(1/n^([l-1]) ),有些作者也會使用這個函數。

實際上,我認為所有這些公式只是給你一個起點,它們給出初始化權重矩陣的方差的默認值,如果你想添加方差,方差參數則是另一個你需要調整的超級參數,可以給公式np.sqrt(2/n^([l-1]) )添加一個乘數參數,調優作為超級參數激增一份子的乘子參數。

有時調優該超級參數效果一般,這並不是我想調優的首要超級參數,但我發現調優過程中產生的問題,雖然調優該參數能起到一定作用,但考慮到相比調優,其它超級參數的重要性,我通常把它的優先級放得比較低。

希望你現在對梯度消失或爆炸問題以及如何為權重初始化合理值已經有了一個直觀認識,希望你設置的權重矩陣既不會增長過快,也不會太快下降到0,從而訓練出一個權重或梯度不會增長或消失過快的深度網絡。我們在訓練深度網絡時,這也是一個加快訓練速度的技巧。


分享到:


相關文章: