Logistic函數或Logistic曲線是一種常見的S形函數,它是皮埃爾·弗朗索瓦·韋呂勒在1844或1845年在研究它與人口增長的關系時命名的。廣義Logistic曲線可以模仿一些情況人口增長(P)的S形曲線。起初階段大致是指數增長;然后隨着開始變得飽和,增加變慢;最后,達到成熟時增加停止。
Sigmoid函數,即f(x)=1/(1+e-x)。神經元的非線性作用函數。(-x是冪數)
sigmoid函數是一個良好的閾值函數, 連續,光滑 嚴格單調 關於(0,0.5)中心對稱 對閾值函數 _ 1, x > \delta f(x)= / \ - 0, x < -\delta 的良好近似 其導數f'(x)=f(x)*[1-f(x)],可以節約計算時間 f(x) = 1/[1+e^(-x)].圖形如上。 如果x = a*r.其中a為傾斜系數,當a足夠小,這個圖形可以無限制接近你這個閾值函數
首先我們看下sigmoid和relu的曲線;
結論就是sigmoid的導數只有在0附近的時候有比較好的激活性,在正負飽和區的梯度都接近於0,所以這會造成梯度彌散,而relu函數在大於0的部分梯度為常數,所以不會產生梯度彌散現象。第二,relu函數在負半區的導數為0 ,所以一旦神經元激活值進入負半區,那么梯度就會為0,也就是說這個神經元不會經歷訓練,即所謂的稀疏性。第三,relu函數的導數計算更快,程序實現就是一個if-else語句,而sigmoid函數要進行浮點四則運算。綜上,relu是一個非常優秀的激活函數。。。
人工神經網絡的學習算法-BP算法
神經網絡的學習是基於一組樣本進行的,它包括輸入和輸出(這里用期望輸出表示),輸入和輸出有多少個分量就有多少個輸入和輸出神經元與之對應。最初神經網絡的權值(Weight)和閾值(Threshold)是任意給定的,學習就是逐漸調整權值和閾值使得網絡的實際輸出和期望輸出一致。
我們假設樣本有P個,輸入層有N個神經元,隱含層有K個神經元,輸出層有M個神經元。Xj為輸入層神經元j的輸入,Hj為隱含層神經元j的輸出,Fj為輸出層神經元j的實際輸出,Rj為輸出層神經元j的期望輸出,前一層的輸出即為后一層的輸入。Whji是輸入層神經元i與隱含層神經元j之間的連接權值,Thj是隱含神經元j的閾值,Woji是隱含層神經元i與輸出層神經元j之間的連接權值,Toj是輸出神經元j的閾值。神經元的非線性作用函數是Sigmoid函數,即f(x)=1/(1+e-x)。

深度學習中的激活函數導引
激活函數的定義與作用
在人工神經網絡中,神經元節點的激活函數定義了對神經元輸出的映射,簡單來說,神經元的輸出(例如,全連接網絡中就是輸入向量與權重向量的內積再加上偏置項)經過激活函數處理后再作為輸出。加拿大蒙特利爾大學的Bengio教授在 ICML 2016 的文章[1]中給出了激活函數的定義:激活函數是映射 h:R→R,且幾乎處處可導。
神經網絡中激活函數的主要作用是提供網絡的非線性建模能力,如不特別說明,激活函數一般而言是非線性函數。假設一個示例神經網絡中僅包含線性卷積和全連接運算,那么該網絡僅能夠表達線性映射,即便增加網絡的深度也依舊還是線性映射,難以有效建模實際環境中非線性分布的數據。加入(非線性)激活函數之后,深度神經網絡才具備了分層的非線性映射學習能力。因此,激活函數是深度神經網絡中不可或缺的部分。
激活函數的歷史發展與近期進展
從定義來看,幾乎所有的連續可導函數都可以用作激活函數。但目前常見的多是分段線性和具有指數形狀的非線性函數。下文將依次對它們進行總結。
Sigmoid
Sigmoid 是使用范圍最廣的一類激活函數,具有指數函數形狀 。正式定義為:
可見,sigmoid 在定義域內處處可導,且兩側導數逐漸趨近於0,即:
Bengio 教授等[1]將具有這類性質的激活函數定義為軟飽和激活函數。與極限的定義類似,飽和也分為左飽和與右飽和:
左飽和:
右飽和:
與軟飽和相對的是硬飽和激活函數,即:f'(x)=0,當 |x| > c,其中 c 為常數。
同理,硬飽和也分為左飽和和右飽和。常見的 ReLU 就是一類左側硬飽和激活函數。
Sigmoid 的軟飽和性,使得深度神經網絡在二三十年里一直難以有效的訓練,是阻礙神經網絡發展的重要原因。具體來說,由於在后向傳遞過程中,sigmoid向下傳導的梯度包含了一個f'(x) 因子(sigmoid關於輸入的導數),因此一旦輸入落入飽和區,f'(x) 就會變得接近於0,導致了向底層傳遞的梯度也變得非常小。此時,網絡參數很難得到有效訓練。這種現象被稱為梯度消失。一般來說, sigmoid 網絡在 5 層之內就會產生梯度消失現象[2]。梯度消失問題至今仍然存在,但被新的優化方法有效緩解了,例如DBN中的分層預訓練,Batch Normalization的逐層歸一化,Xavier和MSRA權重初始化等代表性技術。
Sigmoid 的飽和性雖然會導致梯度消失,但也有其有利的一面。例如它在物理意義上最為接近生物神經元。 (0, 1) 的輸出還可以被表示作概率,或用於輸入的歸一化,代表性的如Sigmoid交叉熵損失函數
tanh
可見,tanh(x)=2sigmoid(2x)-1,也具有軟飽和性。Xavier在文獻[2]中分析了sigmoid與tanh的飽和現象及特點,具體見原論文。此外,文獻 [3] 中提到tanh 網絡的收斂速度要比sigmoid快。因為 tanh 的輸出均值比 sigmoid 更接近 0,SGD會更接近 natural gradient[4](一種二次優化技術),從而降低所需的迭代次數。
ReLU
雖然2006年Hinton教授提出通過分層無監督預訓練解決深層網絡訓練困難的問題,但是深度網絡的直接監督式訓練的最終突破,最主要的原因是采用了新型激活函數ReLU[5, 6]。與傳統的sigmoid激活函數相比,ReLU能夠有效緩解梯度消失問題,從而直接以監督的方式訓練深度神經網絡,無需依賴無監督的逐層預訓練,這也是2012年深度卷積神經網絡在ILSVRC競賽中取得里程碑式突破的重要原因之一。
ReLU的 正式定義為:
可見,ReLU 在x<0 時硬飽和。由於 x>0時導數為 1,所以,ReLU 能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。但隨着訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為“神經元死亡”。
ReLU還經常被“詬病”的一個問題是輸出具有偏移現象[7],即輸出均值恆大於零。偏移現象和 神經元死亡會共同影響網絡的收斂性。本文作者公開在arxiv的文章[8]中的實驗表明,如果不采用Batch Normalization,即使用 MSRA 初始化30層以上的ReLU網絡,最終也難以收斂。相對的,PReLU和ELU網絡都能順利收斂,這兩種改進的激活函數將在后面介紹。實驗所用代碼見GitHub - Coldmooon/Code-for-MPELU: Code for Improving Deep Neural Network with Multiple Parametric Exponential Linear Units 。
ReLU另外一個性質是提供神經網絡的稀疏表達能力,在Bengio教授的Deep Sparse Rectifier Neural Network[6]一文中被認為是ReLU帶來網絡性能提升的原因之一。但后來的研究發現稀疏性並非性能提升的必要條件,文獻 RReLU [9]也指明了這一點。
PReLU[10]、ELU[7]等激活函數不具備這種稀疏性,但都能夠提升網絡性能。本文作者在文章[8]中給出了一些實驗比較結果。首先,在cifar10上采用NIN網絡,實驗結果為 PReLU > ELU > ReLU,稀疏性並沒有帶來性能提升。其次,在 ImageNet上采用類似於[11] 中model E的15 層網絡,實驗結果則是ReLU最好。為了驗證是否是稀疏性的影響,以 LReLU [12]為例進一步做了四次實驗,負半軸的斜率分別為1,0.5,0.25, 0.1,需要特別說明的是,當負半軸斜率為1時,LReLU退化為線性函數,因此性能損失最大。實驗結果展現了斜率大小與網絡性能的一致性。綜合上述實驗可知,ReLU的稀疏性與網絡性能之間並不存在絕對正負比關系。
PReLU
PReLU [10]是ReLU 和 LReLU的改進版本,具有非飽和性:
與LReLU相比,PReLU中的負半軸斜率a可學習而非固定。原文獻建議初始化a為0.25,不采用正則。個人認為,是否采用正則應當視具體的數據庫和網絡,通常情況下使用正則能夠帶來性能提升。
雖然PReLU 引入了額外的參數,但基本不需要擔心過擬合。例如,在上述cifar10+NIN實驗中, PReLU比ReLU和ELU多引入了參數,但也展現了更優秀的性能。所以實驗中若發現網絡性能不好,建議從其他角度尋找原因。
與ReLU相比,PReLU收斂速度更快。因為PReLU的輸出更接近0均值,使得SGD更接近natural gradient。證明過程參見原文[10]。
此外,作者在ResNet 中采用ReLU,而沒有采用新的PReLU。這里給出個人淺見,不一定正確,僅供參考。首先,在上述LReLU實驗中,負半軸斜率對性能的影響表現出一致性。對PReLU采用正則將激活值推向0也能夠帶來性能提升。這或許表明,小尺度或稀疏激活值對深度網絡的影響更大。其次,ResNet中包含單位變換和殘差兩個分支。殘差分支用於學習對單位變換的擾動。如果單位變換是最優解,那么殘差分支的擾動應該越小越好。這種假設下,小尺度或稀疏激活值對深度網絡的影響更大。此時,ReLU或許是比PReLU更好的選擇。
RReLU
數學形式與PReLU類似,但RReLU[9]是一種非確定性激活函數,其參數是隨機的。這種隨機性類似於一種噪聲,能夠在一定程度上起到正則效果。作者在cifar10/100上觀察到了性能提升。
Maxout
Maxout[13]是ReLU的推廣,其發生飽和是一個零測集事件(measure zero event)。正式定義為:
Maxout網絡能夠近似任意連續函數,且當w2,b2,…,wn,bn為0時,退化為ReLU。 其實,Maxout的思想在視覺領域存在已久。例如,在HOG特征里有這么一個過程:計算三個通道的梯度強度,然后在每一個像素位置上,僅取三個通道中梯度強度最大的數值,最終形成一個通道。這其實就是Maxout的一種特例。
Maxout能夠緩解梯度消失,同時又規避了ReLU神經元死亡的缺點,但增加了參數和計算量。
ELU
ELU[7]融合了sigmoid和ReLU,具有左側軟飽性。其正式定義為:

右側線性部分使得ELU能夠緩解梯度消失,而左側軟飽能夠讓ELU對輸入變化或噪聲更魯棒。ELU的輸出均值接近於零,所以收斂速度更快。經本文作者實驗,ELU的收斂性質的確優於ReLU和PReLU。在cifar10上,ELU 網絡的loss 降低速度更快;在 ImageNet上,不加 Batch Normalization 30 層以上的 ReLU 網絡會無法收斂,PReLU網絡在MSRA的Fan-in (caffe )初始化下會發散,而 ELU 網絡在Fan-in/Fan-out下都能收斂 。實驗代碼見GitHub - Coldmooon/Code-for-MPELU: Code for Improving Deep Neural Network with Multiple Parametric Exponential Linear Units。
論文的另一個重要貢獻是分析了Bias shift 現象與激活值的關系,證明了降低Bias shift 等價於把激活值的均值推向0。
Noisy Activation Functions
engio教授在ICML 2016 提出了一種激活策略[1],可用於多種軟飽和激活函數,例如 sigmoid和 tanh。
當激活函數發生飽和時, 網絡參數還能夠在兩種動力下繼續更新:正則項梯度和噪聲梯度。引入適當的噪聲能夠擴大SGD的參數搜索范圍,從而有機會跳出飽和區。在激活函數中引入噪聲的更早工作可追溯到[5],但文獻[5]的工作並不考慮噪聲引入的時間和大小。本篇的特點在於,只在飽和區才引入噪聲,且噪聲量與飽和程度相關——原式與泰勒展開式一次項之差 δ。算法1中g表示sigmoid,用於歸一化 δ。注意,ReLU的 δ恆為0,無法直接加噪聲,所以作者把噪聲加在了輸入上。
CReLU
CReLU [14]是Wenling Shang 發表在 ICML 2016的工作,本篇同樣提出了一種激活策略:
其中,[] 表示 ReLU(其他亦可)。
作者在觀察第一層濾波器(filter)時發現,濾波器相位具有成對現象(pair-grouping phenomenon)。這一發現揭示了網絡的底層學到了一些冗余濾波器來提取輸入的正負相位信息的可能性。因此可以考慮采用適當的操作移除這些冗余濾波器。對此,作者提出了CReLU,將激活函數的輸入額外做一次取反,等價於將輸入相位旋轉180°。這種策略可以看作在網絡中加入相位的先驗。實驗在cifar10上觀察到能以更少的參數獲得性能提升。
使用CReLU時,要有意識的將濾波器數量減半,否則, 網絡參數變為2倍。
MPELU
MPELU[8]是我們組的工作,將分段線性與ELU統一到了一種形式下。在NIN+CIFAR10,本文作者發現ELU與LReLU性能一致,而與PReLU差距較大。經過分析,ELU泰勒展開的一次項就是LReLU。當在ELU前加入BN讓輸入集中在0均值附近, 則ELU與LReLU之差——泰勒展開高次項會變小,粗略估計,約55.57%的激活值誤差小於0.01。因此,受PReLU啟發,令α可學習能夠提高性能。此外,引入參數β能夠進一步控制ELU的函數形狀。正式定義為:
α 和 β可以使用正則。α, β 固定為1時,MPELU 退化為 ELU; β 固定為很小的值時,MPELU 近似為 PReLU;當α=0,MPELU 等價於 ReLU。
MPELU 的優勢在於同時具備 ReLU、PReLU和 ELU的優點。首先,MPELU具備ELU的收斂性質,能夠在無 Batch Normalization 的情況下讓幾十層網絡收斂。其次,作為一般化形式, MPELU較三者的推廣能力更強。簡言之,MPELU = max(ReLU, PReLU, ELU)。
當前對ELU網絡普遍采用的初始化方法是 MSRA。這在實際中是可行的,只是不具備理論解釋性。我們的工作利用泰勒公式和MSRA的推導過程,為ELU網絡初始化提供了理論解釋。此外,Dmytro 提出了 LSUV[15],理論上可以用於 ELU/MPELU 的初始化。但在30/52層ELU網絡上,發現 LSUV 會導致ELU網絡在幾次迭代之內發散,網絡文件見GitHub - Coldmooon/Code-for-MPELU: Code for Improving Deep Neural Network with Multiple Parametric Exponential Linear Units。
總結
深度學習的快速發展,催生了形式各異的激活函數。面對琳琅滿目的成果,如何做出選擇目前尚未有統一定論,仍需依靠實驗指導。一般來說,在分類問題上建議首先嘗試 ReLU,其次ELU,這是兩類不引入額外參數的激活函數。然后可考慮使用具備學習能力的PReLU和本文作者提出的MPELU,並使用正則化技術,例如應該考慮在網絡中增加Batch Normalization層。
本文圍繞深度卷積神經網絡結構,對十余種激活函數進行了總結,相關代碼可在作者的github主頁上下載:GitHub - Coldmooon/Code-for-MPELU: Code for Improving Deep Neural Network with Multiple Parametric Exponential Linear Units。
為什么引入激活函數?
如果不用激勵函數(其實相當於激勵函數是f(x) = x),在這種情況下你每一層輸出都是上層輸入的線性函數,很容易驗證,無論你神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了。
正因為上面的原因,我們決定引入非線性函數作為激勵函數,這樣深層神經網絡就有意義了(不再是輸入的線性組合,可以逼近任意函數)。最早的想法是sigmoid函數或者tanh函數,輸出有界,很容易充當下一層輸入(以及一些人的生物解釋balabala)。激活函數的作用是為了增加神經網絡模型的非線性。否則你想想,沒有激活函數的每層都相當於矩陣相乘。就算你疊加了若干層之后,無非還是個矩陣相乘罷了。所以你沒有非線性結構的話,根本就算不上什么神經網絡。
為什么引入Relu呢?
第一,采用sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而采用Relu激活函數,整個過程的計算量節省很多。
第二,對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失,從而無法完成深層網絡的訓練。
第三,Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關系,緩解了過擬合問題的發生(以及一些人的生物解釋balabala)。
當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者准確率上的改進,具體的大家可以找相關的paper看。
多加一句,現在主流的做法,會多做一步batch normalization,盡可能保證每一層網絡的輸入具有相同的分布[1]。而最新的paper[2],他們在加入bypass connection之后,發現改變batch normalization的位置會有更好的效果。大家有興趣可以看下。
深度學習的基本原理是基於人工神經網絡,信號從一個神經元進入,經過非線性的activation function,傳入到下一層神經元;再經過該層神經元的activate,繼續往下傳遞,如此循環往復,直到輸出層。正是由於這些非線性函數的反復疊加,才使得神經網絡有足夠的capacity來抓取復雜的pattern,在各個領域取得state-of-the-art的結果。顯而易見,activation function在深度學習中舉足輕重,也是很活躍的研究領域之一。目前來講,選擇怎樣的activation function不在於它能否模擬真正的神經元,而在於能否便於優化整個深度神經網絡。下面我們簡單聊一下各類函數的特點以及為什么現在優先推薦ReLU函數。
Sigmoid函數


Sigmoid函數是深度學習領域開始時使用頻率最高的activation function。它是便於求導的平滑函數,其導數為,這是優點。然而,Sigmoid有三大缺點:
-
容易出現gradient vanishing
-
函數輸出並不是zero-centered
-
冪運算相對來講比較耗時
Gradient Vanishing
優化神經網絡的方法是Back Propagation,即導數的后向傳遞:先計算輸出層對應的loss,然后將loss以導數的形式不斷向上一層網絡傳遞,修正相應的參數,達到降低loss的目的。 Sigmoid函數在深度網絡中常常會導致導數逐漸變為0,使得參數無法被更新,神經網絡無法被優化。原因在於兩點:(1) 在上圖中容易看出,當中較大或較小時,導數接近0,而后向傳遞的數學依據是微積分求導的鏈式法則,當前層的導數需要之前各層導數的乘積,幾個小數的相乘,結果會很接近0 (2) Sigmoid導數的最大值是0.25,這意味着導數在每一層至少會被壓縮為原來的1/4,通過兩層后被變為1/16,…,通過10層后為1/1048576。請注意這里是“至少”,導數達到最大值這種情況還是很少見的。
輸出不是zero-centered
Sigmoid函數的輸出值恆大於0,這會導致模型訓練的收斂速度變慢。舉例來講,對,如果所有均為正數或負數,那么其對的導數總是正數或負數,這會導致如下圖紅色箭頭所示的階梯式更新,這顯然並非一個好的優化路徑。深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網絡盡量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。

冪運算相對耗時
相對於前兩項,這其實並不是一個大問題,我們目前是具備相應計算能力的,但面對深度學習中龐大的計算量,最好是能省則省 :-)。之后我們會看到,在ReLU函數中,需要做的僅僅是一個thresholding,相對於冪運算來講會快很多。
tanh函數


tanh讀作Hyperbolic Tangent,如上圖所示,它解決了zero-centered的輸出問題,然而,gradient vanishing的問題和冪運算的問題仍然存在。
ReLU函數


ReLU函數其實就是一個取最大值函數,注意這並不是全區間可導的,但是我們可以取sub-gradient,如上圖所示。ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:
-
解決了gradient vanishing問題 (在正區間)
-
計算速度非常快,只需要判斷輸入是否大於0
-
收斂速度遠快於sigmoid和tanh
ReLU也有幾個需要特別注意的問題:
-
ReLU的輸出不是zero-centered
-
Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以采用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。
盡管存在這兩個問題,ReLU目前仍是最常用的activation function,在搭建人工神經網絡的時候推薦優先嘗試!
Leaky ReLU函數


人們為了解決Dead ReLU Problem,提出了將ReLU的前半段設為而非0。另外一種直觀的想法是基於參數的方法,即Parametric ReLU:,其中可由back propagation學出來。理論上來講,Leaky ReLU有ReLU的所有優點,外加不會有Dead ReLU問題,但是在實際操作當中,並沒有完全證明Leaky ReLU總是好於ReLU。
ELU (Exponential Linear Units) 函數


ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:
-
不會有Deal ReLU問題
-
輸出的均值接近0,zero-centered
它的一個小問題在於計算量稍大。類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。
小結
建議使用ReLU函數,但是要注意初始化和learning rate的設置;可以嘗試使用Leaky ReLU或ELU函數;不建議使用tanh,尤其是sigmoid函數。
