激活函數是人工神經網絡的一個極其重要的特征。它決定一個神經元是否應該被激活,激活代表神經元接收的信息與給定的信息有關。
激活函數對輸入信息進行非線性變換。 然后將變換后的輸出信息作為輸入信息傳給下一層神經元。
激活函數的作用
當我們不用激活函數時,權重和偏差只會進行線性變換。線性方程很簡單,但解決復雜問題的能力有限。沒有激活函數的神經網絡實質上只是一個線性回歸模型。激活函數對輸入進行非線性變換,使其能夠學習和執行更復雜的任務。我們希望我們的神經網絡能夠處理復雜任務,如語言翻譯和圖像分類等。線性變換永遠無法執行這樣的任務。
激活函數使反向傳播成為可能,因為激活函數的誤差梯度可以用來調整權重和偏差。如果沒有可微的非線性函數,這就不可能實現。
總之,激活函數的作用是能夠給神經網絡加入一些非線性因素,使得神經網絡可以更好地解決較為復雜的問題。
在最新版本的TensorFlow 1.4.0(https://www.tensorflow.org/)中包含的激活函數:sigmoid,softmax,relu,elu,selu,softplus,softsign,tanh,hard_sigmoid,linear,serialize,deserialize等,具體介紹如下:
Sigmoid函數如下:作用是計算 x 的 sigmoid 函數。具體計算公式為 y=1/(1+exp(−x)),將值映射到[0.0 , 1.0]區間
當輸入值較大時,sigmoid將返回一個接近於1.0的值,而當輸入值較小時,返回值將接近於0.0.
優點:在於對在真實輸出位於[0.0,1.0]的樣本上訓練的神經網絡,sigmoid函數可將輸出保持在[0.0,1.0]內的能力非常有用.
缺點:在於當輸出接近於飽和或者劇烈變化是,對輸出返回的這種縮減會帶來一些不利影響.
當輸入為0時,sigmoid函數的輸出為0.5,即sigmoid函數值域的中間點
函數圖像如下所示:
softmax函數:也是一種sigmoid函數,但它在處理分類問題時很方便。sigmoid函數只能處理兩個類。當我們想要處理多個類時,該怎么辦呢?只對單類進行“是”或“不是”的分類方式將不會有任何幫助。softmax函數將壓縮每個類在0到1之間,並除以輸出總和。它實際上可以表示某個類的輸入概率。
比如,我們輸入[1.2,0.9,0.75],當應用softmax函數時,得到[0.42,0.31,0.27]。現在可以用這些值來表示每個類的概率。
softmax函數最好在分類器的輸出層使用。
其定義為:
tanh函數如下:將值映射到[-1,1]區間
tanh與sigmoid非常接近,且與后者具有類似的優缺點, sigmoid和tanh的主要區別在於tanh的值為[-1.0,1.0]
優點在於在一些特定的網絡架構中,能夠輸出負值的能力十分有用.
缺點在於注意tanh值域的中間點為0.0,當網絡中的下一層期待輸入為負值或者為0.0時,這將引發一系列問題.
Relu(Rectified Linear Units修正線性單元)函數如下:relu函數是目前用的最多也是最受歡迎的激活函數。
relu在x<0時是硬飽和。由於當x>0時一階導數為1。所以,relu函數在x>0時可以保持梯度不衰減,從而緩解梯度消失問題,還可以更快的去收斂。但是,隨着訓練的進行,部分輸入會落到硬飽和區,導致對應的權重無法更新。我們稱之為“神經元死亡”。
公式和函數圖像如下
elu函數:是relu激活函數的改進版本,解決部分輸入會落到硬飽和區,導致對應的權重無法更新的問題。計算激活函數relu,即max(features, 0),所有負數都會歸一化為0,所以的正值保留為原值不變
優點:在於不受”梯度消失”的影響,且取值范圍在[0,+oo)
缺點:在於使用了較大的學習速率時,易受達到飽和的神經元的影響
公式和圖像如下:左邊縮小方差,右邊保持方差;方差整體還是縮小的,而均值得不到保障。
selu函數:
左邊縮小方差,右邊放大方差,適當選取參數alpha和lambda,使得整體上保持方差與期望。如果選取:
lambda=1.0506,alpha=1.67326,那么可以驗證如果輸入的x是服從標准正態分布,那么SELU(x)的期望為0,方差為1.
softplus函數:可以看作是relu函數的平滑版本,公式和函數圖像如下:
線性函數linear
我們看到了step函數的問題,梯度為零,在反向傳播過程中不可能更新權重和偏差。此時,我們可以用線性函數來代替簡單的step函數。函數表達式:
f(x)=ax+b,
如何選擇激活函數?
激活函數好或壞,不能憑感覺定論。然而,根據問題的性質,我們可以為神經網絡更快更方便地收斂作出更好的選擇。
用於分類器時,Sigmoid函數及其組合通常效果更好。
由於梯度消失問題,有時要避免使用sigmoid和tanh函數。
ReLU函數是一個通用的激活函數,目前在大多數情況下使用。
如果神經網絡中出現死神經元,那么PReLU函數就是最好的選擇。
請記住,ReLU函數只能在隱藏層中使用。
一點經驗:你可以從ReLU函數開始,如果ReLU函數沒有提供最優結果,再嘗試其他激活函數。
梯度知識補充
在微積分里面,對多元函數的參數求∂偏導數,把求得的各個參數的偏導數以向量的形式寫出來,就是梯度。比如函數f(x,y), 分別對x,y求偏導數,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,簡稱grad f(x,y)或者▽f(x,y)。對於在點(x0,y0)的具體梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3個參數的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此類推。
那么這個梯度向量求出來有什么意義呢?它的意義從幾何意義上講,就是函數變化增加最快的地方。具體來說,對於函數f(x,y),在點(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者說,沿着梯度向量的方向,更加容易找到函數的最大值。反過來說,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度減少最快,也就是更加容易找到函數的最小值。
在機器學習算法中,在最小化損失函數時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數,和模型參數值。反過來,如果我們需要求解損失函數的最大值,這時就需要用梯度上升法來迭代了。
梯度下降法和梯度上升法是可以互相轉化的。比如我們需要求解損失函數f(θ)的最小值,這時我們需要用梯度下降法來迭代求解。但是實際上,我們可以反過來求解損失函數 -f(θ)的最大值,這時梯度上升法就派上用場了。
關於更多梯度下降,梯度上升的信息,參考https://www.cnblogs.com/pinard/p/5970503.html