天天看點

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

計算機視覺與深度學習系列部落格傳送門

【計算機視覺與深度學習】線性分類器(一)

【計算機視覺與深度學習】線性分類器(二)

【計算機視覺與深度學習】全連接配接神經網絡(一)

目錄

  • 激活函數再探讨
  • 梯度下降算法的改進
    • 梯度下降算法存在的問題
    • 動量法
    • 自适應梯度法,AdaGrad算法與RMSProp算法
    • Adam算法
  • 權值初始化
    • 全零初始化
    • 随機權值初始化
    • Xavier初始化
    • HE初始化 (MSRA)
    • 總結

激活函數再探讨

首先我們來看Sigmoid函數 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1​對其求導 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma '(x)=\sigma(x)(1-\sigma(x)) σ′(x)=σ(x)(1−σ(x))

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

當輸入值大于10或小于-10的時候,Sigmoid函數的局部梯度都接近0,這是非常不利于網絡的梯度流傳遞的。這就是梯度消失問題,本質上,梯度消失是鍊式法則的乘法特性導緻的。

與之相對應的是梯度爆炸。梯度爆炸也是鍊式法則的乘法特性導緻的,函數“斷崖處”的梯度乘上學習率後會是一個非常大的值,進而在更新參數時“飛”出了合理區域,最終會導緻算法不收斂。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

解決梯度爆炸的一個方案是使用梯度裁剪,把沿梯度方向前進的步長限制在某個值内就可以避免在更新參數時“飛”出合理區域。

我們再看雙曲正切函數 tanh ⁡ ( x ) = sin ⁡ h x cos ⁡ h x = e x − e − x e x + e − x \tanh(x)=\frac{\sin hx}{\cos hx}=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=coshxsinhx​=ex+e−xex−e−x​對其求導 tanh ⁡ ′ ( x ) = 1 − tanh ⁡ 2 ( x ) \tanh'(x)=1-\tanh^2(x) tanh′(x)=1−tanh2(x)

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

與Sigmoid函數類似,tanh函數的局部梯度特性不利于網絡梯度流的反向傳遞。

接下來是ReLU函數 R e L U ( x ) = max ⁡ ( 0 , x ) ReLU(x)=\max(0,x) ReLU(x)=max(0,x)

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

當輸入大于0時,局部梯度永遠不會為0,這比較有利于梯度流的傳遞。但ReLU函數仍有一些不完美,當輸入小于等于0時(當輸入為0時函數沒有導數,一般規定0處的導數值為0),其導數值為0,是以提出了LeakyReLU函數 L e a k y R e L U ( x ) = max ⁡ ( α x , x ) LeakyReLU(x)=\max(\alpha x,x) LeakyReLU(x)=max(αx,x)

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

LeakyReLU函數基本沒有“死區”,即梯度永遠不會為0。之是以說“基本”,是因為函數在0處沒有導數,前向計算中輸入為0的機率非常小,幾乎沒有可能,是以函數在0處沒有導數對于計算而言沒有影響。

對于激活函數的選擇,我們應當盡可能地選擇ReLU函數或LeakyReLU函數,相比于Sigmoid函數和tanh函數,ReLU函數和LeakyReLU函數會讓梯度流的傳遞更加順暢,訓練過程收斂得更快,也能更有效地防止梯度消失。

梯度下降算法的改進

梯度下降算法存在的問題

在全連接配接神經網絡中,損失函數有一個特性,就是在一個方向上變化迅速,而在另一個方向上變化緩慢。當我們想要優化參數使得損失值更小的時候,若使用梯度下降法,損失值就會在“山壁”間震蕩,而往“山谷”底端行進的速度較慢。若我們發現模型收斂速度過慢,隻是簡單地增大學習率(即步長)是不能加快收斂速度的。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

動量法

改進梯度下降算法存在的問題,一個最簡單的想法就是減少“山壁”間的震蕩,加快前往“谷底”的速度,是以我們可以利用累加曆史梯度資訊來更新梯度,這就是動量法。

在小批量梯度下降算法上進行改進。在疊代前設定動量系數 μ \mu μ,初始化速度 v = 0 v=0 v=0。此前的疊代過程中,更新權值是令 θ : = θ − α g \theta:=\theta-\alpha g θ:=θ−αg其中 α \alpha α為學習率, g g g為計算出的梯度。使用動量法,每次疊代過程中,令速度更新為 v : = μ v + g v:=\mu v+g v:=μv+g再利用更新的速度更新權值 θ : = θ − α v \theta:=\theta -\alpha v θ:=θ−αv

對于動量系數 μ \mu μ,其取值範圍為 [ 0 , 1 ) [0,1) [0,1),當 μ = 0 \mu=0 μ=0時,動量法等價于梯度下降算法。一般我們設定 μ = 0.9 \mu=0.9 μ=0.9。

使用動量法的好處在于,曆史梯度資訊累加過程中,震蕩方向互相抵消,而前往“谷底”的方向得到加強,進而加快了模型的收斂速度。

動量法還能解決一些常見現象帶來的問題,例如損失函數常具有不太好的局部最小點或鞍點(高維空間非常常見),在這些點的位置上,梯度為0,若使用梯度下降算法更新參數會認為模型已經收斂,參數不會再更新。如果使用動量法,由于動量的存在,算法可以沖出局部最小點和鞍點,進而找到更優解。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

自适應梯度法,AdaGrad算法與RMSProp算法

自适應梯度法與動量法的思路不同。梯度幅度平方較大的方向是震蕩方向,梯度幅度平方較小的方向是平坦方向。自适應梯度法通過減小震蕩方向步長、增大平坦方向步長的方法來減小震蕩,加速通往“谷底”。

AdaGrad算法是一種自适應梯度算法,下面在小批量梯度下降算法上進行改進實作AdaGrad算法。

在疊代前設定小常數 δ \delta δ(用于被小數除時的數值穩定,一般設定為 1 0 − 5 10^{-5} 10−5),初始化累積變量 r = 0 r=0 r=0。在疊代過程中,計算出梯度 g g g,累計平方梯度 r : = r + g 2 r:=r+g^2 r:=r+g2再利用累積平方梯度更新權值 w : = w − α r + δ g w:=w-\frac{\alpha}{\sqrt r+\delta}g w:=w−r

​+δα​g其中 α \alpha α為學習率。由于震蕩方向的累積平方梯度較大,将其開根号後作為分母,計算得出的值就會是一個比較小的值。同理,平坦方向計算得出的值是一個比較大的值。這樣就加快了模型收斂速度。

但是,AdaGrad算法也存在不足,随着累積時間的變長,累積變量 r r r将會是一個非常大的值,此時更新參數的步長就會變得非常小,進而失去了調節作用。為了解決這一問題,RMSProp算法被提出。

RMSProp算法也是一種自适應梯度算法。在疊代前設定衰減速率 ρ \rho ρ,小常數 δ \delta δ(一般設定為 1 0 − 5 10^{-5} 10−5),初始化累積變量 r = 0 r=0 r=0。與AdaGrad算法不同,RMSProp算法在疊代過程中累積平方梯度 r : = ρ r + ( 1 − ρ ) g 2 r:=\rho r+(1-\rho)g^2 r:=ρr+(1−ρ)g2再利用累積平方梯度更新權值 w : = w − α r + δ g w:=w-\frac{\alpha}{\sqrt r+\delta}g w:=w−r

​+δα​g其中 α \alpha α為學習率。衰減速率 ρ \rho ρ的取值範圍為 [ 0 , 1 ) [0,1) [0,1),它削弱了曆史梯度資訊,一般設定 ρ = 0.999 \rho=0.999 ρ=0.999。

Adam算法

Adam算法是動量法和自适應梯度法的思想結合而成的産物。在疊代前設定衰減速率 ρ \rho ρ(一般設定為 0.999 0.999 0.999),動量系數 μ \mu μ(一般設定為 0.9 0.9 0.9),小常數 δ \delta δ(一般設定為 1 0 − 5 10^{-5} 10−5),初始化累積變量 r = 0 , v = 0 r=0,v=0 r=0,v=0。在疊代過程中,計算梯度 g g g,累積梯度 v : = μ v + ( 1 − μ ) g v:=\mu v+(1-\mu)g v:=μv+(1−μ)g累積平方梯度 r : = ρ r + ( 1 − ρ ) g 2 r:=\rho r+(1-\rho)g^2 r:=ρr+(1−ρ)g2修正偏差 v ~ = v 1 − μ t \widetilde{v}=\frac{v}{1-\mu^{t}} v

=1−μtv​ r ~ = r 1 − ρ t \widetilde{r}=\frac{r}{1-\rho^t} r

=1−ρtr​更新權值 θ : = θ − α r ~ + δ v ~ \theta :=\theta-\frac{\alpha}{\sqrt{\widetilde{r}}+\delta}\widetilde{v} θ:=θ−r

​+δα​v

修正偏差步驟可以極大緩解算法初期的冷啟動問題。算法初期,計算出的梯度 g g g比較小,如果不進行修正會減慢算法的收斂速度。

權值初始化

全零初始化

使用全零初始化,網絡中不同的神經元有相同的輸出,進行同樣的參數更新,是以,這些神經元學習的參數都一樣,本質上等價于一個神經元。

随機權值初始化

使用包含10個隐藏層(每個隐藏層包含500個神經元)和1個輸出層的網絡進行實驗,使用雙曲正切激活函數,權值分别采樣自 N ( 0 , 0.01 ) \mathcal N(0,0.01) N(0,0.01)和 N ( 0 , 1 ) \mathcal N(0,1) N(0,1)的高斯分布,實驗結果如下圖所示。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化
【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

實驗表明,使用随機權值初始化并不能保證網絡能夠正常地被訓練。

Xavier初始化

我們希望網絡各層的激活值和局部梯度的方差在傳播過程中盡量保持一緻,以保證網絡中正向和反向的資料流動。

一個神經元,其輸入為 z 1 , z 2 , . . . , z N z_1,z_2,...,z_N z1​,z2​,...,zN​,這 N N N個輸入是獨立同分布的;其權值為 w 1 , w 2 , . . . , w N w_1,w_2,...,w_N w1​,w2​,...,wN​,它們也是獨立同分布的; w \bm w w和 z \bm z z是獨立的,其激活函數為 f f f,則輸出 y \bm y y的表達式為 y = f ( w 1 z 1 + w 2 z 2 + . . . + w N z N ) \bm y=f(\bm w_1 \bm z_1+\bm w_2 \bm z_2+...+\bm w_N \bm z_N) y=f(w1​z1​+w2​z2​+...+wN​zN​)這就是Xavier初始化。

Xavier初始化的目标是使網絡各層的激活值和局部梯度的方差在傳播過程中盡量保持一緻,即尋找 w \bm w w的分布使得輸出 y y y與輸入 z \bm z z的方差一緻。假設 f f f為雙曲正切函數, w 1 , w 2 , . . . , w N w_1,w_2,...,w_N w1​,w2​,...,wN​獨立同分布, z 1 , z 2 , . . . , z N z_1,z_2,...,z_N z1​,z2​,...,zN​獨立同分布, w \bm w w和 z \bm z z獨立且均值都為 0 0 0,則有

V a r ( y ) = V a r ( ∑ i = 1 N w i z i ) = ∑ i = 1 N V a r ( w i z i ) = ∑ i = 1 N [ E ( w i ) ] 2 V a r ( z i ) + [ E ( z i ) ] 2 V a r ( w i ) + V a r ( w i ) V a r ( z i ) = ∑ i = 1 N V a r ( w i ) V a r ( z i ) = n V a r ( w i ) V a r ( z i ) \begin{aligned} Var(\bm y)&=Var(\sum_{i=1}^{N}w_iz_i) \\ &=\sum_{i=1}^{N}Var(w_iz_i) \\ &=\sum_{i=1}^{N}[E(w_i)]^2Var(z_i)+[E(z_i)]^2Var(w_i)+Var(w_i)Var(z_i) \\ &=\sum_{i=1}^{N}Var(w_i)Var(z_i) \\ &=nVar(w_i)Var(z_i) \end{aligned} Var(y)​=Var(i=1∑N​wi​zi​)=i=1∑N​Var(wi​zi​)=i=1∑N​[E(wi​)]2Var(zi​)+[E(zi​)]2Var(wi​)+Var(wi​)Var(zi​)=i=1∑N​Var(wi​)Var(zi​)=nVar(wi​)Var(zi​)​

V a r ( w ) = 1 N Var(\bm w)=\frac{1}{N} Var(w)=N1​時, y \bm y y的方差與 z \bm z z的方差一緻。

使用包含10個隐藏層(每個隐藏層包含500個神經元)和1個輸出層的網絡進行實驗,使用雙曲正切激活函數,權值采樣自 N ( 0 , 1 / N ) \mathcal N(0,1/N) N(0,1/N)的高斯分布,其中 N N N為輸入,得到下面的實驗結果。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

改變激活函數為ReLU函數,得到下面的實驗結果。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

根據實驗結果可知,Xavier初始化方法不太适合ReLU激活函數。

HE初始化 (MSRA)

HE初始化與Xavier初始化的不同在于權值采樣自 N ( 0 , 2 / N ) \mathcal N(0,2/N) N(0,2/N)的高斯分布,其中 N N N為輸入。使用包含10個隐藏層(每個隐藏層包含500個神經元)和1個輸出層的網絡進行實驗,使用ReLU激活函數進行實驗,結果如下。

【計算機視覺與深度學習】全連接配接神經網絡(二)激活函數再探讨梯度下降算法的改進權值初始化

總結

好的初始化方法可以防止前向傳播過程中的資訊消失,也可以解決反向傳播過程中的梯度消失。當激活函數選擇Sigmoid函數或tanh函數時,建議使用Xavier初始化方法;當激活函數選擇ReLU函數或LeakyReLU函數時,建議使用HE初始化方法。

繼續閱讀