神經網絡中使用激活函數來加入非線性因素,提高模型的表達能力。
ReLU(Rectified Linear Unit,修正線性單元)
形式如下:
ReLU公式近似推導::
下面解釋上述公式中的softplus,Noisy ReLU.
softplus函數與ReLU函數接近,但比較平滑, 同ReLU一樣是單邊抑制,有寬廣的接受域(0,+inf), 但是由於指數運算,對數運算計算量大的原因,而不太被人使用.並且從一些人的使用經驗來看(Glorot et al.(2011a)),效果也並不比ReLU好.
softplus的導數恰好是sigmoid函數.softplus 函數圖像:
Noisy ReLU[1]
ReLU可以被擴展以包括高斯噪聲(Gaussian noise):
\(f(x)=\max(0,x+Y), Y\sim N(0,\sigma(x))\)
Noisy ReLU 在受限玻爾茲曼機解決計算機視覺任務中得到應用.
ReLU上界設置: ReLU相比sigmoid和tanh的一個缺點是沒有對上界設限.在實際使用中,可以設置一個上限,如ReLU6經驗函數: \(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<0\)時,\(f(x)=\alpha x\),其中\(\alpha\)非常小,這樣可以避免在\(x<0\)時,不能夠學習的情況:
稱為Parametric Rectifier(PReLU),將 \(\alpha\) 作為可學習的參數.
當 \(\alpha\) 從高斯分布中隨機產生時稱為Random Rectifier(RReLU)。
當固定為\(\alpha=0.01\)時,是Leaky ReLU。
優點:
- 不會過擬合(saturate)
- 計算簡單有效
- 比sigmoid/tanh收斂快
指數線性單元ELU
exponential linear unit, 該激活函數由Djork等人提出,被證實有較高的噪聲魯棒性,同時能夠使得使得神經元
的平均激活均值趨近為 0,同時對噪聲更具有魯棒性。由於需要計算指數,計算量較大。
ReLU family:
Leaky ReLU \(\alpha\)是固定的;PReLU的\(\alpha\)不是固定的,通過訓練得到;RReLU的\(\alpha\)是從一個高斯分布中隨機產生,並且在測試時為固定值,與Noisy ReLU類似(但是區間正好相反)。
ReLU系列對比:
SELU
論文: 自歸一化神經網絡(Self-Normalizing Neural Networks)中提出只需要把激活函數換成SELU就能使得輸入在經過一定層數之后變成固定的分布. 參考對這篇論文的討論.
SELU是給ELU乘上系數 \(\lambda\), 即 \(\rm{SELU}(x)=\lambda\cdot \rm{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) ={x\over 2}\).
β → ∞, $ σ(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)
來實現或者合並成一個層. 代碼參考.
GELU
GELU(高斯誤差線性單元)是一個非初等函數形式的激活函數,是RELU的變種。由16年論文 Gaussian Error Linear Units (GELUs) 提出,隨后被GPT-2、BERT、RoBERTa、ALBERT 等NLP模型所采用。論文中不僅提出了GELU的精確形式,還給出了兩個初等函數的近似形式。函數曲線如下:
RELU及其變種與Dropout從兩個獨立的方面來決定網絡的輸出,有沒有什么比較中庸溫和的方法把兩者合二為一呢?在網絡正則化方面,Dropout將神經單元輸出隨機置0(乘0),Zoneout將RNN的單元隨機跳過(乘1)。兩者均是將輸出乘上了服從伯努利分布(二項分布)的變量m ~ Bernoulli(p),其中p是指定的確定的參數,表示取1的概率。論文中希望p能夠隨着輸入x的不同而不同,在x較小時以較大概率將其置0。 由於神經元的輸入通常服從正態分布,尤其是在加入了Batch Normalization的網絡中,因此令p等於正態分布的累積分布函數即可滿足。正態分布的概率密度函數:\(f(x)={\frac {1}{\sigma {\sqrt {2\pi }}}}\;e^{-{\frac {\left(x-\mu \right)^{2}}{2\sigma ^{2}}}}\),累積分布函數:\(F(x) = \frac{1}{\sigma\sqrt{2\pi}} \int_{-\infty}^x \exp \left( -\frac{(t - \mu)^2}{2\sigma^2} \ \right)\, dt\). 正態分布的累積分布函數曲線與sigmoid曲線相似。
假設輸入服從標准正態分布:\(X\sim \mathcal N(0,1)\),標准正態分布的累積分布函數習慣上記為\(\Phi\),\(\Phi(x)=P(X\le x)\).
然而激活函數由於在訓練和測試時使用方式完全相同,所以是需要有確定性的輸出,這點與Dropout不同(Dropout在測試時並不隨機置0)。由於概率分布的數學期望是確定值,因此改為求輸出的期望:\(E[mx]=xE[m]=x\Phi(x)\),即對輸入乘上伯努利分布的期望值\(p=\Phi(x)\)
其中的變換包含這個等式: \({1\over n}\int_0^x f(t/n)dt=\int_0^{x/n}f(t)dt\),將x看作一個固定值,則不難理解。
在數學中,誤差函數(也稱之為高斯誤差函數)定義如下:
erf(x) 與 tanh(x) 比較接近,與 \(2\left(\sigma(x)-\frac{1}{2}\right)\) 也有相似的曲線,但是相對差別較大一些。在代碼實現中可以用近似函數來擬合erf(x)。論文給出的兩個近似如下:
不過很多框架已經有精確的erf計算函數了,可以直接使用,參考代碼如下:
# GPT-2 的 GELU 實現
def gelu(x):
return 0.5*x*(1+tf.tanh(np.sqrt(2/np.pi)*(x+0.044715*tf.pow(x, 3))))
# BERT 的 GELU 實現
def gelu(input_tensor):
cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))
return input_tesnsor*cdf
GELU vs Swish
GELU 與 Swish 激活函數(x · σ(βx))的函數形式和性質非常相像,一個是固定系數 1.702,另一個是可變系數 β(可以是可訓練的參數,也可以是通過搜索來確定的常數),兩者的實際應用表現也相差不大。
參考:
Maxout
論文Maxout Networks(Goodfellow,ICML2013)
Maxout可以看做是在深度學習網絡中加入一層激活函數層,包含一個參數k.這一層相比ReLU,sigmoid等,其特殊之處在於增加了k個神經元,然后輸出激活值最大的值.
我們常見的隱含層節點輸出:
而在Maxout網絡中,其隱含層節點的輸出表達式為:
其中\(z_{ij}=x^TW_{…ij}+b_{ij}, W\in R^{d\times m\times k}\)
以如下最簡單的多層感知器(MLP)為例:
圖片來源:slides
假設網絡第i層有2個神經元x1、x2,第i+1層的神經元個數為1個.原本只有一層參數,將ReLU或sigmoid等激活函數替換掉,引入Maxout,將變成兩層參數,參數個數增為k倍.
優點:
- Maxout的擬合能力非常強,可以擬合任意的凸函數。
- Maxout具有ReLU的所有優點,線性、不飽和性。
- 同時沒有ReLU的一些缺點。如:神經元的死亡。
缺點:
從上面的激活函數公式中可以看出,每個神經元中有兩組(w,b)參數,那么參數量就增加了一倍,這就導致了整體參數的數量激增。
Maxout激活函數
與常規激活函數不同的是,它是一個可學習的分段線性函數.
然而任何一個凸函數,都可以由線性分段函數進行逼近近似。其實我們可以把以前所學到的激活函數:ReLU、abs激活函數,看成是分成兩段的線性函數,如下示意圖所示:
實驗結果表明Maxout與Dropout組合使用可以發揮比較好的效果。
那么,前邊的兩種ReLU便是兩種Maxout,函數圖像為兩條直線的拼接,\(f(x)=\max(w_1^Tx+b_1,w_2^Tx+b_2)\).
sigmoid & tanh
sigmoid/logistic 激活函數:
tanh 函數是sigmoid函數的一種變體,以0點為中心。取值范圍為 [-1,1] ,而不是sigmoid函數的 [0,1] 。
tanh 是對 sigmoid 的平移和收縮: \(\tanh \left( x \right) = 2 \cdot \sigma \left( 2 x \right) - 1\).
你可能會想平移使得曲線以0點為中心,那么為什么還要收縮呢? 如果不拉伸或收縮得到 \(f(x)={e^x-1\over e^x+1}\) 不行嗎? 我猜想是因為 tanh 更加著名吧。
那么 tanh 這個雙曲正切函數與三角函數 tan 之間是什么關系呢?
在數學中,雙曲函數是一類與常見的三角函數(也叫圓函數)類似的函數。最基本的雙曲函數是雙曲正弦函數 sinh 和雙曲余弦函數 cosh ,從它們可以導出雙曲正切函數 tanh 等,其推導也類似於三角函數的推導。[2]
根據歐拉公式: \(e^{ix} = \cos x + i\cdot\sin x\) (其中i是虛數\(\sqrt{-1}\)) 有[3],
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 ) = 1-\tanh( x )^2 \in (0,1)\)
\(\text{sigmoid: } s'(x)=s(x)\times(1-s(x))\in(0,1/4)\)
可以看出tanh(x)的梯度消失問題比sigmoid要輕.梯度如果過早消失,收斂速度較慢. - 以零為中心的影響
如果當前參數(w0,w1)的最佳優化方向是(+d0, -d1),則根據反向傳播計算公式,我們希望 x0 和 x1 符號相反。但是如果上一級神經元采用 Sigmoid 函數作為激活函數,sigmoid不以0為中心,輸出值恆為正,那么我們無法進行最快的參數更新,而是走 Z 字形逼近最優解。[4]
激活函數的作用
- 加入非線性因素
- 充分組合特征
下面說明一下為什么有組合特征的作用.
一般函數都可以通過泰勒展開式來近似計算, 如sigmoid激活函數中的指數項可以通過如下的泰勒展開來近似計算:
其中有平方項,立方項及更更高項, 而 \(z=wx+b\), 因此可以看作是輸入特征 x 的組合. 以前需要由領域專家知識進行特征組合,現在激活函數能起到一種類似特征組合的作用. (思想來源: 微博@算法組)
為什么ReLU,Maxout等能夠提供網絡的非線性建模能力?它們看起來是分段線性函數,然而並不滿足完整的線性要求:加法f(x+y)=f(x)+f(y)和乘法f(ax)=a×f(x)或者寫作\(f(\alpha x_1+\beta x_2)=\alpha f(x_1)+\beta f(x_2)\)。非線性意味着得到的輸出不可能由輸入的線性組合重新得到(重現)。假如網絡中不使用非線性激活函數,那么這個網絡可以被一個單層感知器代替得到相同的輸出,因為線性層加起來后還是線性的,可以被另一個線性函數替代。
梯度消失與梯度爆炸
梯度消失/爆炸原因及解決辦法
原因,淺層的梯度計算需要后面各層的權重及激活函數導數的乘積,因此可能出現前層比后層的學習率小(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層的,可選擇使用多種激勵函數,沒有太大的影響。