ICML 2016 的文章[Noisy Activation Functions]中給出了激活函數的定義:激活函數是映射 h:R→R,且幾乎處處可導。
神經網絡中激活函數的主要作用是提供網絡的非線性建模能力,如不特別說明,激活函數一般而言是非線性函數。假設一個示例神經網絡中僅包含線性卷積和全連接運算,那么該網絡僅能夠表達線性映射,即便增加網絡的深度也依舊還是線性映射,難以有效建模實際環境中非線性分布的數據。加入(非線性)激活函數之后,深度神經網絡才具備了分層的非線性映射學習能力。
1、Sigmoid函數
Sigmoid 是使用范圍最廣的一類激活函數,具有指數函數形狀 。正式定義為:
x=-10:0.001:10; %sigmoid和它的導數 sigmoid=1./(1+exp(-x)); sigmoidDer=exp(-x)./((1+exp(-x)).^2); figure; plot(x,sigmoid,‘r‘,x,sigmoidDer,‘b--‘); axis([-10 10 -1 1]); grid on; title(‘Sigmoid函數(實線)及其導數(虛線)‘); legend(‘Sigmoid原函數‘,‘Sigmid導數‘); set(gcf,‘NumberTitle‘,‘off‘); set(gcf,‘Name‘,‘Sigmoid函數(實線)及其導數(虛線)‘);
輸出:
可見,sigmoid 在定義域內處處可導,且兩側導數逐漸趨近於0,即:
Bengio 教授等將具有這類性質的激活函數定義為軟飽和激活函數。與極限的定義類似,飽和也分為左側軟飽和與右側軟飽和:
左側軟飽和:
右側軟飽和:
與軟飽和相對的是硬飽和激活函數,即:f‘(x)=0,當 |x| > c,其中 c 為常數。
同理,硬飽和也分為左側硬飽和和右側硬飽和。常見的ReLU 就是一類左側硬飽和激活函數。
Sigmoid 的軟飽和性,使得深度神經網絡在二三十年里一直難以有效的訓練,是阻礙神經網絡發展的重要原因。具體來說,由於在后向傳遞過程中,sigmoid向下傳導的梯度包含了一個f‘(x) 因子(sigmoid關於輸入的導數),因此一旦輸入落入飽和區,f‘(x) 就會變得接近於0,導致了向底層傳遞的梯度也變得非常小。此時,網絡參數很難得到有效訓練。這種現象被稱為梯度消失。一般來說, sigmoid 網絡在 5 層之內就會產生梯度消失現象[Understanding the difficulty of training deep feedforward neural networks]。梯度消失問題至今仍然存在,但被新的優化方法有效緩解了,例如DBN中的分層預訓練,Batch Normalization的逐層歸一化,Xavier和MSRA權重初始化等代表性技術。
Sigmoid 的飽和性雖然會導致梯度消失,但也有其有利的一面。例如它在物理意義上最為接近生物神經元。(0, 1) 的輸出還可以被表示作概率,或用於輸入的歸一化,代表性的如Sigmoid交叉熵損失函數
2、tanh函數
x=-10:0.001:10; tanh=(exp(x)-exp(-x))./(exp(x)+exp(-x)); tanhDer=1-tanh.^2; figure; plot(x,tanh,‘r‘,x,tanhDer,‘b--‘); grid on; title(‘tanh函數(實線)及其導數(虛線)‘); legend(‘tanh原函數‘,‘tanh導數‘); set(gcf,‘NumberTitle‘,‘off‘); set(gcf,‘Name‘,‘tanh函數(實線)及其導數(虛線)‘);
輸出:
tanh也具有軟飽和性。[Backpropagation applied to handwritten zip code recognition]中提到tanh網絡的收斂速度要比sigmoid快。因為tanh的輸出均值比sigmoid更接近0,SGD會更接近 natural gradient[Natural gradient works efficiently in learning](一種二次優化技術),從而降低所需的迭代次數。
3、Softsign函數
x=-10:0.001:10; softsign=x./(1+abs(x)); %分段函數的表示方法如下 %y=sqrt(x).*(x>=0&x<4)+2*(x>=4&x<6)+(5-x/2).*(x>=6&x<8)+1*(x>=8); softsignDer=(1./(1+x).^2).*(x>=0)+(1./(1-x).^2).*(x<0); plot(x,softsign,‘r‘,x,softsignDer,‘b--‘); axis([-10 10 -1 1]);%加在第一個plot后面 grid on; title(‘softsign函數 x/(1+|x|)(實線)及其導數(虛線)‘); legend(‘softsign原函數‘,‘softsign導數‘); set(gcf,‘NumberTitle‘,‘off‘); set(gcf,‘Name‘,‘softsign函數 x/(1+|x|)(實線)及其導數(虛線)‘);
輸出:
4、RELU
定義為:
x=-10:0.001:10; relu=max(0,x); %分段函數的表示方法如下 %y=sqrt(x).*(x>=0&x<4)+2*(x>=4&x<6)+(5-x/2).*(x>=6&x<8)+1*(x>=8); reluDer=0.*(x<0)+1.*(x>=0); figure; plot(x,relu,‘r‘,x,reluDer,‘b--‘); title(‘Relu函數max(0,x)(實線)及其導數0,1(虛線)‘); legend(‘Relu原函數‘,‘Relu導數‘); set(gcf,‘NumberTitle‘,‘off‘); set(gcf,‘Name‘,‘Relu函數(實線)及其導數(虛線)‘);
輸出:
可見,ReLU 在x<0 時硬飽和。由於 x>0時導數為 1,所以,ReLU 能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。但隨着訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為“神經元死亡”。
ReLU還經常被“詬病”的一個問題是輸出具有偏移現象[7],即輸出均值恆大於零。偏移現象和 神經元死亡會共同影響網絡的收斂性。
還有其他一些激活函數,如下表:
http://blog.csdn.net/cyh_24/article/details/50593400
http://blog.51cto.com/qing0991/1833398