神经网络优化篇:详解神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)
神經網絡的權重初始化
這是一個神經單元初始化地例子,然后再演變到整個深度網絡。
來看看只有一個神經元的情況,然后才是深度網絡。
單個神經元可能有4個輸入特征,從\(x_{1}\)到\(x_{4}\),經過\(a=g(z)\)處理,最終得到\(\hat{y}\),稍后講深度網絡時,這些輸入表示為\(a^{[l]}\),暫時用\(x\)表示。
\(z = w_{1}x_{1} + w_{2}x_{2} + \ldots +w_{n}x_{n}\),\(b=0\),暫時忽略\(b\),為了預防\(z\)值過大或過小,可以看到\(n\)越大,希望\(w_{i}\)越小,因為\(z\)是\(w_{i}x_{i}\)的和,如果把很多此類項相加,希望每項值更小,最合理的方法就是設置\(w_{i}=\frac{1}{n}\),\(n\)表示神經元的輸入特征數量,實際上,要做的就是設置某層權重矩陣\(w^{[l]} = np.random.randn( \text{shape})*\text{np.}\text{sqrt}(\frac{1}{n^{[l-1]}})\),\(n^{[l - 1]}\)就是喂給第\(l\)層神經單元的數量(即第\(l-1\)層神經元數量)。
結果,如果是用的是Relu激活函數,而不是\(\frac{1}{n}\),方差設置為\(\frac{2}{n}\),效果會更好。常常發現,初始化時,尤其是使用Relu激活函數時,\(g^{[l]}(z) =Relu(z)\),它取決于對隨機變量的熟悉程度,這是高斯隨機變量,然后乘以它的平方根,也就是引用這個方差\(\frac{2}{n}\)。這里,用的是\(n^{[l - 1]}\),因為本例中,邏輯回歸的特征是不變的。但一般情況下\(l\)層上的每個神經元都有\(n^{[l - 1]}\)個輸入。如果激活函數的輸入特征被零均值和標準方差化,方差是1,\(z\)也會調整到相似范圍,這就沒解決問題(梯度消失和爆炸問題)。但它確實降低了梯度消失和爆炸問題,因為它給權重矩陣\(w\)設置了合理值,也知道,它不能比1大很多,也不能比1小很多,所以梯度沒有爆炸或消失過快。
提到了其它變體函數,剛剛提到的函數是Relu激活函數,一篇由Herd等人撰寫的論文曾介紹過。對于幾個其它變體函數,如tanh激活函數,有篇論文提到,常量1比常量2的效率更高,對于tanh函數來說,它是\(\sqrt{\frac{1}{n^{[l-1]}}}\),這里平方根的作用與這個公式作用相同(\(\text{np.}\text{sqrt}(\frac{1}{n^{[l-1]}})\)),它適用于tanh激活函數,被稱為Xavier初始化。Yoshua Bengio和他的同事還提出另一種方法,可能在一些論文中看到過,它們使用的是公式\(\sqrt{\frac{2}{n^{[l-1]} + n^{\left[l\right]}}}\)。其它理論已對此證明,但如果想用Relu激活函數,也就是最常用的激活函數,會用這個公式\(\text{np.}\text{sqrt}(\frac{2}{n^{[l-1]}})\),如果使用tanh函數,可以用公式\(\sqrt{\frac{1}{n^{[l-1]}}}\),有些作者也會使用這個函數。
實際上,認為所有這些公式只是給一個起點,它們給出初始化權重矩陣的方差的默認值,如果想添加方差,方差參數則是另一個需要調整的超級參數,可以給公式\(\text{np.}\text{sqrt}(\frac{2}{n^{[l-1]}})\)添加一個乘數參數,調優作為超級參數激增一份子的乘子參數。有時調優該超級參數效果一般,這并不是想調優的首要超級參數,但發現調優過程中產生的問題,雖然調優該參數能起到一定作用,但考慮到相比調優,其它超級參數的重要性,通常把它的優先級放得比較低。
希望現在對梯度消失或爆炸問題以及如何為權重初始化合理值已經有了一個直觀認識,希望設置的權重矩陣既不會增長過快,也不會太快下降到0,從而訓練出一個權重或梯度不會增長或消失過快的深度網絡。在訓練深度網絡時,這也是一個加快訓練速度的技巧。
總結
以上是生活随笔為你收集整理的神经网络优化篇:详解神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux解压tar.gz的方法
- 下一篇: Namecheap:.xyz等域名仅需9