天天看點

吳恩達深度學習 —— 3.6 激活函數

要搭建一個神經網絡,可以選擇的是選擇隐層裡用哪一個激活函數,還有神經網絡的輸出單元用什麼激活函數。

到目前為止,我們一直用的是sigmoid激活函數,但有時候其它函數效果要好得多,我們看看一些可供選擇的函數。

吳恩達深度學習 —— 3.6 激活函數

在神經網絡的正向傳播步驟中,有兩步用了sigmoid函數,就是 a = 1 1 + e − z a = \frac{1}{1+e^{-z}} a=1+e−z1​。在更一般的情況下,我們可以使用不同的函數 g ( z ) g(z) g(z)而不僅僅是 σ ( z ) \sigma(z) σ(z),可以是其它非線性函數。

吳恩達深度學習 —— 3.6 激活函數

比如說 σ \sigma σ函數介于0和1之間,有個激活函數幾乎總比 σ \sigma σ函數表現更好,就是 t a n h tanh tanh函數,或者叫雙曲正切函數,函數值介于-1和1之間,其函數公式表示為 a = t a n h ( z ) = e z − e ( − z ) e z + e ( − z ) a=tanh(z)=\frac{e^{z}-e^{(-z)}}{e^{z}+e^{(-z)}} a=tanh(z)=ez+e(−z)ez−e(−z)​,在數學上這實際上是 σ \sigma σ函數平移後的版本,讓 σ \sigma σ平移經過零點然後函數值在-1到1之間,。

事實證明,對于隐藏單元,如果讓函數 g ( z ) = t a n h ( z ) g(z)=tanh(z) g(z)=tanh(z),這幾乎總比 σ \sigma σ函數效果要好,因為現在函數輸出介于-1和1之間,激活函數的平均值更接近0。你可能需要平移所有的資料,讓資料的平均值為0。使用 T a n h Tanh Tanh而不是 σ \sigma σ函數也有類似于資料中心化的效果,使得資料的平均值接近0,而不是0.5,這實際上讓下一層的學習更友善一點。 t a n h tanh tanh函數幾乎在所有場合都更優越,一個例外是輸出層,因為如果y是0或者1,那麼你希望 y ^ \hat{y} y^​介于0到1之間更合理,而不是-1到1。會用 σ \sigma σ激活函數的一個例外場合是使用二分分類時,在這種情況下,可以用 σ \sigma σ激活函數作為輸出層。

不同層的激活函數可以不同,有時候為了表示不同層的不同激活函數,可能會用方括号上标來表示激活函數 g [ 1 ] g^{[1]} g[1]和激活函數 g [ 2 ] g^{[2]} g[2]的不同。

現在 σ \sigma σ函數和 t a n h tanh tanh函數都有一個缺點,如果z非常大或非常小,那麼導數的梯度或者說這個函數的斜率可能就很小,這樣會拖慢梯度下降算法。

吳恩達深度學習 —— 3.6 激活函數

機器學習中最有歡迎的一個玩具是所謂的修正線性單元(ReLU), R e L U = m a x ( 0 , z ) ReLU=max(0,z) ReLU=max(0,z),隻要z為正,導數就是1,當z為負時,斜率為0。當使用這個函數時,當z剛好為0時,導數是沒有定義的。但如果你程式設計實作時,得到的z剛好等于一個很小很小的非常接近0的值。在實踐中不用擔心這點,可以在z=0時,給導數指派,可以指派為1或者0都是可以的。

在選擇激活函數時有一些經驗法則,如果輸出值是0和1,如果在做二進制分類, s i g m o i d sigmoid sigmoid函數很适合作為輸出層的激活函數,然後其它所有單元都用 R e L U ReLU ReLU激活函數。如果你不确定隐藏層應該用哪個,那就用ReLU作為激活函數。

吳恩達深度學習 —— 3.6 激活函數

而ReLU的一個缺點是當z為負時導數等于零,在實踐中這沒什麼問題。ReLU還有另外一個版本,叫帶洩漏的ReLU,激活函數為 l e a k y   R e L U = m a x ( 0.01 z , z ) leaky\space ReLU=max(0.01z,z) leaky ReLU=max(0.01z,z)。當z為負時,導數不再為0,它有一個很平緩的斜率在,這通常比ReLU激活函數更好,不過在實際中使用的頻率沒有那麼高。你可能會問,為什麼這個激活函數的常數是0.01呢?你也可以把它設成學習函數的另一個參數,根據自己的需要進行調整。

ReLU和帶洩漏的ReLU的好處在于,對于很多z空間,激活函數的導數,激活函數的斜率和0差很遠,是以在實踐中使用ReLU激活函數,神經網絡的學習速度通常會快很多,比 t a n h tanh tanh和 s i g m o i d sigmoid sigmoid函數都快得多,主要原因在于ReLU函數沒有這種函數接近0進而減緩梯度下降的情況。對于z的一半範圍來說,ReLU的斜率為零,但在實踐中,有足夠多的隐藏單元,令z大于0,是以對于大多數訓練樣本來說還是很快的。

快速回顧一下,各種激活函數的利弊。

對于 s i g m o i d sigmoid sigmoid函數,除非用在二進制分類的輸出層,不然絕對不要用,原因在于 t a n h tanh tanh幾乎在所有的場合都更優越。還有最常用的預設激活函數是ReLU,如果你不确定要用哪個,就用這個ReLU函數;或者你想用的話,也可以嘗試帶洩漏的ReLU激活函數。

深度學習其中一個特點是,在建立神經網絡時經常有很多不同的選擇,比如隐藏單元數,激活函數,還有如何初始化權重等。有時候很難定下一個準則确定什麼參數最适合你的問題。是以可以嘗試在交叉驗證集上跑跑,看看哪個參數效果更好,就用哪個。

繼續閱讀