人工神經網路之啟用函式 -tanh函式
tanh(x)=e2x−1e2x+1tanh′(x)=1−tanh(x)2
證明
神經網路啟用函式及導數
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交叉熵損失函式
程式碼:
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](一種二次優化技術),從而降低所需的迭代次數。