神經網絡的激活函數

轉載自:http://blog.csdn.net/cyh_24/article/details/50593400

本博客僅爲作者記錄筆記之用,不免有很多細節不對之處。

還望各位看官能夠見諒,歡迎批評指正。

更多相關博客請猛戳:http://blog.csdn.net/cyh_24

如需轉載,請附上本文鏈接:http://blog.csdn.net/cyh_24/article/details/50593400

日常 coding 中,我們會很自然的使用一些激活函數,比如:simoid,tanh,ReLu,softplus。不過好像忘了問自己一(n)件事:

  1. 爲什麼需要激活函數?
  2. 激活函數都有哪些?都長什麼樣?有哪些優缺點?
  3. 怎麼選用激活函數?

本文正是基於這些問題展開的,歡迎批評指正!

此處輸入圖片的描述
(此圖並沒有什麼卵用,純屬爲了裝x …)

Why use activation functions?

激活函數通常有如下一些性質:

  • 非線性: 當激活函數是非線性的時候,一個兩層的神經網絡就可以逼近基本上所有的函數了。但是,如果沒有激活函數,就相當於激活函數是恆等的時候(即f(x)=x),就不滿足這個性質了,無論你神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了。正因爲上面的原因,我們決定引入非線性函數作爲激勵函數,這樣深層神經網絡就有意義了(不再是輸入的線性組合,可以逼近任意函數)。
  • 可微性: 當優化方法是基於梯度的時候,這個性質是必須的。
  • 單調性: 當激活函數是單調的時候,單層網絡能夠保證是凸函數。
  • f(x)x: 當激活函數滿足這個性質的時候,如果參數的初始化是random的很小的值,那麼神經網絡的訓練將會很高效;如果不滿足這個性質,那麼就需要很用心的去設置初始值。
  • 輸出值的範圍: 當激活函數輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因爲特徵的表示受有限權值的影響更顯著;當激活函數的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate.

這些性質,也正是我們使用激活函數的原因!激活函數是用來加入非線性因素的,因爲線性模型的表達力不夠。通俗講激活函數就是爲了增加神經網絡模型的非線性。否則你想想,沒有激活函數的每層都相當於矩陣相乘。就算你疊加了若干層之後,無非還是個矩陣相乘罷了。所以你沒有非線性結構的話,根本就算不上什麼神經網絡。同時還要保證可微性,因爲神經網絡的數學基礎就是處處可微的,所以選取的激活函數要能保證數據輸入與輸出也是可微的。

Activation Functions.

Sigmoid

此處輸入圖片的描述

Sigmoid 是常用的非線性的激活函數,它的數學形式如下:

f(x)=11+ex

正如前一節提到的,它能夠把輸入的連續實值“壓縮”到0和1之間。
特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1.
sigmoid 函數曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因爲它的一些 缺點

  • Sigmoids saturate and kill gradients. (saturate 這個詞怎麼翻譯?飽和?)sigmoid 有一個非常致命的缺點,當輸入非常大或者非常小的時候(saturation),這些神經元的梯度是接近於0的,從圖中可以看出梯度的趨勢。所以,你需要尤其注意參數的初始值來儘量避免saturation的情況。如果你的初始值很大的話,大部分神經元可能都會處在saturation的狀態而把gradient kill掉,這會導致網絡變的很難學習。
  • Sigmoid 的 output 不是0均值. 這是不可取的,因爲這會導致後一層的神經元將得到上一層輸出的非0均值的信號作爲輸入。
    產生的一個結果就是:如果數據進入神經元的時候是正的(e.g. x>0 計算出的梯度也會始終都是正的。
    當然了,如果你是按batch去訓練,那麼那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的 kill gradients 問題相比還是要好很多的。

tanh

tanh 是上圖中的右圖,可以看出,tanh 跟sigmoid還是很像的,實際上,tanh 是sigmoid的變形:

tanh(x)=2sigmoid(2x)1

與 sigmoid 不同的是,tanh 是0均值的。因此,實際應用中,tanh 會比 sigmoid 更好(畢竟去粗取精了嘛)。

此處輸入圖片的描述

ReLU

近年來,ReLU 變的越來越受歡迎。它的數學表達式如下:

f(x)=max(0,x)

很顯然,從圖左可以看出,輸入信號<0 是二維的情況下,使用ReLU之後的效果如下:

此處輸入圖片的描述

ReLU 的優點:

  • Krizhevsky et al. 發現使用 ReLU 得到的SGD(隨機梯度下降法)的收斂速度會比 sigmoid/tanh 快很多(看右圖)。有人說這是因爲它是linear,而且 non-saturating
  • 相比於 sigmoid/tanh,ReLU 只需要一個閾值就可以得到激活值,而不用去算一大堆複雜的運算。
  • sigmoid激活函數容易產生梯度消失(有很多層時,每一層梯度值小於1,不斷連乘會趨於0)或梯度爆炸(有很多層時,每一層梯度值大於1,不斷連乘會趨於無窮大),這些現象都會導致訓練曲線無法收斂,而ReLU 不會出現這些現象。

ReLU 的缺點: 當然 ReLU 也有缺點,就是訓練的時候很”脆弱”,很容易就”die”了. 什麼意思呢?

舉個例子:一個非常大的梯度流過一個 ReLU 神經元,更新過參數之後,這個神經元再也不會對任何數據有激活現象了。

如果這個情況發生了,那麼這個神經元的梯度就永遠都會是0.

實際操作中,如果你的learning rate 很大,那麼很有可能你網絡中的40%的神經元都”dead”了。
當然,如果你設置了一個合適的較小的learning rate,這個問題發生的情況其實也不會太頻繁。

Leaky-ReLU、P-ReLU、R-ReLU

Leaky ReLUs: 就是用來解決這個 “dying ReLU” 的問題的。與 ReLU 不同的是:

f(x)=αx(x<0)

f(x)=x(x>=0)

這裏的 α 是一個很小的常數。這樣,即修正了數據分佈,又保留了一些負軸的值,使得負軸信息不會全部丟失。

此處輸入圖片的描述

關於Leaky ReLU 的效果,衆說紛紜,沒有清晰的定論。有些人做了實驗發現 Leaky ReLU 表現的很好;有些實驗則證明並不是這樣。

此處輸入圖片的描述

Parametric ReLU: 對於 Leaky ReLU 中的α,通常都是通過先驗知識人工賦值的。
然而可以觀察到,損失函數對α的導數我們是可以求得的,可不可以將它作爲一個參數進行訓練呢?
Kaiming He的論文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不僅可以訓練,而且效果更好。

公式非常簡單,反向傳播至未激活前的神經元的公式就不寫了,很容易就能得到。對α的導數如下:

δyiδα=0(ifyi>0)else=yi

原文說使用了Parametric ReLU後,最終效果比不用提高了1.03%.

Randomized ReLU:
Randomized Leaky ReLU是 leaky ReLU 的random 版本 (α 是random的).
它首次試在 kaggle 的NDSB 比賽中被提出的。

核心思想就是,在訓練過程中,α 中 隨機出來的,然後再測試過程中進行修正(有點像dropout的用法)。

數學表示如下:

此處輸入圖片的描述

在測試階段,把訓練過程中所有的 αij 中隨機出來的。那麼,在測試階段,激活函數就是就是:

yij=xijl+u2

看看 cifar-100 中的實驗結果:

此處輸入圖片的描述

Maxout

此處輸入圖片的描述

Maxout出現在ICML2013上,作者Goodfellow將maxout和dropout結合後,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數據上都取得了start-of-art的識別率。
Maxout 公式如下:

fi(x)=maxj[1,k]zij

假設 w 是2維,那麼有:

f(x)=max(wT1x+b1,wT2x+b2)

可以注意到,ReLU 和 Leaky ReLU 都是它的一個變形(比如,w1,b1=0 的時候,就是 ReLU).

Maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。作者從數學的角度上也證明了這個結論,即只需2個maxout節點就可以擬合任意的凸函數了(相減),前提是”隱隱含層”節點的個數可以任意多.

此處輸入圖片的描述

所以,Maxout 具有 ReLU 的優點(如:計算簡單,不會 saturation),同時又沒有 ReLU 的一些缺點 (如:容易 go die)。不過呢,還是有一些缺點的嘛:就是把參數double了。

還有其他一些激活函數,請看下錶:

此處輸入圖片的描述
此處輸入圖片的描述

How to choose a activation function?

怎麼選擇激活函數呢?

我覺得這種問題不可能有定論的吧,只能說是個人建議。

如果你使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓你的網絡出現很多 “dead” 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.

友情提醒:最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.

還有,通常來說,很少會把各種激活函數串起來在一個網絡中使用的。

Reference

[1]. http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-10.html
[2]. http://papers.nips.cc/paper/874-how-to-choose-an-activation-function.pdf
[3]. https://en.wikipedia.org/wiki/Activation_function
[4]. http://cs231n.github.io/neural-networks-1/

發佈了38 篇原創文章 · 獲贊 202 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章