深度學習中,典型的參數更新方法首先是SGD
它的更新方法如下$$\eta,\alpha都是超參數$$
但該方法面對非勻向的損失函數(如呈現延伸狀),是收斂不到最小值的,以
繪制兩函數的梯度圖如下
F1的梯度圖
F2的梯度圖
在梯度圖上隨機取一點,F1通過SGD總能達到最小值0,但F2則很難,這就好比一個球在兩個曲度不一樣的圓盤上滾動,F1可以滾到中心但F2則很難,這是因為F2橫軸方向的梯度太小了,難以達到中心
這時,就引入了Momentum,該方法具有同方向更新的累加效應,公式如下
很容易證明,此方法朝同一方向更新的話,步子會越來越大,就能解決上述橫軸梯度過小的問題,隨之而來的是豎軸方向的步子變小了,但比起之前總體的震盪次數變小
前兩種都是針對參數,而AdaGrad原理是隨着學習的進行,會使學習率逐漸減小,公式如下,h代表學習率
從公式可以看出,該方法會記錄過去所有梯度的平方和,所以若無止境地學習,更新量會變為0——RMSProp方法會逐漸的遺忘過去,可以避免0的情況
最后一種Adam則組合前面Momentum與AdaGrad的優點
四種算法的比較如下所示,都是基於mnist數據集的比較
接着說一下權重的初始值,一般都是使用標准差為0.01的高斯分布生成的。因為若將權重的初始值設成一樣的值,在反向傳播中,所有的權重值可能都會進行相同的更新(如乘法節點的反向傳播),這樣的話,神經網絡擁有許多不同的權重的意義都喪失了,為了防止權重均一化,瓦解權重的對稱結構,必須隨機生成初始值。
上圖使用標准差為1的高斯分布作為權重初始值的各層激活值的分布,可以看出激活值偏向0和1,這里使用的是sigmoid激活函數,由該函數特性可知,激活值若偏向0或1,那反向傳播時,容易發生梯度消失,即傳播的導數為0,學習不能進行下去
上圖則使用0.01的高斯分布,但出現了激活值集中在0.5附近,不會發生梯度消失,但這時就出現了表現力受限的問題,因為多個神經元都輸出幾乎相同的值,那何不用一個神經元表達基本相同的事情,所以也要求各層激活值的分布要有適當的廣度(這有點像神經網絡必須要有激活層,若沒有,多層的變換其實可以用一層代替,因為神經網絡的傳播就是線性變換,加入激活函數,就是加入非線性特性)
怎樣解決這個問題呢?
這里提出了Xavier初始值,該方法考慮了前一層的神經元數量,即若前一層的節點數是n,那該層的初始值使用標准差為
該方法的結果如下,可知分布比之前更廣,但后面圖像卻很歪斜,但用tanh函數代替sigmoid,就能得到改善。
激活函數是sigmoid時
激活函數是tanh時
但該方法面對激活函數是relu時就顯的力不從心,從下圖可以看出,隨着層的加深,偏向逐漸變大,因為Xavier初始值是以激活函數是線性函數為前提推導出來,而sigmoid和tanh左右對稱,中央附近可以視作線性函數,而relu則不一樣。
激活函數是relu時
這時針對relu有一種專門的方法-He初始值,因為relu的負值區域的值為0,為使它更有廣度,需2倍的系數,即
relu函數,使用He初始值
下圖是激活函數是relu,不同權重初始化時在mnist數據集的比較