激活函數(shù)
將輸入信號的總和轉(zhuǎn)換為輸出信號,一般稱為激活函數(shù)(activation function)。激活函數(shù)作用在于決定如何來激活輸入信號的總和。
對激活函數(shù),一般要求:
- 非線性:為提高模型的學習能力,如果是線性,那么再多層都相當于只有兩層效果。
- 可微性:有時可以弱化,在一些點存在偏導即可。
- 單調(diào)性:保證模型簡單。
激活函數(shù)在神經(jīng)網(wǎng)絡(luò)中的作用有很多,主要作用是給神經(jīng)網(wǎng)絡(luò)提供非線性建模能力。如果沒有激活函數(shù),那么再多層的神經(jīng)網(wǎng)絡(luò)也只能處理線性可分問題。
神經(jīng)網(wǎng)絡(luò)使用的激活函數(shù):
(記住激活函數(shù)的表達式和對應(yīng)的圖形)
sigmoid函數(shù)
優(yōu)點在于輸出映射在(0,1)內(nèi),單調(diào)連續(xù),適合用作輸出層,求導容易;缺點是具有軟飽和性,一旦輸入數(shù)據(jù)落入飽和區(qū),一階導數(shù)變得接近0,就可能產(chǎn)生梯度消失問題。
公式
在python中實現(xiàn)sigmoid函數(shù)
def sigmoid(x):
return 1 / (1+ np.exp(-x))
這里 np.exp(-x)對應(yīng)exp(-x),要注意的是參數(shù)x為NumPy數(shù)組,結(jié)果也能正確計算,sigmoid的運算會在NumPy數(shù)組的各個元素間進行
函數(shù)圖形
階躍函數(shù)
階躍函數(shù)的定義當輸人超過0時,輸出1否則輸出0。
實現(xiàn)如下:
def step_function(x):
return np.array(x > 0, dtype=int)
tip: 對NumPy數(shù)組進行不等號運算后,數(shù)組的各個元素都會進行不等號原酸生成一個布爾型數(shù)組。然后將數(shù)組y的元素類型從布爾型轉(zhuǎn)換為int型
函數(shù)圖形
sigmoid函數(shù)和階躍函數(shù)的比較
- “平滑性”的不同:階躍函數(shù)只能返回0或1,sigmoid函數(shù)可以返回0.71、0.80等實數(shù)
- 兩個函數(shù)具有相同的形狀,兩者的結(jié)構(gòu)均是“輸入小時,輸出接近0(為0),隨著輸人增大,輸出向1靠近(變成1)。
- 兩者均為非線性函數(shù)
要注意的是:神經(jīng)網(wǎng)絡(luò)的激活函數(shù)必須使用非線性函數(shù)。因為使用線性函數(shù)的話,加深神經(jīng)網(wǎng)絡(luò)的層數(shù)就沒有意義了。也就是常說的斷線性。
線性函數(shù)的問題在于,不管如何加深層數(shù),總是存在與之等效的“無隱藏層的神經(jīng)網(wǎng)絡(luò)”。例如:這里我們考慮把線性函數(shù)h(z)=c作為激活函數(shù),把y(z)=h(h(h(z)))的運算對應(yīng)3層神經(jīng)網(wǎng)絡(luò)·。這個運算會進行y(z)=c x c x c x X的乘法運算,但是同樣的處理可以由y(z)=az(注意a=c3)這一次乘法運算(即沒有隱藏層的神經(jīng)網(wǎng)絡(luò))來表示。換言之,用線性函數(shù)無法發(fā)揮疊加層的作用
ReLU函數(shù)
relu函數(shù)是目前最受歡迎的激活函數(shù),在x<0時,硬飽和,x>0時,導數(shù)為1,所以在x>0時保持梯度不衰減,從而可以緩解梯度消失問題,能更快收斂,并提供神經(jīng)網(wǎng)絡(luò)的稀疏表達能力。但隨著訓練的進行,部分輸入會落入硬飽和區(qū),導致對應(yīng)的權(quán)重無法更新,稱為“神經(jīng)元死亡”
ReLU函數(shù)在輸人大于0時,直接輸出該值;在輸入小于等于0時,輸出0
ReLU函數(shù)的實現(xiàn)如下:
def relu(x):
return np,maximum(0,x)
函數(shù)圖形
tanh
tanh激活函數(shù)同樣具有軟飽和性,輸出以0為中心,收斂速度比tanh激活函數(shù)同樣具有軟飽和性,輸出以0為中心,收斂速度比sigmoid快,但是也存在梯度消失問題
tanh函數(shù)公式如下:
在python的實現(xiàn)如下:
def tanh(x):
return np.tanh(x)
圖形如下:
在搭建神經(jīng)網(wǎng)絡(luò)時,如何選擇激活函數(shù)?
如果搭建的神經(jīng)網(wǎng)絡(luò)層數(shù)不多,選擇sigmoid、tanh、relu、softmax都可以;
如果搭建的網(wǎng)絡(luò)層次比較多,那就需要小心,選擇不當就可導致梯度消失問題。此時一般不宜選擇sigmoid、tanh激活函數(shù),因它們的導數(shù)都小于1,尤其是sigmoid的導數(shù)在[0,1/4]之間,多層疊加后,根據(jù)微積分鏈式法則,隨著層數(shù)增多,導數(shù)或偏導將指數(shù)級變小。所以層數(shù)較多的激活函數(shù)需要考慮其導數(shù)不宜小于1,當然導數(shù)也不能大于1,大于1將導致梯度爆炸,導數(shù)為1最好,激活函數(shù)relu正好滿足這個條件。所以,搭建比較深的神經(jīng)網(wǎng)絡(luò)時,一般使用relu激活函數(shù),雖然一般神經(jīng)網(wǎng)絡(luò)也可使用。此外,激活函數(shù)softmax由于Σσi(Z)=1,常用于多分類神經(jīng)網(wǎng)絡(luò)輸出層。文章來源:http://www.zghlxwxcb.cn/news/detail-487993.html
補充
飽和,軟飽和,硬飽和的概念文章來源地址http://www.zghlxwxcb.cn/news/detail-487993.html
-
飽和
當x趨近于正無窮,h(x)趨近于0,稱之為右飽和。
當n趨近于負無窮,h(x)趨近于0,稱之為左飽和。
當一個函數(shù)既滿足左飽和又滿足右飽和的時候就稱之為飽和。 -
硬飽和
對于任意的x,如果存在常數(shù)c,當x>c時,恒有h(x)=0,則稱其為右硬飽和。
如果對于任意的x,如果存在常數(shù)c,當x<c時,恒有h(x)=0,則稱其為左硬飽和。
既滿足左硬飽和又滿足右硬飽和的我們稱這種函數(shù)為硬飽和。 -
軟飽和
對于任意的x,如果存在常數(shù)c,當x>c時,恒有h(x)趨近于0,則稱其為右軟飽和。
如果對于任意的x,如果存在常數(shù)c,當x<c時,恒有h(x) 趨近于0,則稱其為左軟飽和。
既滿足左軟飽和又滿足右軟飽和的我們稱這種函數(shù)為軟飽和。
到了這里,關(guān)于【深度學習】2-1 神經(jīng)網(wǎng)絡(luò) - 激活函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!