點擊上方「MLNLP」,選擇「星標」公眾號
重磅乾貨,第一時間送達
編輯:憶臻
https://www.zhihu.com/question/63795427
本文僅作為學術交流分享,如果侵權,會刪文處理
筆者在知乎上發現了一個叫「神經網絡中激活函數的真正意義?一個激活函數需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?」的問題,很有意思,下面與大家分享一些大佬們的見解,希望對你的研究有幫助。
知乎高質量回答
作者:Hengkai Guo
https://www.zhihu.com/question/67366051/answer/262087707
補充一篇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.
作者:龍鵬-言有三
https://www.zhihu.com/question/67366051/answer/604308154
也來答一波,分幾個方向:參考龍鵬:【AI初識境】激活函數:從人工設計到自動搜索
總的來說,激活函數經歷了從人工設計到自動探索的長足發展歷程。
01 無處不在的激活函數我們都知道人工神經網絡是用於模擬神經元的,那麼提起激活函數,自然是要從那裡去挖掘原因。
在正說深度學習中的激活函數之前,我想說其實激活函數無處不在,從中閒話一下激活函數的意義。
(1) 上班需要激活函數。早上10點上班,你8點到也好,9點到也好都一樣,但是10點零1分到不行,性質就變了,考勤系統留下遲到的記錄,全勤獎再無希望。
它的激活函數應該是這樣的,x是打卡時間。
這是一個階躍函數,類似於如下:
(2) 最近看上了一個跳槽過來的喜歡吃甜品的女同事,不過聽說有男朋友,不過又聽說好像正在慢慢鬧分手。
那麼如果要追這個女同事,什麼時候送甜品能帶來友情的升華?假如預判她和對象第t天后拜拜。
它的激活函數可能是這樣的,x是送甜品的日子。
在剛分手的時候(也就是第t天,對應曲線斜率最大的地方)送甜品帶來的好感激增度是最高的,再往後雖然隨著相互之間越來越熟友誼持續升溫,但是增長率下降了啊。而且到後來可能被其他人追走了,這個函數還只在一定期限內有效。
(3) 最近項目要加班,不過好在加班費是按小時(可以有分數)算的,那麼當天的工資,就應該是這樣算的。它的激活函數可能是這樣的,x是工作時長。
形狀長這樣,超過一個閾值後是線性增加的,低於閾值則是常量。
(4) 不是單身狗?OK你是有老婆的人,那麼下班回家陪老婆看電視總需要吧。不過到底陪不陪看,是不是陪就一定能得到老婆大人喜歡,這個可能是個周期性質的東西。
假如x是當天日曆,那麼激活函數可能是這樣。
這麼想想,是不是感覺激活函數無處不在,上面的這幾種都是有正兒八經對應的激活函數的,以上是閒話,下面是分割線。
┉┉ ∞ ∞ ┉┉┉┉ ∞ ∞ ┉┉┉┉┉ ∞ ∞ ┉┉┉┉ ∞ ∞ ┉┉┉┉┉ ∞ ∞ ┉┉┉┉ ∞ ∞ ┉┉┉
迴轉正題,之所以需要激活函數,從生物學上來說,是因為人腦的細胞接受刺激從而產生活動,首先需要一定的閾值,沒有達到閾值,幾乎沒用。而不同的刺激產生的輸出也是不同的,達到一定值後就飽和了,再加大也沒用。
作為模擬人腦的人工神經網絡,自然是需要某種機制來模擬這一種活動,這便是激活函數根本性的由來。
02 激活函數到底有什麼用一個複雜的神經網絡,是有許多層的,其中最基本的單位便是神經元。
一個線性神經元,輸入x輸出y的變換關係如下。
可以看到輸出y與x是一個線性關係。如果再增加一層,把y作為中間層,輸出為z呢?
如下:
可以看出,最終的輸出z仍然與x是線性關係,也就是說這樣堆疊下去,永遠都是線性關係。
人們期望神經網絡可以模擬任意的函數,怎麼可能用一個線性函數來完成呢?所以才會在線性神經元的輸出後添加非線性的函數,添加的越多,變換自然就越複雜了。
而不同的非線性映射函數的選擇,就是激活函數的研究課題了。
03 各種激活函數https://en.wikipedia.org/wiki/Activation_function
關於激活函數的種類,大家可以去wiki 百科上面看,或者參考[3],非常的詳細,下面摘錄其中的一些。
這些人工設計的激活函數有這麼多,那麼什麼激活函數最好,是ReLU嗎?還是各類ReLU的變種(LReLU,PReLU,RReLU,ELU,SELU,GELU等等),Maxout,又或者是某大神自己在搞的很複雜的激活函數,這是沒有標準答案的,只能說有一些通用的大家認可的結論,下面也只能覆蓋到一些。
(1) sigmoid和tanh激活函數。
為什麼最早的時候大家用sigmoid函數呢?因為它不管輸入處於多大的範圍,輸出是處於0~1的,機器學習裡要解決的問題很多都是概率,用sigmoid不是很自然嗎?
所以很早期的比較淺的神經網絡,用sigmoid沒毛病,現在在LSTM這一類需要計算開關概率的網絡中,sigmoid仍然是很常見的。
不過sigmoid函數的確是有個非常大的缺陷:
函數的兩端是飽和區,飽和區內梯度接近於0。一旦神經元的初始或者優化進入了飽和區域,將難以繼續優化。另一方面,隨著網絡層數的增加,由於鏈式法則連乘的sigmoid導數也會變得越來越小,導致梯度難以回傳,這會降低網絡的收斂速度,甚至導致網絡不能收斂到好的狀態。
那tanh函數又如何呢?它相比sigmoid來說,將輸出映射到(-1,1)之間了,拓展了一倍的值域。
激活有負值之後,網絡的表達能力可以得到提升,但未必一定需要這麼做的,因為權重本身是可以為負的,而在最早期的神經網絡中,用模擬信號處理問題,甚至連權重都沒有非負的,一樣有效。不過一般來說tanh總不至於比sigmoid差的,它畢竟通過零點,輸出期望不會漂移。
(2)ReLU激活函數。
ReLU激活函數的提出是有許多背景的,包括腦神經元的激活模型的研究,稀疏特徵理論等。
2001年,神經科學家Dayan和Abott在著作《Theoretical neuroscience》中模擬出了腦神經元接受信號的激活模型,畫個圖是這樣的,參考ReLU的文章」Deep Sparse Rectifier Neural Networks「。
可以看它的特點:正區間平滑的增加,而負區間沒有激活的,為平坦區域。
同年Attwell等人在研究大腦能量消耗的時候,發現神經元編碼工作方式具有稀疏性和分布性。兩年後也就是2003年Lennie等人估測大腦同時被激活的神經元只有1~4%,進一步證實了神經元工作的稀疏性。這說明神經元同時只會對輸入信號的少部分選擇性響應,Sigmoid系函數同時有一半的神經元被激活,這不符合要求啊,因此我們需要新的稀疏性質的激活函數。
另一方面,如果特徵是稀疏的,那就有更大的線性可分的可能性,高維的稀疏特徵空間上會被映射到一個更加簡單的低維流形面上,比如PCA降維。這樣一來,一個密集的特徵因為稀疏映射之後大大降低了學習難度。
在神經網絡中也是如此這就非常有利於學習了。
同一年Softplus/Rectifier激活函數就被提出了,與腦神經元的激活模型異曲同工,因此兩者的結合促進了激活函數的研究。
雖然softplus更早的提出,但是它沒有稀疏激活性,可以看作是一個平滑版本的ReLU,不過實驗結果結果表明還不如ReLU。
Xavier Glorot等人在論文《Deep Sparse Rectifier Neural Networks》中正式提出了使用線性整流單元作為激活函數比sigmoid,tanh激活ReLU函數更好,表達式也很簡單:f(x)=max(0,x)
ReLU函數本質是一個取最大值函數,非全區間可導,但是在計算過程中可以取近似梯度,在x>0時,梯度為1,小於等於0時,梯度為0。為了限制激活的邊界,對激活值使用L1規整化,它帶來的稀疏的激活值也使得神經網絡的激活方式更加像大腦了。
ReLU的使用使得訓練不再依賴於無監督的預訓練方法,沒做預訓練情況下,ReLu激活網絡遙遙領先其它激活函數,這對於訓練更深的模型非常的重要,當然它也可以受益於無監督的預訓練,前提是後者有足夠多的數據提供好的初始化。
ReLU在正區間內解決了梯度消失問題,只需要判斷輸入是否大於0,所以計算速度非常快,收斂速度遠快於sigmoid和tanh函數。但ReLU函數的輸出同樣不是零均值的。並且存在Dead ReLU Problem,即某些神經元可能永遠不會參與計算,導致其相應的參數無法被更新。有兩個主要原因可能導致這種情況產生;參數初始化以及學習速率太高導致在訓練過程中參數更新太大,使網絡進入這種狀態。解決方法之一是採用Xavier初始化方法,Xavier初始化不就是自己提出來的嗎,機智的一比 。
總之使用ReLU好處是很明顯的。簡單,這個簡單不僅在於導數恆定,更在於它將低於一定閾值的信號丟棄了。深度學習要解決的是工程問題,工程問題很多時候都是稀疏性的,往往簡單的解決方案是最有效和穩定的。
不過ReLU輸出沒有負數的問題確實有一定負作用,這也是其他方法對ReLU的改進空間所在。
(3)ReLU的一大堆變種(LReLU,PReLU,RReLU,ELU,SELU,GELU等等)。
我相信這些變種是有用的,但是我沒怎麼用過。不用因為是首先它們還沒有表現出一定比ReLU強,在如今有BN等技術以及好的初始化方法後,ReLU的缺點沒有那麼明顯了。另一方面是,沒時間去一個一個試,解決問題的過程中還有很多其他因素更加需要去探索。不過,還是建議大家去仔細了解一下的,用不用的著再說。
正因如此,在對ReLU改進的差不多之後,激活函數的人工設計就沒有這麼多熱情了。
04 自動搜索不過坑還沒有填完,還是有人沒有忘記這個問題的,比如谷歌。谷歌開了許多深度學習領域的自動化的工作,比如自動設計網絡NASNet,自動數據增強AutoAugment等工作,也做了自動搜索最優的激活函數的工作。
文[1]就在一系列一元函數和二元函數組成的搜索空間中,進行了比較細緻的組合搜索實驗。
結論是好用的激活函數都比較簡單,不會超過兩個基本函數的乘的組合。搜到了一些比Relu表現更好的函數,最好的是一個這樣的函數:x · σ(βx),被稱為Swish,它在某個特定的參數下也和ReLU及其變種類似,看看圖就知道了。
順便說一下該方法做實驗時的一元函數和二元函數的搜索空間:
已經覆蓋我們能想到的一些簡單的函數了。
類似地也有其他的研究人員通過遺傳算法學習到一些新的激活函數,包括EliSH,HardEliSH[2],感興趣的可以去看論文。
這個坑就挖給你了,還可以填。
[1] Ramachandran P, Zoph B, Le Q V. Searching for activation functions[J]. arXiv preprint arXiv:1710.05941, 2017.
[2] Basirat M , Roth P M . The Quest for the Golden Activation Function[J]. 2018.
[3] Nwankpa C , Ijomah W , Gachagan A , et al. Activation Functions: Comparison of trends in Practice and Research for Deep Learning[J]. 2018.
作者:吳洋
https://www.zhihu.com/question/67366051/answer/262201973
首先,從網絡的表示能力來看,沒有激活函數會使網絡只能表示線性模型,能力有限,所以要使網絡具有較強的表示能力需要激活函數為非線性。
其次,對於前向計算來說,我們需要計算激活函數的值,還有一些函數求導後也是關於本身函數值的函數,所以計算簡單也很重要。
再者,反向傳播過程中,前面的參數更新的梯度一般是導數的乘積,其中也包含著激活函數的導數,如果是thanh或sigmod等導數值與函數值相關的函數,導數乘積中還會有激活函數值,所以我們對激活函數的值域與激活函數的導數的值域也希望滿足一定要求,如不能過大,會導致梯度爆炸。不能過小,會導致梯度彌散。均值為一方差為零,基於這一點。
最後,我看有的文章提到激活函數的部分激活性,如relu,負值輸入不激活,會讓網絡學習到稀疏的特徵,從而具有更好的魯棒性,對於這一點我不是很了解,懂得朋友可以在評論區指教。
作者:「已註銷」
https://www.zhihu.com/question/67366051/answer/252200770
確實是為了非線性。我們或許不能說任何非線性函數都能用來做激活函數,但是可以用來做激活函數的函數的確不止現在常用的這麼幾個,也就是relu及其變種,tanh,sigmoid...。
引述Ian Goodfellow在Deep Learning一書中的說法,deep learning 6.3.3節的第一段。很多沒有被發表的激活函數的性能也十分不錯,比如用cos做激活函數也能在minist數據集上跑出低於1%的錯誤率。因為這樣的函數很多,所以一個個介紹實在沒什麼意思,因此學術界一般只關注那些性能有明顯突破的函數,很多函數是可用的,但是由於性能沒有突破,因此就泯然眾人矣了。
至於什麼是好的函數。。。私以為能做出好結果的就是好函數呀。
推薦閱讀:
【重磅推薦】百度資深AI工程師帶你深度學習彎道超車!
從Word2Vec到Bert,聊聊詞向量的前世今生(一)
清華姚班出身,95後博士生陳立傑獲理論計算機頂會最佳學生論文