最近我有一個同事老是問我“為什么我們用這么多激活函數(shù)?”,“為什么這個函數(shù)效果比那個好?”,“你怎么知道要用哪個函數(shù)?”,“這是很難的數(shù)學(xué)?”等等。所以我想,我何不給對神經(jīng)網(wǎng)絡(luò)只有基本了解的人寫篇文章,介紹下激活函數(shù)和相應(yīng)的數(shù)學(xué)呢?
注意:本文假設(shè)你對人工“神經(jīng)元”有基本的了解。
激活函數(shù)
簡單來說,人工神經(jīng)元計算輸入的“加權(quán)和”,加上偏置,接著決定是否需要“激活”(好吧,其實是激活函數(shù)決定是否激活,但是現(xiàn)在讓我們先這樣理解吧)。
考慮一個神經(jīng)元。
上式中,Y的值可能是負(fù)無窮大到正無窮大之間的任意值。神經(jīng)元并不知道值的界限。所以我們?nèi)绾螞Q定神經(jīng)元是否需要激活呢?
為此,我們決定增加“激活函數(shù)”。
階躍函數(shù)
我們首先想到的是一個基于閾值的激活函數(shù)。如果Y的值大于一個特定值,就定義為“激活”。如果小于閾值,則不激活。
激活函數(shù) A = “激活” if Y > 閾值 else not
或者,A = 1 if Y > 閾值, 否則 0
好吧,我們剛剛定義的是一個階躍函數(shù)(step function)。
當(dāng)值大于0(閾值)時,輸出為1(激活),否則輸出為0(不激活)。
很好。很清楚,這可以作為神經(jīng)元的激活函數(shù)。然而,這個方法有一些特定的缺陷。
假設(shè)你正創(chuàng)建一個二元分類器,輸出“是”或“否”(激活或未激活)。一個階躍函數(shù)可以做到這一點。實際上這正是階躍函數(shù)做的事,輸出1或0。然后,想想如果你想要連接更多這樣的神經(jīng)元來引入更多的分類,比如類一、類二、類三,等等。當(dāng)不止一個神經(jīng)元“激活”時會發(fā)生什么?所有的神經(jīng)元將輸出1(基于階躍函數(shù))。然后你如何決定最終結(jié)果屬于哪個分類呢?嗯,很難,很復(fù)雜。
你可能想要用當(dāng)且僅當(dāng)一個神經(jīng)元輸出為1來表示分類結(jié)果。?。∵@更難訓(xùn)練了。更好的選擇是,激活函數(shù)不是二元的,可以表達“50%激活”、“20%激活”之類的概念。這樣,當(dāng)不止一個神經(jīng)元激活的時候,你可以找到“激活程度最高”的神經(jīng)元(其實比max更優(yōu)的選擇是softmax,不過目前我們就用max吧)。
當(dāng)然,如果不止1個神經(jīng)元表示“100%激活”了,問題仍然存在。不過,由于輸出存在中間值,因此學(xué)習(xí)過程將更平滑、更容易(較少波動),不止1個神經(jīng)元100%激活的概率要比使用階躍函數(shù)訓(xùn)練小很多(當(dāng)然,這也取決于訓(xùn)練的數(shù)據(jù))。
好,所以我們希望輸出中間(模擬)激活值,而不是僅僅輸出“激活”或“不激活”(二元值)。
我們第一個想到的是線性函數(shù)。
線性函數(shù)
A = cx
以上是一個直線函數(shù),激活與函數(shù)輸入(神經(jīng)元的加權(quán)和)成比例。
所以這將給出一定范圍內(nèi)的激活,而不是二元激活。我們當(dāng)然可以連接若干神經(jīng)元,如果不止一個神經(jīng)元激活了,我們可以基于最大值(max或softmax)做決定。所以這很好。那么,這有什么問題呢?
如果你熟悉用于訓(xùn)練的梯度下降,你會注意到這個函數(shù)的導(dǎo)數(shù)是一個常數(shù)。
A = cx對x的導(dǎo)數(shù)是c。這意味著梯度與x無關(guān)。這將是一個常數(shù)梯度。如果預(yù)測出現(xiàn)了錯誤,反向傳播進行的改動將是常數(shù),而不依賴于輸入delta(x)!??!
這可不怎么好?。ú⒎强偸侨绱?,但請容許我這么說。)此外,還有一個問題。想想連接起來的層。每個層由線性函數(shù)激活。這個激活接著作為下一層的輸入,下一層同樣基于線性函數(shù)激活,重復(fù)此過程,一直到最后一層。
不管我們有多少層,如果這些層的激活函數(shù)都是線性的,最后一層的最終激活函數(shù)將是第一層的輸入的線性函數(shù)!停頓一會,想想這個。
這意味著,這兩層(或N層)可以被一個單獨的層替換。?。∥覀儎倓偸チ硕询B網(wǎng)絡(luò)層的能力。不管我們堆疊多少層,整個網(wǎng)絡(luò)始終等價于帶線性激活的單層神經(jīng)網(wǎng)絡(luò)(線性函數(shù)的線性組合仍然是一個線性函數(shù))。
讓我們繼續(xù)吧。
sigmoid函數(shù)
好吧,這曲線看上去很平滑,有點像階躍函數(shù)。那這有什么好處呢?花點時間想一想。
首先,它是非線性的。這意味著該函數(shù)的組合也是非線性的。太棒了!我們可以堆疊網(wǎng)絡(luò)層了。至于非線性激活?是的,它是非線性激活!和階躍函數(shù)不同,它將給出模擬激活。同時,它也具備平滑的梯度。
不知道你注意到了沒有,當(dāng)X位于-2和2之間時,Y的值非常陡峭。這意味著,此區(qū)間內(nèi)X的任意微小變動都將導(dǎo)致Y顯著變動。這意味著,該函數(shù)趨向于將Y的值導(dǎo)向曲線的兩端。
看起來這個性質(zhì)對分類器而言很有用?沒錯!確實是這樣。它趨向于將激活導(dǎo)向曲線的兩邊。這在預(yù)測上形成了清晰的差別。
另外一個優(yōu)勢是,相對于線性函數(shù)(-inf, inf)的值域,該函數(shù)的值域為(0, 1)。因此我們的激活函數(shù)是有界的。
sigmoid函數(shù)是現(xiàn)在使用這廣泛的函數(shù)之一。那么,它有什么問題呢?
不知道你注意到了沒有,越是接近sigmoid的兩端,相對X的改變,Y就越趨向于作出非常小的反應(yīng)。這意味著在該區(qū)域的梯度會很小。也就是“衰減的梯度”問題 。嗯,所以當(dāng)激活函數(shù)接近曲線兩端的“鄰近地平線”部分時發(fā)生了什么?
梯度會很小,或者消失了(由于值極小,無法做出顯著的改變了)。網(wǎng)絡(luò)拒絕進一步學(xué)習(xí),或者學(xué)習(xí)速度劇烈地變慢了(取決于具體案例,直到梯度/計算碰到了浮點值的限制)。不過,我們有一些變通措施,因此在分類問題中,sigmoid仍舊非常流行。
Tanh函數(shù)
另一個常用的激活函數(shù)是tanh函數(shù)。
嗯,這看起來和sigmoid很像嘛。實際上,這是一個經(jīng)過拉升的sigmoid函數(shù)!
好,tanh的性質(zhì)和我們之前討論的sigmoid類似。它是非線性的,因此我們可以堆疊網(wǎng)絡(luò)層。它是有界的(-1, 1),所以不用擔(dān)心激活膨脹。值得一提的是,tanh的梯度比sigmoid更激烈(導(dǎo)數(shù)更陡峭)。因此,選擇sigmoid還是tanh將取決于你對梯度強度的需求。和sigmoid類似,tanh也存在梯度衰減問題。
tanh也是一個非常流行和廣泛使用的激活函數(shù)。
ReLu
接著,是ReLu函數(shù),
A(x) = max(0, x)
ReLu函數(shù)如上所示。當(dāng)x是正值時,它輸出x,否則輸出0。
乍看起來這和線性函數(shù)有一樣的問題,因為在正值處它是線性的。首先,RuLu是非線性的。ReLu的組合也是非線性的?。▽嶋H上它是一個很好的逼近子。ReLu的組合可以逼近任何函數(shù)。)很好,這意味著我們可以堆疊網(wǎng)絡(luò)層。不過,它并不是有界的。ReLu的值域是[0, inf)。這意味著它將膨脹激活函數(shù)。
我想指出的另一點是激活的稀疏性。想象一個具有很多神經(jīng)元的大型神經(jīng)網(wǎng)絡(luò)。使用sigmoid或tanh會導(dǎo)致幾乎所有神經(jīng)元以模擬的方式激活(沒忘吧?)這意味著需要處理幾乎所有的激活以描述網(wǎng)絡(luò)的輸出。換句話說,激活是密集的。這樣成本很高。理想情況下,我們希望網(wǎng)絡(luò)中的一些神經(jīng)元不激活,從而使激活變得稀疏和高效。
ReLu在這方面很有用。想象一個具備隨機初始權(quán)重(或歸一化的權(quán)重)的網(wǎng)絡(luò),基于ReLu的特性(x的負(fù)值將輸出0),基本上50%的網(wǎng)絡(luò)將生成0。這意味著更少的神經(jīng)元將被激活(稀疏激活),網(wǎng)絡(luò)也更輕量。哇,棒!ReLu看起來真不錯!是的,它確實不錯,但沒什么東西不存在缺陷……甚至是RuLu。
ReLu的水平線部分(X的負(fù)值)意味著梯度會趨向于0。當(dāng)激活位于ReLu的水平區(qū)域時,梯度會是0,導(dǎo)致權(quán)重?zé)o法隨著梯度而調(diào)整。這意味著,陷入此狀態(tài)的神經(jīng)元將停止對誤差/輸入作出反應(yīng)(很簡單,因為梯度是0,沒有什么改變)。這被稱為死亡ReLu問題。這一問題會導(dǎo)致一些神經(jīng)元直接死亡、失去響應(yīng),導(dǎo)致網(wǎng)絡(luò)的很大一部分進入被動狀態(tài)。有一些緩和這一問題的ReLu變體,將水平線轉(zhuǎn)為非水平部分,例如,當(dāng)x<0時y = 0.01x,使圖像從水平線變?yōu)槁晕A斜的直線。這就是弱修正ReLu(leaky ReLu)。還有其他一些變體。主要的想法是讓梯度不為零,這樣網(wǎng)絡(luò)可以逐漸從訓(xùn)練中恢復(fù)。
相比tanh和sigmoid,ReLu在算力上更經(jīng)濟,因為它使用的是比較簡單的數(shù)學(xué)運算。設(shè)計深度神經(jīng)網(wǎng)絡(luò)的時候,這是需要考慮的一個重要因素。
好,該選哪個呢?
現(xiàn)在來考慮該用哪個激活函數(shù)的問題。我們是否應(yīng)該總是使用ReLu呢?還是sigmoid或tanh?好,是也不是。當(dāng)我們知道嘗試逼近的函數(shù)具有某些特定性質(zhì)時,我們可以選擇能夠更快逼近函數(shù)的激活函數(shù),從而加快訓(xùn)練過程。例如,sigmoid對分類器而言很有效(看看sigmoid的圖像,是不是展示了一個理想的分類器的性質(zhì)?),因為基于sigmoid的組合逼近的分類函數(shù)要比諸如ReLu之類的函數(shù)更容易。當(dāng)然,你也可以使用自己定制的函數(shù)!如果你并不清楚試圖學(xué)習(xí)的函數(shù)的本質(zhì),那我會建議你從ReLu開始,然后再試其他。在大多數(shù)情況下,ReLu作為一個通用的逼近子效果很不錯。
在本文中,我嘗試描述了一些常用的激活函數(shù)。還有其他的激活函數(shù),但基本的思想是一樣的。尋找更好的激活函數(shù)的研究仍在進行。希望你理解了激活函數(shù)背后的思想,為什么要使用激活函數(shù),以及如何選用激活函數(shù)。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4717瀏覽量
99990 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4234瀏覽量
61962
原文標(biāo)題:理解神經(jīng)網(wǎng)絡(luò)的激活函數(shù)
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論