1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai
1.11 神經網絡的權重初始化 Weight Initialization for Deep NetworksVanishing / Exploding gradients
【本節內容似懂非懂,還需要擴展研究一下】
3.11 隨機初始化 中使用的是隨機數乘以一個小常數,例如0.01,避免隱藏單元完全對稱,失去多隱藏單元的意義
本節根據不同激活函數使用隨機數乘以一個公式,除了避免隱藏單元完全對稱,還可以減少梯度爆炸或過快消失
針對深度NN的梯度消失和梯度爆炸問題,我們想出了一個不完整的解決方案,雖然不能徹底解決問題,卻很有用,有助於我們爲NN更謹慎地選擇隨機初始化參數。
先以單個神經元爲例。
上圖是單個神經元。
有4個輸入特徵x1,x2,x3,x4,激活函數a=g(z),預測值。
和上節課一樣,還是先忽略b,b=0,可以得到
爲了預防z值過大或過小,由於z是的和,如果你把很多此類項相加,那每項乘積值應該更小,所以n越大,你希望越小。
最合理的方法就是設置方差,n表示神經元的輸入特徵數量。
實際上,你要做的就是設置某層權重矩陣
是第l層每個神經單元特徵數量分之一。是l層擬合的單元數量(即第l-1層神經單元數量,l層每個神經單元特徵數量=l-1層神經單元數量)。
如果你使用的是Relu激活函數,方差,效果會比更好。
你常常發現,初始化時,尤其是使用Relu激活函數時,即,它取決於你對隨機變量的熟悉程度。
【補充】
—————————————— begin ——————————————————————
參考 https://blog.csdn.net/zenghaitao0128/article/details/78556535
重點
- np.random.randn()函數可以返回一個或一組服從標準正態分佈的隨機樣本值。
- 當randn()有兩個及以上參數時,則返回對應維度的數組,能表示向量或矩陣。
- 標準正態分佈是正態分佈(高斯分佈)的一種,具有正態分佈的所有特徵。
- 在NN構建中,權重參數W通常採用該函數進行初始化,當然需要注意的是,通常會在生成的矩陣後面乘以小數,比如0.01,目的是爲了提高梯度下降算法的收斂速度。
W = np.random.randn(2,2)*0.01 #產生參數爲(2,2)的高斯分佈隨機變量,再乘以0.01可以生成一個很小隨機數
- 該函數在前面已經介紹隨機初始化時候也提到過,參考鏈接
—————————————— end ——————————————————————
所以,表示高斯分佈隨機變量乘以的平方根,也就是方差。這裏我們用的是,因爲本例中,邏輯迴歸的特徵是不變的。但一般情況下l層上的每個神經元都有個輸入。
如果激活函數的輸入特徵被零均值和標準方差化,方差是1,即歸一化輸入,z也會調整到相似範圍,這就沒解決梯度消失和爆炸問題。
但它確實降低了梯度消失和爆炸問題,因爲它給權重矩陣w設置了合理值,你也知道,它不能比1大很多,也不能比1小很多,所以梯度沒有爆炸或消失過快。
我們已經看到,這裏的Relu函數用的是公式初始化權重的方差。
對於tanh激活函數,常量1比常量2的效率更高,使用的是公式,作用和Relu函數的一樣,它被成爲被稱爲Xavier初始化。
實際上,我認爲上面的這些公式只是給你一個起點,它們給出初始化權重矩陣的方差的默認值。
如果你想添加方差,方差參數則是另一個你需要調整的超級參數。
可以給公式添加一個乘數參數,調優作爲超級參數激增一份子的乘子參數。
有時調優該超級參數效果一般,這並不是我想調優的首要超級參數,但我發現調優過程中產生的問題,雖然調優該參數能起到一定作用,但考慮到相比調優,其它超級參數的重要性,我通常把它的優先級放得比較低。
通過本節介紹,希望你現在對梯度消失或爆炸問題以及如何爲權重初始化合理值已經有了一個直觀認識,希望你設置的權重矩陣既不會增長過快,也不會太快下降到0,從而訓練出一個權重或梯度不會增長或消失過快的深度網絡。