神經網絡的激活函數及梯度消失


   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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM