神經網路中激活函數的真正意義?一個激活函數需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?

對於這個問題,很多人的回答是實現非線性。但是我感覺這是結果,而不是原因。從最原始理論里激活函數是階躍函數,激活函數就是模擬神經元的激活狀態和非激活狀態。後來實際中因為需要優化,需要求導,才採用sigmoid這些變種的激活函數。如果僅僅是為了實現非線性,那任何的非線性函數都可以作為激活函數?實現非線性的手段有非常多,但這顯然不是這樣的。那麼我的問題是什麼樣的激活函數才是好的激活函數呢?激活函數的真正意義是什麼?一個激活函數需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?


補充一篇Google Brain[10] 的觀點。這篇文章里基於RL對激活函數進行了搜索,包括很多一元函數和二元函數的組合:

最終發現了一些表現最好的激活函數:

在搜索過程中,他們發現表現比較好的激活函數都比較簡單(由兩個以內的單元組成)且由原始輸入x組合成(即b(x, g(x)))。同時,它們都是光滑的(與ReLU不同),而且有些並不是單調的(比如表現最好的Swish函數)。

對應於原回答中的特性,其中的1、2、3、4、7(從圖中可以看出,大部分函數都具有線性區)、8都被這篇文章的實驗所驗證,比較有爭議的就是單調性。

----------------------------原回答的分割線----------------------------------

說說我對一個好的激活函數的理解吧,有些地方可能不太嚴謹,歡迎討論。(部分參考了Activation function。)

1. 非線性:即導數不是常數。這個條件前面很多答主都提到了,是多層神經網路的基礎,保證多層網路不退化成單層線性網路。這也是激活函數的意義所在。

2. 幾乎處處可微:可微性保證了在優化中梯度的可計算性。傳統的激活函數如sigmoid等滿足處處可微。對於分段線性函數比如ReLU,只滿足幾乎處處可微(即僅在有限個點處不可微)。對於SGD演算法來說,由於幾乎不可能收斂到梯度接近零的位置,有限的不可微點對於優化結果不會有很大影響[1]。

3. 計算簡單:正如題主所說,非線性函數有很多。極端的說,一個多層神經網路也可以作為一個非線性函數,類似於Network In Network[2]中把它當做卷積操作的做法。但激活函數在神經網路前向的計算次數與神經元的個數成正比,因此簡單的非線性函數自然更適合用作激活函數。這也是ReLU之流比其它使用Exp等操作的激活函數更受歡迎的其中一個原因。

4. 非飽和性(saturation):飽和指的是在某些區間梯度接近於零(即梯度消失),使得參數無法繼續更新的問題。最經典的例子是Sigmoid,它的導數在x為比較大的正值和比較小的負值時都會接近於0。更極端的例子是階躍函數,由於它在幾乎所有位置的梯度都為0,因此處處飽和,無法作為激活函數。ReLU在x&>0時導數恆為1,因此對於再大的正值也不會飽和。但同時對於x&<0,其梯度恆為0,這時候它也會出現飽和的現象(在這種情況下通常稱為dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是為了解決這一問題。

5. 單調性(monotonic):即導數符號不變。這個性質大部分激活函數都有,除了諸如sin、cos等。個人理解,單調性使得在激活函數處的梯度方向不會經常改變,從而讓訓練更容易收斂。

6. 輸出範圍有限:有限的輸出範圍使得網路對於一些比較大的輸入也會比較穩定,這也是為什麼早期的激活函數都以此類函數為主,如Sigmoid、TanH。但這導致了前面提到的梯度消失問題,而且強行讓每一層的輸出限制到固定範圍會限制其表達能力。因此現在這類函數僅用於某些需要特定輸出範圍的場合,比如概率輸出(此時loss函數中的log操作能夠抵消其梯度消失的影響[1])、LSTM里的gate函數。

7. 接近恆等變換(identity):即約等於x。這樣的好處是使得輸出的幅值不會隨著深度的增加而發生顯著的增加,從而使網路更為穩定,同時梯度也能夠更容易地回傳。這個與非線性是有點矛盾的,因此激活函數基本只是部分滿足這個條件,比如TanH只在原點附近有線性區(在原點為0且在原點的導數為1),而ReLU只在x&>0時為線性。這個性質也讓初始化參數範圍的推導更為簡單[5][4]。額外提一句,這種恆等變換的性質也被其他一些網路結構設計所借鑒,比如CNN中的ResNet[6]和RNN中的LSTM。

8. 參數少:大部分激活函數都是沒有參數的。像PReLU帶單個參數會略微增加網路的大小。還有一個例外是Maxout[7],儘管本身沒有參數,但在同樣輸出通道數下k路Maxout需要的輸入通道數是其它函數的k倍,這意味著神經元數目也需要變為k倍;但如果不考慮維持輸出通道數的情況下,該激活函數又能將參數個數減少為原來的k倍。

9. 歸一化(normalization):這個是最近才出來的概念,對應的激活函數是SELU[8],主要思想是使樣本分布自動歸一化到零均值、單位方差的分布,從而穩定訓練。在這之前,這種歸一化的思想也被用於網路結構的設計,比如Batch Normalization[9]。

參考文獻:

[1] Goodfellow I, Bengio Y, Courville A. Deep learning[M]. MIT press, 2016.

[2] Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013.

[3] Maas A L, Hannun A Y, Ng A Y. Rectifier nonlinearities improve neural network acoustic models[C]//Proc. ICML. 2013, 30(1).

[4] He K, Zhang X, Ren S, et al. Delving

deep into rectifiers: Surpassing human-level performance on imagenet

classification[C]//Proceedings of the IEEE international conference on

computer vision. 2015: 1026-1034.

[5] Glorot X, Bengio Y. Understanding the

difficulty of training deep feedforward neural networks[C]//Proceedings

of the Thirteenth International Conference on Artificial Intelligence

and Statistics. 2010: 249-256.

[6] He K, Zhang X, Ren S, et al. Deep

residual learning for image recognition[C]//Proceedings of the IEEE

conference on computer vision and pattern recognition. 2016: 770-778.

[7] Goodfellow I J, Warde-Farley D, Mirza M, et al. Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013.

[8] Klambauer G, Unterthiner T, Mayr A, et al. Self-Normalizing Neural Networks[J]. arXiv preprint arXiv:1706.02515, 2017.

[9] Ioffe S, Szegedy C. Batch

normalization: Accelerating deep network training by reducing internal

covariate shift[C]//International Conference on Machine Learning. 2015:

448-456.

[10] Ramachandran P, Zoph B, Le Q V. Swish: a Self-Gated Activation Function[J]. arXiv preprint arXiv:1710.05941, 2017.


機器學習的神經網路雖然受到了生物學啟發,但並不是照搬生物。

我認為只要連續,有平緩的和陡峭些的部分就行。

哪怕是sin都可能有用。


@Hengkai Guo 說的非常詳細了。我試著對這個問題再進行一下回答。

首先,從網路的表示能力來看,沒有激活函數會使網路只能表示線性模型,能力有限,所以要使網路具有較強的表示能力需要激活函數為非線性。

其次,對於前向計算來說,我們需要計算激活函數的值,還有一些函數求導後也是關於本身函數值的函數,所以計算簡單也很重要。

再者,反向傳播過程中,前面的參數更新的梯度一般是導數的乘積,其中也包含著激活函數的導數,如果是thanh或sigmod等導數值與函數值相關的函數,導數乘積中還會有激活函數值,所以我們對激活函數的值域與激活函數的導數的值域也希望滿足一定要求,如不能過大,會導致梯度爆炸。不能過小,會導致梯度彌散。均值為一方差為零,基於這一點。

最後,我看有的文章提到激活函數的部分激活性,如relu,負值輸入不激活,會讓網路學習到稀疏的特徵,從而具有更好的魯棒性,對於這一點我不是很了解,懂得朋友可以在評論區指教。


確實是為了非線性。我們或許不能說任何非線性函數都能用來做激活函數,但是可以用來做激活函數的函數的確不止現在常用的這麼幾個,也就是relu及其變種,tanh,sigmoid...。

引述Ian Goodfellow在Deep Learning一書中的說法,deep learning 6.3.3節的第一段。很多沒有被發表的激活函數的性能也十分不錯,比如用cos做激活函數也能在minist數據集上跑出低於1%的錯誤率。因為這樣的函數很多,所以一個個介紹實在沒什麼意思,因此學術界一般只關注那些性能有明顯突破的函數,很多函數是可用的,但是由於性能沒有突破,因此就泯然眾人矣了。

至於什麼是好的函數。。。私以為能做出好結果的就是好函數呀。


確實是為了添加非線性,如果不加入非線性激活函數,深度神經網路的深度就會失去意義。把權重累乘完就和單隱層的網路一樣了。


實現非線性的手段的確非常多,但效果不一樣。

很多人回答「非線性」,可能跟題主想問的不一樣。題主可能更偏重問「什麼樣的激活函數是好的激活函數」,我覺得Hengkai Guo的答案說的已經比較詳細了。

如果沒有激活函數的話,也一樣可微,計算最簡單了,也一樣滿足單調、恆等變換、不會梯度消失。所以其實激活函數的存在與否,主要的區別的確是非線性,其它的方面主要用於評價不同的激活函數的。

Tensorflow — Neural Network Playground

這上面可以對tanh、relu、sigmoid這幾個常用的激活函數模擬,或許可以直觀一些的理解不同激活函數的效果。


神經網路的強大的擬合能力以及「只要隱層神經元足夠多就可以逼近任意函數」,這都是因為激活函數的非線性。

如果你問激活函數的意義是什麼,那只有唯一的一個意義「讓神經網路具備強大的擬合能力」。

如果沒有激活函數,即使再深的網路,它和單個神經元的作用是一樣的。

只要激活函數有一丁點非線性,神經網路都夠擬合任意函數,因為只要足夠多的非線性函數進行疊加就能逼近任意函數。

激活函數的其它性質都是為了更好的訓練,但沒有這些性質並不影響神經網路的擬合能力


確實是實現去線性化。模擬神經元的激活我覺得只是從生物學角度解釋

而去線性化是數學角度的解釋

答主@雲采月 在評論區關於 為什麼要去線性化 的解釋特別好!!!!

_φ( ̄ー ̄ )

是因為如果不做去線性化的話,神經元就只是在做線性變換。考慮到線性相關性,神經網路就不能得出非線性決策線,那麼神經網路和邏輯回歸也就沒太大區別了。

正因為如此我們需要去線性化

去線性化確實有很多手段,激活函數只是實現方式簡單且普遍的一種

手機碼字排版勿怪_(:з」∠)_


從神經生物學的角度看,我們知道action potential的產生有個不應期,就是refractory period. 在此期間,無論給多大的刺激神經細胞的膜電位都不會再次去極化。還有一個稱為相對不應期relative refractory period,就是你需要比通常更大的刺激才可以激活膜電位去極化。

那麼這個和激活函數有什麼關係呢?激活函數不就是一個step function嗎?就是分段函數。那麼神經細胞的膜電位也是一個分段函數。輸入是時間和刺激強度,輸出是膜電位,也是類似於一個階段函數。

雖然主流學術界認為深度學習和人大腦處理信息的方式不一樣,但是在激活函數上頗有幾分相似性。很多答案也提到了要引入非線性,因為只有線性的MLP無法模擬有些函數比如指數函數或者log。

不過即便是有了非線性函數,好像DNN也無法實現很多數學運算?


最原始的前饋神經網路,只有運算作用,沒有記憶功能,徒有其形,對神經元沒啥特殊要求,能按一定參數找茬,將輸入信號序列分類就行,最多,能用非線性將信號的某些特徵扭曲,放大差異便於分類,就足夠。

遞歸神經網路,特別RNN需要兼具運算和(短期)記憶功能,對神經元就有了新要求,不但要能找茬分類,要有足夠多次迭代非線性扭曲放大差異的能力,還得不失穩振蕩有網路暫存能力,即多層反饋網路對信號要漸進收斂(所謂尋優、梯度趨零),能滿足這些要求的神經元不多。


我認為激活函數(activation function)的主要作用就是來實現非線性,以多隱層神經網路為例,如果不引入激活函數,那麼每一層的輸出都是線性函數的線性組合。而真實世界更多的是非線性函數,引入激活函數為神經網路模擬非線性函數提供了前提。所以我認為引入激活函數應該是原因(目的),而結果是神經網路可以模擬非線性函數。

這是我對你說的「原因和結果」的看法,平時我最喜歡用ReLU作激活函數,關於其他方面更詳細的解答我覺得高票答案很不錯


目的是添加非線性元素,否則再複雜的網路都是扯淡,激活函數是非線性函數,但是並不是所有的非線性函數都可以作為激活函數,這裡簡單提幾點,目前的神經網路優化方法是基於梯度的,故激活函數需要可微,同時最好是單調,保證優化的損失函數為凸,以及激活函數的輸出範圍都是有要求的,你可以想想為什麼要用relu替代sigmoid,為什麼會有梯度爆炸和梯度消失,明白這些,自然而然這個問題你就會明白。


如果沒有激活函數,那運算結果到底如何分類?一個連續的結果很難告訴人們答案。所以需要激活函數增加非線性,任何單調可導的函數都可以作為激活函數。


推薦閱讀:

在眾多的神經網路框架如chainer, caffe, torch,mxnet等之間如何做選擇?
你在訓練RNN的時候有哪些特殊的trick?
有沒有可能運用人工神經網路將一種編程語言的代碼翻譯成任意的另一種編程語言,而不經過人工設計的編譯過程?
怎麼選取訓練神經網路時的Batch size?
模式識別、機器學習、神經網路、(泛函分析?)的學習順序

TAG:人工智慧 | 數學 | 機器學習 | 神經網路 | 深度學習DeepLearning |