李宏毅老師的課件:
http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2018/Lecture/ForDeep.pdf
B站的課件講解:
https://www.bilibili.com/video/av9770302/?p=11
大部分內容轉載於用戶SpareNoEfforts :
https://www.jianshu.com/p/d216645251ce
真的需要認真學習相關內容的可以去上面的幾個網址,自行選擇學習。對於不太願意看很長時間的同學,我在這里用最簡短的話來闡述。
(sigmoid、tanh和maxout這里就不介紹了)
1. Relu激活函數
上述的relu是使用最多的一類激活函數了,也就是將傳進來的值限制在一個范圍。(x小於0即為0,x大於0即y=x計算)
2.Relu變形體:Leaky Relu和Parametric Relu函數
性質一樣,參考上面1。
3.轉載博主還介紹了個Randomized ReLU函數
training:的值每一次都不一樣。
testing:的值fix。
4.ELU和SELU函數
selu論文地址:https://arxiv.org/abs/1706.02515
為什么單獨貼出來呢,因為這篇作者的推導過程在論文中寫了97頁,
相信大家一下就可以看懂,elu函數也就是將小於0的部分做個處理y=(e^x-1),大於0部分沒有做任何改變。而selu函數就是在elu基礎上將大於0部分變為了y=
x,加了一個斜率,而這個斜率的值大家可以注意到是大於0的,所以input的值是會被放大的,其中推導過程省去,若是有需要可以參考課件和(https://www.jianshu.com/p/d216645251ce)其中推導內容。
5.GELU
6.SWITH
財大氣粗谷歌大腦在selu出了不久就提出了swish激活函數方法,秒殺所有激活函數。
論文地址:https://arxiv.org/abs/1710.05941
論文中貼出的計算公式為:f(x) = x · sigmoid(βx)
論文中提到的TensorFlow中也有自帶的tf.nn.swith(x),但是我發這篇文章之前找了,沒有,根本沒有。所以只能使用論文中使用的方法,x * tf.sigmoid(beta * x),當然一般beta為1,所以直接x * tf.sigmoid(x)即可。
貼出來論文中的結果:
以上結果貼給能看懂得人,不懂得沒有關系,我幫你說。
就是說swish的方法要強過其他所有的方法,感覺自己在說廢話。其中注意到使用selu和gelu的結果會比較低,甚至比relu的結果還低,這真的很谷歌大腦。
附:
本人的建議是自己去嘗試一下,各個方法的實現也不麻煩。接下來我就把基於TensorFlow的方法貼出來,以供參考:
relu函數:tf.nn.relu(features, name=None)
leakyrelu函數:tf.nn.leaky_relu(features, alpha=0.2, name=None)
sigmoid函數:tf.sigmoid( features, name=None )
elu函數:tf.nn.elu( features, name=None )
selu函數:tf.nn.selu(features, name=None) 或者
1 def selu(x): 2 with ops.name_scope('elu') as scope: 3 alpha = 1.6732632423543772848170429916717 4 scale = 1.0507009873554804934193349852946 5 return scale*tf.where(x>=0.0, x, alpha*tf.nn.elu(x))
swish函數:tf.nn.swish(x)或者input=x * tf.sigmoid(beta * x) //beta一般為1
怎么選擇激活函數呢?
(轉載於明也無涯:https://www.cnblogs.com/makefile/p/activation-function.html)
-
首先嘗試ReLU,速度快,但要注意訓練的狀態.
-
如果ReLU效果欠佳,嘗試Leaky ReLU或Maxout等變種。
-
嘗試tanh正切函數(以零點為中心,零點處梯度為1)
-
sigmoid/tanh在RNN(LSTM、注意力機制等)結構中有所應用,作為門控或者概率值.
-
在淺層神經網絡中,如不超過4層的,可選擇使用多種激勵函數,沒有太大的影響。
只有在實踐中才可以找到最適合自己的激活函數。