神經網路激勵函數的作用是什麼?有沒有形象的解釋?


翻譯為激活函數(activation function)會更好。

激活函數是用來加入非線性因素的,因為線性模型的表達能力不夠。

以下,同種顏色為同類數據。

某些數據是線性可分的,意思是,可以用一條直線將數據分開。比如下圖:

這時候你需要通過一定的機器學習的方法,比如感知機演算法(perceptron learning algorithm) 找到一個合適的線性方程。

但是有些數據不是線性可分的。比如如下數據:

第二組數據你就沒有辦法畫出一條直線來將數據區分開。

這時候有兩個辦法,第一個辦法,是做線性變換(linear transformation),比如講x,y變成x^2,y^2,這樣可以畫出圓形。如圖所示:

如果將坐標軸從x,y變為以x^2,y^2為標準,你會發現數據經過變換後是線性可分的了。大致示意圖如下:

另外一種方法是引入非線性函數。我們來看異或問題(xor problem)。以下是xor真值表

這個真值表不是線性可分的,所以不能使用線性模型,如圖所示

我們可以設計一種神經網路,通過激活函數來使得這組數據線性可分。
激活函數我們選擇閥值函數(threshold function),也就是大於某個值輸出1(被激活了),小於等於則輸出0(沒有激活)。這個函數是非線性函數。

神經網路示意圖如下:

其中直線上的數字為權重。圓圈中的數字為閥值。第二層,如果輸入大於1.5則輸出1,否則0;第三層,如果輸入大於0.5,則輸出1,否則0.

我們來一步步算。

第一層到第二層(閥值1.5)

第二層到第三層(閥值0.5)

可以看到第三層輸出就是我們所要的xor的答案。

經過變換後的數據是線性可分的(n維,比如本例中可以用平面),如圖所示:

總而言之,激活函數可以引入非線性因素,解決線性模型所不能解決的問題。


我覺得@lee philip的答案呢主要是在說為什麼需要用非線性函數來進行分類, 而沒有點出為什麼沒有activation function就不能非線性分類. 於是乎祭出我上次用的幾幅圖吧~~~
----------------------------------
這是一個單層的感知機, 也是我們最常用的神經網路組成單元啦. 用它可以划出一條線, 把平面分割開

那麼很容易地我們就會想用多個感知機來進行組合, 獲得更強的分類能力, 這是沒問題的啦~~~~
如圖所示,

那麼我們動筆算一算, 就可以發現, 這樣一個神經網路組合起來,輸出的時候無論如何都還是一個線性方程哎~~~~納尼, 說好的非線性分類呢~~~!!!!???

再盜用一幅經常在課堂上用的圖...然而我已經不知道出處是哪了, 好像好多老師都是直接用的, 那我就不客氣了嘿嘿嘿~~這幅圖就跟前面的圖一樣, 描述了當我們直接使用step activation function的時候所能獲得的分類器, 其實只能還是線性的, 最多不過是複雜的線性組合罷了~~~當然你可以說我們可以用無限條直線去逼近一條曲線啊......額,當然可以, 不過比起用non-linear的activation function來說就太傻了嘛....

祭出主菜. 題主問的激勵函數作用是什麼, 就在這裡了!!
我們在每一層疊加完了以後, 加一個激活函數, 如圖中的y=sigma(a). 這樣輸出的就是一個不折不扣的非線性函數!

於是就很容易拓展到多層的情況啦, 更剛剛一樣的結構, 加上non-linear activation function之後, 輸出就變成了一個複雜的, 複雜的, 超級複雜的函數....額別問我他會長成什麼樣, 沒人知道的~~~~我們只能說, 有了這樣的非線性激活函數以後, 神經網路的表達能力更加強大了~~(比起純線性組合, 那是必須得啊!)

繼續厚顏無恥地放一張跟之前那副圖並列的圖, 加上非線性激活函數之後, 我們就有可能學習到這樣的平滑分類平面. 這個比剛剛那個看起來牛逼多了有木有!

--------------------------------------
這樣表達應該能夠比較清楚地回答題主的問題了吧? 這就是為什麼我們要有非線性的激活函數!額, 基於這兩天剛交完ann的報告, 就再說點個人的想法吧. 關於activation function這個東西的選擇確實很trick, 可以說是完全依賴於做什麼application吧. 比如我在做regression的時候, 不僅嘗試了tanh, sigmoid這些常用的, 還試了一把近兩年在dl中超級火的ReLU. 結果發現ReLU做出來的準確度簡直是不忍直視啊...於是在報告里吹了一大通可能這個function不work的原因...其實自己知道那就是扯淡好么, 如果實驗結果好了, 肯定又能找到一堆其它理由去support它了.
所以這也是NN一直以來飽受詬病的大問題, 別看這兩年DL風生水起, 依然是個沒辦法好好解釋的東西, 誰也不敢保證這東西放到某個應用上就一定能成, 最後調出來的就發paper, 調不出來就換參數, 甚至換一個模型繼續試唄...
當然我也不是經驗很豐富啦, 對調參這門手藝還是繼續保持敬仰的~~~ 只是最近看到好多摩拳擦掌準備投身DL想要干一番大事業的同學, 有感而發...花點時間搞搞清楚原理可能就不會覺得這個東西那麼靠譜了, 更多的像是magic, 還不如其它的模型用著心理踏實...入行需謹慎啊......
The end...


@lee philip 寫得非常好,學習。

不過好像還是寫得比較專業了,理解起來還是有點難度,所以補充幾點可以更清晰,純粹個人理解,如果有錯請指出來,因為在下也是正在學習中。


Activation function 翻譯成激活函數,不要誤解是指這個函數去激活什麼,而是指如何把「激活的神經元的特徵」通過函數把特徵保留並映射出來,這是神經網路能解決非線性問題關鍵。

激活函數眾所周知有tanh,sigmoid,ReLU等。

tanh   雙切正切函數,取值範圍[-1,1]

sigmoid  採用S形函數,取值範圍[0,1]

ReLU 簡單而粗暴,大於0的留下,否則一律為0。


因為神經網路的數學基礎是處處可微的,所以選取的激活函數要能保證數據輸入與輸出也是可微的。


神經網路中,運算特徵是不斷進行循環計算,所以在每代循環過程中,每個神經元的值也是在不斷變化的。


這就導致了tanh特徵相差明顯時的效果會很好,在循環過程中會不斷擴大特徵效果顯示出來。

但有時候,特徵相差比較複雜或是相差不是特別大時,需要更細微的分類判斷的時候,sigmoid效果就好了。


所以sigmoid相比用得更多,但近年發現數據有一個很有意思的特徵。


也就是稀疏性,數據有很多的冗餘,而近似程度的最大保留數據特徵,可以用大多數元素為0的稀疏矩陣來實現。

而Relu,它就是取的max(0,x),因為神經網路是不斷反覆計算,實際上變成了它在嘗試不斷試探如何用一個大多數為0的矩陣來嘗試表達數據特徵,結果因為稀疏特性的存在,反而這種方法變得運算得又快效果又好了。


所以,據說,目前大多在用max(0,x)來代替sigmod函數了。


查閱資料和學習,大家對神經網路中激活函數的作用主要集中下面這個觀點:

  • 激活函數是用來加入非線性因素的,解決線性模型所不能解決的問題。

下面我分別從這個方面通過例子給出自己的理解~

@lee philip@顏沁睿倆位的回答已經非常好了,我舉的例子也是來源於他們,在這裡加入了自己的思考,更加形象通俗的講一下~

開講~

首先我們有這個需求,就是二分類問題,如我要將下面的三角形和圓形點進行正確的分類,如下圖:

利用我們單層的感知機, 用它可以划出一條線, 把平面分割開:

上圖直線是由w_{1}x_{1} + w_{2}x_{2}+b=0 得到,那麼該感知器實現預測的功能步驟如下,就是我已經訓練好了一個感知器模型,後面對於要預測的樣本點,帶入模型中,如果,那麼就說明是直線的右側,也就是正類(我們這裡是三角形),如果,那麼就說明是直線的左側,也就是負類(我們這裡是圓形),雖然這和我們的題目關係不大,但是還是提一下~

好吧,很容易能夠看出,我給出的樣本點根本不是線性可分的,一個感知器無論得到的直線怎麼動,都不可能完全正確的將三角形與圓形區分出來,那麼我們很容易想到用多個感知器來進行組合,以便獲得更大的分類問題,好的,下面我們上圖,看是否可行:

好的,我們已經得到了多感知器分類器了,那麼它的分類能力是否強大到能將非線性數據點正確分類開呢~我們來分析一下:

我們能夠得到

y=w_{2-1}(w_{1-11}x_{1}+ w_{1-21}x_{2}+b_{1-1} )+ w_{2-2}(w_{1-12}x_{1}+ w_{1-22}x_{2}+b_{1-2} )+w_{2-3}(w_{1-13}x_{1}+ w_{1-23}x_{2}+b_{1-3} ) 哎呀呀,不得了,這個式子看起來非常複雜,估計應該可以處理我上面的情況了吧,哈哈哈哈~不一定額,我們來給它變個形.上面公式合併同類項後等價於下面公式:

y=x_{1}(w_{2-1}w_{1-11}+w_{2-2}w_{1-12} +w_{2-3}w_{1-13} )+x_{2} (w_{2-1}w_{1-21}+w_{2-2}w_{1-22} +w_{2-3}w_{1-23} )+w_{2-1} b_{1-1} +w_{2-2} b_{1-2}+w_{2-3} b_{1-3}

嘖嘖,估計大家都看出了,不管它怎麼組合,最多就是線性方程的組合,最後得到的分類器本質還是一個線性方程,該處理不了的非線性問題,它還是處理不了。

就好像下圖,直線無論在平面上如果旋轉,都不可能完全正確的分開三角形和圓形點:

既然是非線性問題,總有線性方程不能正確分類的地方~

那麼拋開神經網路中神經元需不需要激活函數這點不說,如果沒有激活函數,僅僅是線性函數的組合解決的問題太有限了,碰到非線性問題就束手無策了.那麼加入激活函數是否可能能夠解決呢?

在上麵線性方程的組合過程中,我們其實類似在做三條直線的組合,如下圖:

下面我們來講一下激活函數,我們都知道,每一層疊加完了之後,我們需要加入一個激活函數(激活函數的種類也很多,如sigmoid等等~)這裡就給出sigmoid例子,如下圖:

通過這個激活函數映射之後,輸出很明顯就是一個非線性函數!能不能解決一開始的非線性分類問題不清楚,但是至少說明有可能啊,上面不加入激活函數神經網路壓根就不可能解決這個問題~

同理,擴展到多個神經元組合的情況時候,表達能力就會更強~對應的組合圖如下:(現在已經升級為三個非線性感知器在組合了)

跟上麵線性組合相對應的非線性組合如下:

這看起來厲害多了,是不是~最後再通過最優化損失函數的做法,我們能夠學習到不斷學習靠近能夠正確分類三角形和圓形點的曲線,到底會學到什麼曲線,不知道到底具體的樣子,也許是下面這個~

那麼隨著不斷訓練優化,我們也就能夠解決非線性的問題了~

所以到這裡為止,我們就解釋了這個觀點,加入激活函數是用來加入非線性因素的,解決線性模型所不能解決的問題。

註:參考於@lee philip@顏沁睿倆位的回答,以上圖片大部分摘自於@顏沁睿

文章更新在知乎專欄:知乎專欄

感謝郭江師兄,森棟師兄,德川的討論交流~

希望知友提出問題一起交流~

最近開通了個人公眾號 [機器學習演算法與自然語言處理] 或者微信號 [yizhennotes],用於記錄自己在本科,碩士甚至博士期間關於ml,nlp學習和生活的筆記和感悟,可能沒有很難很偏的知識,但一定是我理解的乾貨~歡迎掃描下面二維碼關注一波~期待和你一起學習交流~


數值上擠壓,幾何上變形


激活函數的作用:就是將權值結果轉化成分類結果

先說一個簡單的情況 - 一個2類的線性分類器。

訓練
訓練的結果,會得到一組(w,b),和一個線性函數f(x) = wx + b。預測
我們現在仔細考慮一下,如何在預測函數中使用這個線性函數f(x)。
先從幾何方面理解一下,如果預測的點在分割線wx + b = 0上,那麼f(x) = wx + b = 0。
如果,在分割線的上方某處,f(x) = wx + b = 8(假設是8)。
8可以認為是偏移量。

註:取決於(w, b),在分割線上方的點可以是正的,也可能是負的。
例如: y - x =0,和 x - y = 0,這兩條線實際上是一樣的。
但是,應用點(1, 9)的結果, 第一個是8, 第二個是 -8。


問題
然後,你該怎麼辦???

激活函數
激活函數的作用是:將8變成紅色。
怎麼變的呢?比如:我們使用sigmoid函數,sigmoid(8) = 0.99966464987。
sigmoid函數的結果在區間(0, 1)上。如果大於0.5,就可以認為滿足條件,即是紅色。

三類分類器的情況


訓練
3類{a, b, c}分類器的訓練結果是3個(w, b),三個f(x),三條分割線。
每個f(x),可以認為是針對一個分類的model。因此:
f_a(x) = w_ax + b_a
f_b(x) = w_bx + b_b
f_c(x) = w_cx + b_c

預測
對於預測的點x,會得到三個偏移量(f_a(x), f_b(x), f_c(x))。
使用激活函數sigmoid:
sigmoid([f_a(x), f_b(x), f_c(x)])
會得到一個向量, 記為:[S_a, S_b, S_c]
這時的處理方法是:再次使用激活函數(沒想到吧)
一般會使用激活函數softmax。
激活函數,在這裡的作用是:計算每個類別的可能性
最後使用argmax函數得到:最大可能性的類。

註:上面差不多是Logistic Regression演算法的一部分。
註:softmax也經常被使用於神經網路的輸出層。


簡單來說,激活函數可以將非常大或非常小的數據映射到「邏輯空間」[-1,1],這樣映射過後的數據更適合在反向傳播演算法中進行梯度下降


@顏沁睿 補充一發:
大神說的很清楚了為啥要有,我補充一點為啥有了會更好。
因為最近在做凸優化問題。從參數優化方面說。
很多情況下我們做參數優化都是基於梯度的,而使用激活函數後,只要保證激活函數可微,我們就可以直接對激活函數進行梯度的計算。比如人工神經網路的反饋,梯度下降法就是直接誤差對激活函數導數的影響。
順便這也是為什麼ReLU有時不如傳統的sigmoid函數,當一個過大的梯度經過ReLU後,基本它就不會再變也不會優化了。
另外一點不常見的是,有時候我們利用激活函數可以添加一些特殊的參數限制,或者是在激活函數里加上 transform 函數來對不同維度進行不同範圍影響因素的側重。最近看的代碼就有在激活函數裡面加個1-exp(-k*x) 之類的類型進行變換的。
所以激活函數是神經網路更好的表達/學習的核心。同時,也是我們對神經網路參數學習調整的工具。
有時候費心考慮用什麼樣的神經網路結構,不如費心挑選構造一個好的激活函數。


大家都寫得很學術,說明了激活函數的作用,一點也不形象……
一個線性神經元就像一個小毛團,每當有東西戳它一下的時候,它就會戳跟著它的毛團一下,就像多米諾骨牌。
但是有時候其實你不需要知道具體被戳了多少下。我們來考慮一個防燙手的機制,假如現在在手指上有一個小神經元A(輸入層)可以感知手指附近的溫度,它連接到了另一個神經元B(隱藏層),在連接一個用來控制縮回手的神經元C(輸出層)。
這個小神經元A感受到環境的溫度是x度,然後飛快地戳了身後的神經元Bx下。神經元B接著也戳了Cx下。這時C也不知道要不要收回手,因為只收到了環境的溫度。
這時候在神經元B旁邊加入一個神經元D(bias),D在每次B要戳C之前會告訴B冷靜一下,然後擋住B戳的前n下,表明溫度在n度以下時不需要縮手。於是最終C被戳到的次數就是(x-n),如果C被戳到了,說明溫度比n度要高,此時就應該要縮手了。
但是被戳了一下和兩下也沒有區別呀,於是我們用階躍函數作為激勵函數,這樣當(x-n)大於零的時候,B就戳C一下就好了,否則就不要戳。C被戳到了就可以縮手了。
所以其實激勵函數的作用就是處理輸入產生輸出~


Deep Learning with PyTorch

From this, you can see that if you wanted your neural network to be long chains of affine compositions, that this adds no new power to your model than just doing a single affine map.

If we introduce non-linearities in between the affine layers, this is no longer the case, and we can build much more powerful models.

就是說沒有非線性部分的話,你的仿射變換複合還是仿射變換,

輸出還是輸入的線性組合。(這句是我胡扯的,我不知道規範的該怎麼說。)


一萬個線性函數的複合函數還是線性函數,那還要「深度」學習做什麼?激活函數就是為了增加神經網路的「非線性。」


我給出一個鏈接:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.740.9413rep=rep1type=pdf


推薦閱讀:

西部片里的牛仔為什麼一定要對峙很久以後才拔槍射擊?
變得會吃辣的真正原因是什麼?
達芬奇睡眠,真的那麼神奇嗎?
藥物成癮研究的未來趨勢是什麼?
現在神經生物學的發展更多的是工具推動還是 idea 推動的?或是某一時期是工具/idea 推動為主?

TAG:大腦 | 神經學 | 神經網路 |