https://blog.csdn.net/ChenVast/article/details/81382939
神經網絡中使用激活函數來加入非線性因素,提高模型的表達能力。
ReLU(Rectified Linear Unit,修正線性單元)
形式如下:
ReLU公式近似推導::
下面解釋上述公式中的softplus,Noisy ReLU.
softplus函數與ReLU函數接近,但比較平滑, 同ReLU一樣是單邊抑制,有寬廣的接受域(0,+inf), 但是由於指數運算,對數運算計算量大的原因,而不太被人使用.並且從一些人的使用經驗來看(Glorot et al.(2011a)),效果也並不比ReLU好. softplus的導數恰好是sigmoid函數.softplus 函數圖像:
Noisy ReLU1 ReLU可以被擴展以包括高斯噪聲(Gaussian noise): f(x)=max(0,x+Y),Y∼N(0,σ(x))f(x)=max(0,x+Y),Y∼N(0,σ(x)) Noisy ReLU 在受限玻爾茲曼機解決計算機視覺任務中得到應用.
ReLU上界設置: ReLU相比sigmoid和tanh的一個缺點是沒有對上界設限.在實際使用中,可以設置一個上限,如ReLU6經驗函數: f(x)=min(6,max(0,x))f(x)=min(6,max(0,x)). 參考這個上限的來源論文: Convolutional Deep Belief Networks on CIFAR-10. A. Krizhevsky
ReLU的稀疏性(摘自這里):
當前,深度學習一個明確的目標是從數據變量中解離出關鍵因子。原始數據(以自然數據為主)中通常纏繞着高度密集的特征。然而,如果能夠解開特征間纏繞的復雜關系,轉換為稀疏特征,那么特征就有了魯棒性(去掉了無關的噪聲)。稀疏特征並不需要網絡具有很強的處理線性不可分機制。那么在深度網絡中,對非線性的依賴程度就可以縮一縮。一旦神經元與神經元之間改為線性激活,網絡的非線性部分僅僅來自於神經元部分選擇性激活。 對比大腦工作的95%稀疏性來看,現有的計算神經網絡和生物神經網絡還是有很大差距的。慶幸的是,ReLu只有負值才會被稀疏掉,即引入的稀疏性是可以訓練調節的,是動態變化的。只要進行梯度訓練,網絡可以向誤差減少的方向,自動調控稀疏比率,保證激活鏈上存在着合理數量的非零值。
ReLU 缺點
- 壞死: ReLU 強制的稀疏處理會減少模型的有效容量(即特征屏蔽太多,導致模型無法學習到有效特征)。由於ReLU在x < 0時梯度為0,這樣就導致負的梯度在這個ReLU被置零,而且這個神經元有可能再也不會被任何數據激活,稱為神經元“壞死”。
- 無負值: ReLU和sigmoid的一個相同點是結果是正值,沒有負值.
ReLU變種
Leaky ReLU
當x<0x<0時,f(x)=αxf(x)=αx,其中αα非常小,這樣可以避免在x<0x<0時,不能夠學習的情況:
稱為Parametric Rectifier(PReLU),將 αα 作為可學習的參數.
當 αα 從高斯分布中隨機產生時稱為Random Rectifier(RReLU)。
當固定為α=0.01α=0.01時,是Leaky ReLU。
優點:
- 不會過擬合(saturate)
- 計算簡單有效
- 比sigmoid/tanh收斂快
指數線性單元ELU
exponential linear unit, 該激活函數由Djork等人提出,被證實有較高的噪聲魯棒性,同時能夠使得使得神經元 的平均激活均值趨近為 0,同時對噪聲更具有魯棒性。由於需要計算指數,計算量較大。 ReLU family:
Leaky ReLU αα是固定的;PReLU的αα不是固定的,通過訓練得到;RReLU的αα是從一個高斯分布中隨機產生,並且在測試時為固定值,與Noisy ReLU類似(但是區間正好相反)。
ReLU系列對比:
SELU
論文: 自歸一化神經網絡(Self-Normalizing Neural Networks)中提出只需要把激活函數換成SELU就能使得輸入在經過一定層數之后變成固定的分布. 參考對這篇論文的討論.
SELU是給ELU乘上系數 λλ, 即 SELU(x)=λ⋅ELU(x)
Swish
paper Searching for Activation functions(Prajit Ramachandran,Google Brain 2017)
β是個常數或可訓練的參數.Swish 具備無上界有下界、平滑、非單調的特性。 Swish 在深層模型上的效果優於 ReLU。例如,僅僅使用 Swish 單元替換 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分類准確率提高 0.9%,Inception-ResNet-v 的分類准確率提高 0.6%。
導數:
當β = 0時,Swish變為線性函數f(x)=x2f(x)=x2. β → ∞, σ(x)=(1+exp(−x))−1σ(x)=(1+exp(−x))−1為0或1. Swish變為ReLU: f(x)=2max(0,x) 所以Swish函數可以看做是介於線性函數與ReLU函數之間的平滑函數.
工程實現: 在TensorFlow框架中只需一行代碼: x * tf.sigmoid(beta * x)
或tf.nn.swish(x)
. 在Caffe中使用Scale+Sigmoid+EltWise(PROD)
來實現或者合並成一個層.代碼參考.
Maxout
論文Maxout Networks(Goodfellow,ICML2013)
Maxout可以看做是在深度學習網絡中加入一層激活函數層,包含一個參數k.這一層相比ReLU,sigmoid等,其特殊之處在於增加了k個神經元,然后輸出激活值最大的值.
我們常見的隱含層節點輸出:
而在Maxout網絡中,其隱含層節點的輸出表達式為:
其中
以如下最簡單的多層感知器(MLP)為例:
圖片來源:slides
maxout-networks-4-1024
假設網絡第i層有2個神經元x1、x2,第i+1層的神經元個數為1個.原本只有一層參數,將ReLU或sigmoid等激活函數替換掉,引入Maxout,將變成兩層參數,參數個數增為k倍.
優點:
- Maxout的擬合能力非常強,可以擬合任意的凸函數。
- Maxout具有ReLU的所有優點,線性、不飽和性。
- 同時沒有ReLU的一些缺點。如:神經元的死亡。
缺點: 從上面的激活函數公式中可以看出,每個神經元中有兩組(w,b)參數,那么參數量就增加了一倍,這就導致了整體參數的數量激增。
Maxout激活函數
與常規激活函數不同的是,它是一個可學習的分段線性函數.
然而任何一個凸函數,都可以由線性分段函數進行逼近近似。其實我們可以把以前所學到的激活函數:ReLU、abs激活函數,看成是分成兩段的線性函數,如下示意圖所示:
maxout-convex-func-approximate!
實驗結果表明Maxout與Dropout組合使用可以發揮比較好的效果。
那么,前邊的兩種ReLU便是兩種Maxout,函數圖像為兩條直線的拼接,
sigmoid & tanh
sigmoid/logistic 激活函數:
tanh 函數是sigmoid函數的一種變體,以0點為中心。取值范圍為 [-1,1] ,而不是sigmoid函數的 [0,1] 。
tanh 是對 sigmoid 的平移和收縮: tanh(x)=2⋅σ(2x)−1tanh(x)=2⋅σ(2x)−1. 你可能會想平移使得曲線以0點為中心,那么為什么還要收縮呢? 如果不拉伸或收縮得到 f(x)=ex−1ex+1f(x)=ex−1ex+1 不行嗎? 我猜想是因為 tanh 更加著名吧。
那么 tanh 這個雙曲正切函數與三角函數 tan 之間是什么關系呢?
hard tanh 限界: g(z) = max(-1, min(1,z))
sigmoid & tanh 函數圖像如下:
sigmoid作激活函數的優缺點
歷史上很流行(Historically popular since they have nice interpretation as a saturating “firing rate” of a neuron),梯度計算較為方便:
優勢是能夠控制數值的幅度,在深層網絡中可以保持數據幅度不會出現大的變化;而ReLU不會對數據的幅度做約束.
存在三個問題:
- 飽和的神經元會"殺死"梯度,指離中心點較遠的x處的導數接近於0,停止反向傳播的學習過程.
- sigmoid的輸出不是以0為中心,而是0.5,這樣在求權重w的梯度時,梯度總是正或負的.
- 指數計算耗時
為什么tanh相比sigmoid收斂更快:
- 梯度消失問題程度
可以看出tanh(x)的梯度消失問題比sigmoid要輕.梯度如果過早消失,收斂速度較慢.
- 以零為中心的影響 如果當前參數(w0,w1)的最佳優化方向是(+d0, -d1),則根據反向傳播計算公式,我們希望 x0 和 x1 符號相反。但是如果上一級神經元采用 Sigmoid 函數作為激活函數,sigmoid不以0為中心,輸出值恆為正,那么我們無法進行最快的參數更新,而是走 Z 字形逼近最優解。4
激活函數的作用
- 加入非線性因素
- 充分組合特征
下面說明一下為什么有組合特征的作用.
一般函數都可以通過泰勒展開式來近似計算, 如sigmoid激活函數中的指數項可以通過如下的泰勒展開來近似計算:
其中有平方項,立方項及更更高項, 而 z=wx+bz=wx+b, 因此可以看作是輸入特征 x 的組合. 以前需要由領域專家知識進行特征組合,現在激活函數能起到一種類似特征組合的作用. (思想來源: 微博@算法組)
為什么ReLU,Maxout等能夠提供網絡的非線性建模能力?它們看起來是分段線性函數,然而並不滿足完整的線性要求:加法f(x+y)=f(x)+f(y)和乘法f(ax)=a×f(x)或者寫作。非線性意味着得到的輸出不可能由輸入的線性組合重新得到(重現)。假如網絡中不使用非線性激活函數,那么這個網絡可以被一個單層感知器代替得到相同的輸出,因為線性層加起來后還是線性的,可以被另一個線性函數替代。
梯度消失與梯度爆炸
梯度消失/爆炸原因及解決辦法
原因,淺層的梯度計算需要后面各層的權重及激活函數導數的乘積,因此可能出現前層比后層的學習率小(vanishing gradient)或大(exploding)的問題,所以具有不穩定性.那么如何解決呢?
需要考慮幾個方面:
- 權重初始化 使用合適的方式初始化權重, 如ReLU使用MSRA的初始化方式, tanh使用xavier初始化方式.
- 激活函數選擇 激活函數要選擇ReLU等梯度累乘穩定的.
- 學習率 一種訓練優化方式是對輸入做白化操作(包括正規化和去相關), 目的是可以選擇更大的學習率. 現代深度學習網絡中常使用Batch Normalization(包括正規化步驟,但不含去相關). (All you need is a good init. If you can't find the good init, use Batch Normalization.)
由於梯度的公式包含每層激勵的導數以及權重的乘積,因此讓中間層的乘積約等於1即可.但是sigmoid這種函數的導數值又與權重有關系(最大值1/4,兩邊對稱下降),所以含有sigmoid的神經網絡不容易解決,輸出層的activation大部分飽和,因此不建議使用sigmoid. ReLU在自變量大於0時導數為1,小於0時導數為0,因此可以解決上述問題.
梯度爆炸 由於sigmoid,ReLU等函數的梯度都在[0,1]以內,所以不會引發梯度爆炸問題。 而梯度爆炸需要采用梯度裁剪、BN、設置較小學習率等方式解決。
激活函數選擇
- 首先嘗試ReLU,速度快,但要注意訓練的狀態.
- 如果ReLU效果欠佳,嘗試Leaky ReLU或Maxout等變種。
- 嘗試tanh正切函數(以零點為中心,零點處梯度為1)
- sigmoid/tanh在RNN(LSTM、注意力機制等)結構中有所應用,作為門控或者概率值.
- 在淺層神經網絡中,如不超過4層的,可選擇使用多種激勵函數,沒有太大的影響。
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 原文: https://www.cnblogs.com/makefile/p/activation-function.html © 康行天下