1. 程式人生 > >深度學習 --- 優化入門三(梯度消失和啟用函式ReLU)

深度學習 --- 優化入門三(梯度消失和啟用函式ReLU)

前兩篇的優化主要是針對梯度的存在的問題,如鞍點,區域性最優,梯度懸崖這些問題的優化,本節將詳細探討梯度消失問題,梯度消失問題在BP的網路裡詳細的介紹過(興趣有請的檢視我的這篇文章),然後主要精力介紹RuLU啟用函式,本篇還是根據國外的文章進行翻譯,然後再此基礎上補充,這樣使大家更容易理解,好,那就開始了:

分佈,該死的分佈,還有統計學

不同於之前的機器學習方法,神經網路並不依賴關於輸入資料的任何概率學或統計學假定。然而,為了確保神經網路學習良好,最重要的因素之一是傳入神經網路層的資料需要具有特定的性質。

  1. 資料分佈應該是零中心化(zero centered)的,也就是說,分佈的均值應該在零附近。不具有這一性質的資料可能導致

    梯度消失和訓練動。

  2. 最好分佈的英文正態的,可能否則導致網路過擬合輸入側空間的某個區域。

  3. 在訓練過程中,不同批和不同網路層的啟用分佈,應該保持一定程度上的一致。如果不具備這一性質,那麼我們說分佈出現了內部協方差偏移(Internal Covariate shift),這可能拖慢訓練程序。

這篇文章將討論如何使用啟用函式應對前兩個問題。文末將給出一些選擇啟用函式的建議。

梯度消失

SIGM

梯度消失問題在神經網路層數相對較多的時會遇到,,梯度消失原因是鏈式求導,導致梯度逐層遞減,我們BP第一節推倒公式時就是通過鏈式求導把各層連線起來的,但是因為啟用函式是SIGMOD函式,取值在1和-1之間,因此每次求導都會比原來小,當層次較多時,就會導致求導結果也就是梯度接近於0。具體如下所示:

        上圖對應的神經網路的定義為,且  ,則表示式可為:y_i = sigmod(z_i)z_i = w_ix_i + b_i

        又因為,因此最大值才為0.25,隨著網路的加深,,總體的值越小,因此會發生梯度消失問題,一般解決方法是需要從啟用函式或者網路層次著手,如啟用函式考慮RELU函式代替SIGMOD函式。sigmod'(x)= x(1-x)

與梯度消失相反的現象稱為梯度爆炸,即反向傳播中,每層都是大於1,導致最後累乘會很大,梯度爆炸容易解決,一般設定閾值就可以解決。

讓我們做一個簡單的試驗。隨機取樣50個0到1之間的數,然後將它們相乘。  

import random

from functools import reduce

li = [random.uniform(0,1) for x in range(50)

print(reduce(lambda x,y: x*y, li))

你可以自己試驗一下。我試了很多次,從來沒能得到一個數量級大於10-18的數。如果這個值是神經元一個梯度的表示式中的一個因子,那麼梯度幾乎就等於零。這意味著,在較深的架構中,較深的神經元基本不學習,即使學習,和較淺的網路層中的神經元相比,學習的速率極低。

現象這個就是梯度消失問題,較深的神經元中的梯度變為零,或者說,消失了。這就導致神經網路中較深的層學習極為緩慢,或者,在最糟的情況下,根本不學習。

飽和神經元

飽和神經元會導致梯度消失問題進一步惡化。假設,傳入帶sigmoid啟用的神經元的啟用前數值ωTx+ b非常大或非常小。那麼,由於sigmoid在兩端處的梯度幾乎是0,任何梯度更新基本上都無法導致權重ω和偏置b發生變化,神經元的權重變動需要很多步才會發生。也就是說,即使梯度原本不低,由於飽和神經元的存在,最終梯度仍會趨向於零。如下圖

                                                             o_k = \ frac {1} {1 + e ^ {net_k}} 

RELU救星

在普通深度網路設定下,RELU啟用函式的引入是緩解梯度消失問題的首個嘗試(LSTM的引入也是為了應對這一問題,不過它的應用場景是迴圈模型)。

RELU

當x> 0時,ReLU的梯度為1,x <0時,ReLU的梯度為0。這帶來了一些好處.ReLU函式梯度乘積並不收斂於0,因為RELU的梯度要麼是0,要麼是1。當梯度值為1時,梯度原封不動地反向傳播。當梯度值為0時,從這點往後不會進行反向傳播。 

單邊飽和

乙狀結腸函式是雙邊飽和的,也就是說,正向趨於1,負向都趨向於零.ReLU則提供單邊飽和。準確地說,RELU的左半部分不叫飽和,飽和的情況下,函式值變動極小,而RELU的左半部分根本不變。但兩者的作用是類似的。你也許會問,單邊飽和帶來了什麼好處?我們可以把深度網路中的神經元看成開關,這些開關專門負責檢測特定特徵。特徵這些常常被稱為概念。高層網路中的神經元也許最終會專門檢測眼睛,輪胎之類的高層特徵,而低層網路中的神經元最終專門檢測曲線,邊緣之類的低層特徵。當這樣的概念存在於神經網路的輸入時,我們想要啟用相應的神經元,而啟用的數量級則可以測量概念的程度。例如,如果神經元檢測到了邊緣,它的數量級也許表示邊緣的銳利程度。

                                                   由神經元建立的啟用圖學習不同的概念

然而,神經元的負值在這裡就沒什麼意義了。用負值編碼不存在的概念的程度感覺怪怪的。以檢測邊緣的神經元為例,相比啟用值為5的神經元,啟用值為10的神經元可能檢測到了更銳利的邊緣。但是區分啟用值-5和-10的神經元就沒什麼意義了,因為負值表示根本不存在邊緣。因此,用統一零表示概念不存在的英文很方便的.ReLU的單邊飽和正符合這一點。

資訊解纏和對噪聲的魯棒性

單邊飽和提高了神經元對噪聲的魯棒性。為什麼?假設神經元的值是無界的,也就是在兩個方向上都不飽和。具有程度不同的概念的輸入產生神經元正值輸出的不同。由於我們想要用數量級指示訊號的強度,這很好。然而,背景噪聲,神經元不擅長檢測的概念(例如,包含弧線的區域傳入檢測線條的神經元),會生成不同的神經元負值輸出。這類不同可能給其他神經元帶去大量無關,無用資訊。這也可能導致單元間的相關性。例如,檢測線條的神經元也許和檢測弧線的神經元負相關。而在神經元單邊飽和(負向)的場景下,噪聲等造成的不同,也就是之前的負值輸出數量級的不同,被啟用函式的飽和元素擠壓為零,從而防止噪聲產生無關訊號。

稀疏性

RELU函式在算力上也有優勢。基於RELU的網路訓練起來比較快,因為計算RELU啟用的梯度不怎麼需要算力,而乙狀結腸梯度計算就需要指數運算.ReLU歸零啟用前的負值,這就隱式地給網路引入了稀疏性,同樣節省了算力。

死亡RELU問題

RELU也有缺陷。雖然稀疏性在算力上有優勢,但過多的稀疏性實際上會阻礙學習。啟用前神經元通常也包含偏置項,如果偏置項是一個過小的負數,使得ωTx + b <0,那麼ReLU啟用在反向傳播中的梯度就是0,使負的啟用前神經元無法更新。如果學習到的權重和偏置使整個輸入域上的啟用前數值都是負數,那麼神經元就無法學習,引起類似S形的飽和現象。稱為這死亡RELU問題

零中心化啟用

不管輸入是什麼,RELU只輸出非負啟用。這可能是一個劣勢。對基於RELU的神經網路而言,層網路z_n的權重ωN的啟用為

 因此,對損失函式大號而言:                                           

式上的中一世的英文一個指示函式,傳入的RELU值為正數時輸出1,否則輸出0。由於RELU只輸出非負值,ωN中的每項權重的梯度更新正負都一樣。這裡其實就是梯度了,RELU的特性的導數為1,並不影響誤差的反向傳播。 

這有什麼問題?問題在於,由於所有神經元型態的梯度更新的符號都一樣,網路層中z_n的所有權重在一次更新中,要麼全部增加,要麼全部減少。然而,理想情況的梯度權重更新也許是某些權重增加,另一些權重減少.ReLU下,這做不到。假設,根據理想的權重更新,有些權重需要減少。然而,如果梯度更新是正值,這些權重可能在當前迭代中變為過大的正值。下一次迭代,梯度可能會變成較小的負值以補償這些增加的權重,這也許會導致最終跳過需要少量負值或正值變動才能取到的權重。這可能導致搜尋時最小值出現ž字模式即會產生振盪,拖慢訓練速度如下圖所示:

relu_problem

Leaky ReLU和引數化ReLU

為了克服死亡ReLU問題,人們提出了Leaky ReLU(裂縫修正單元).Leaky ReLU和普通ReLU幾乎完全一樣,除了x <0時有一個很小的斜率。在實踐中,這個很小的斜率\α通常取0.01 ,Leaky ReLU的優勢在於反向傳播可以更新產生負的啟用前值的權重,因為Leaky ReLU啟用函式的負值區間的梯度是\α。因為負的啟用值會生成負值而不是0,Leaky ReLU沒有ReLU中的權重只在一個方向上更新的問題。\α該取多大,人們做了很多試驗。有一種稱為隨機Leaky ReLU的方法,負值區間的斜率從均值為0,標準差為1的均勻分佈中隨機抽取如下:

éæºLeakyReLU

 

原始論文提到隨機的選取\α能得到比Leaky ReLU更好的結果,訓練起來也更快,並通過經驗方法得出,如果限定只使用單一的α值,那麼1 / 5.5要比通常選擇的0.01效果要好.Leaky ReLU奏效的原因是負值區間斜率的隨機選擇給負的啟用前值梯度帶來了隨機性。在優化演算法中引入的隨機性,或者說噪聲,有助於擺脫區域性極小值和鞍點。後來人們又進一步提出,α可以看作一個引數,在網路的訓練過程中學習。採用這一方法的啟用函式稱為引數化ReLU

回顧下飽和

神經元飽和看起來是一件很糟的事情,但RELU中的單邊飽和未必不好。儘管前面提到的一些RELU變體抑制了死亡RELU問題,但卻喪失了單邊飽和的益處。

指數線性單元和偏置偏移

基於上面的討論,看起來一個完美的啟用函式應該同時具備以下兩個性質:

  1. 產生零中心化分佈,以加速訓練過程

  2. 具有單邊飽和,以導向更好的收斂

Leaky ReLU和PReLU(引數化ReLU)滿足第一個條件,不滿足第二個條件。而原始的ReLU滿足第二個條件,不滿足第一個條件。

同時滿足兩個條件的一個啟用函式是指數線性單元(ELU)。

                                                               

x> 0部分,ELU的梯度是1,x <0部分的梯度則是α×ex.ELU啟用函式的負值區域趨向於-α。α是一個超引數,通常取1。

如何選擇啟用函式

  1. 首先嚐試RELU啟用。儘管我們上面列出了RELU的一些問題,但很多人使用RELU取得了很好的結果。根據奧卡姆剃刀原則,先嚐試更簡單的方案比較好。相比RELU的有力挑戰者,RELU的算力負擔最輕。如果你的專案需要從頭開始程式設計,那麼RELU的實現也特別簡單。

  2. 如果ReLU的效果不好,我會接著嘗試Leaky ReLU或ELU。我發現能夠產生零中心化啟用的函式一般要比不能做到這點的函式效果好得多.ELU看起來很有吸引力,但是由於負的啟用前值會觸發大量指數運算,基於ELU的網路訓練和推理都很緩慢。如果算力資源對你而言不成問題,或者網路不是特別巨大,選擇ELU,否則,選擇Leaky ReLU .LReLU和ELU都增加了一個需要調整的超引數

  3. 如果算力資源很充沛,時間很充裕,你可以將上述啟用函式的表現與PReLU和隨機RELU做下對比。如果出現了過擬合,那麼隨機RELU可能會有用。引數化RELU加入了需要學習的一組引數,所以,只在具備大量訓練資料的情況下才考慮選用引數化ReLU

結語

這篇文章討論了傳入什麼樣的資料分佈,有利於神經網路層恰當地學習。啟用函式隱式地歸一化這些分佈,而一種稱為批歸一化(Batch Normalization)的技術明確地進行了這一操作。批歸一化是近年來深度學習領域的主要突破之一。不過,我們要到本系列的下一篇文章才會討論這一技術,目前而言,你可以親自嘗試下在自己的網路上使用不同的啟用函式有什麼效果

 

進一步閱讀

  1. 爆炸梯度問題
  2. 深入瞭解ReLU的優勢
  3. 關於是否仍在使用ReLU的reddit討論,如果是,為什麼?
  4. ELU論文

 

原文網址:https://blog.paperspace.com/vanishing-gradients-activation-function/(需要翻牆)

還需要新增點東西,一時想不到了,過段時間再來新增。