sigmoid函数_常用的激活(激励)函数——深度学习笔记(建议收藏)
激活函數(shù)(又叫激勵函數(shù),后面就全部統(tǒng)稱為激活函數(shù))是模型整個結(jié)構(gòu)中的非線性扭曲力,神經(jīng)網(wǎng)絡(luò)的每層都會有一個激活函數(shù)。那他到底是什么,有什么作用?都有哪些常見的激活函數(shù)呢?
深度學習的基本原理就是基于人工神經(jīng)網(wǎng)絡(luò),信號從一個神經(jīng)元進入,經(jīng)過非線性的 activation function,傳入到下一層神經(jīng)元;再經(jīng)過該層神經(jīng)元的 activate,繼續(xù)往下傳遞,如此循環(huán)往復,直到輸出層。正是由于這些非線性函數(shù)的反復疊加,才使得神經(jīng)網(wǎng)絡(luò)有足夠的 capacity來抓取復雜的pattern,在各個領(lǐng)域取得 state-of-the-art 的結(jié)果。顯而易見,activate function 在深度學習舉足輕重,也是很活躍的研究領(lǐng)域之一。所以下面學習一下深度學習中常用的激勵函數(shù)。
1,什么是激活函數(shù)?
神經(jīng)網(wǎng)絡(luò)中的每個神經(jīng)元節(jié)點接受上一層神經(jīng)元的輸出值作為本神經(jīng)元的輸入值,并將輸入值傳遞給下一層,輸入層神經(jīng)元節(jié)點會將輸入屬性直接傳遞到下一層(隱層或輸出層)。在多層神經(jīng)網(wǎng)絡(luò)中,上層節(jié)點的輸出和下層節(jié)點的輸入之間具有一個函數(shù)關(guān)系,這個函數(shù)稱為激活函數(shù)。
2,為什么要用激活函數(shù)(激活函數(shù)的用途)?
簡單來說:1,加入非線性因素 2,充分組合特征
在神經(jīng)網(wǎng)絡(luò)中,如果不對上一層結(jié)點的輸出做非線性轉(zhuǎn)換的話(其實相當于激活函數(shù)為 f(x)=x),再深的網(wǎng)絡(luò)也是線性模型,只能把輸入線性組合再輸出,不能學習到復雜的映射關(guān)系,而這種情況就是最原始的感知機(perceptron),那么網(wǎng)絡(luò)的逼近能力就相當有限,因此需要使用激活函數(shù)這個非線性函數(shù)做轉(zhuǎn)換,這樣深層神經(jīng)網(wǎng)絡(luò)表達能力就更加強大了(不再是輸入的線性組合,而是幾乎可以逼近任意函數(shù))。
我們知道深度學習的理論基礎(chǔ)是神經(jīng)網(wǎng)絡(luò),在單層神經(jīng)網(wǎng)絡(luò)中(感知機 Perceptron),輸入和輸出計算關(guān)系如下:
可見,輸入與輸出是一個線性關(guān)系,對于增加了多個神經(jīng)元之后,計算公式也是類似,如下圖:
這樣的模型就只能處理一些簡單的線性數(shù)據(jù),而對于非線性數(shù)據(jù)則很難有效的處理(也可通過組合多個不同線性表示,但這樣更加復雜和不靈活),如下圖所示:
那么,通過在神經(jīng)網(wǎng)絡(luò)中加入非線性激勵函數(shù)后,神經(jīng)網(wǎng)絡(luò)就有可能學習到平滑的曲線來實現(xiàn)對非線性數(shù)據(jù)的處理了,如下圖所示:
因此,神經(jīng)網(wǎng)絡(luò)中激勵函數(shù)的作用通俗上講就是將多個線性輸入轉(zhuǎn)換為非線性的關(guān)系。如果不使用激勵函數(shù)的話,神經(jīng)網(wǎng)絡(luò)的每層都只是做線性變換,即使是多層輸入疊加后也還是線性變換。通過激勵函數(shù)引入非線性因素后,使神經(jīng)網(wǎng)絡(luò)的表達能力更強了。
3,有哪些激活函數(shù),都有什么性質(zhì)和特點?
早期研究神經(jīng)網(wǎng)絡(luò)主要采用Sigmoid函數(shù)或者 tanh函數(shù),輸入有界,很容易充當下一層的輸入。近些年ReLU函數(shù)及其改進型(如Leaky-ReLU,P-ReLU,R-ReLU等)在多層神經(jīng)網(wǎng)絡(luò)中應用比較多。下面學習幾個常用的激勵函數(shù)。
3.1 激活函數(shù)的性質(zhì)
非線性
當激活函數(shù)是線性的時候,一個層的神經(jīng)網(wǎng)絡(luò)就可以逼近基本上所有的函數(shù)了。但是,如果激活函數(shù)是恒定激活函數(shù)的時候(即 f(x)=x),就不滿足這個性質(zhì)了,而且如果MLP使用的是恒等激活函數(shù),那么其實整個網(wǎng)絡(luò)根單層神經(jīng)網(wǎng)絡(luò)是等價的。
可微性
當優(yōu)化方法是基于梯度的時候,這個性質(zhì)是必須的。
單調(diào)性
當激活函數(shù)是單調(diào)的時候,單層網(wǎng)絡(luò)能夠保證是凸函數(shù)
f(x) ≈ x
當激活函數(shù)滿足這個性質(zhì)的時候,如果參數(shù)的初始化是 random的很小的值,那么神經(jīng)網(wǎng)絡(luò)的訓練將會很高效;如果不滿足這個性質(zhì),那么就需要很用心的去設(shè)置初始值
輸出值的范圍
當激活函數(shù)的輸出值是有限的時候,基于梯度的優(yōu)化方法會更加穩(wěn)定,因為特征的表示受有限權(quán)值的影響更顯著;當激活函數(shù)的輸出是無限的時候,模型的訓練會更加高效,不過在這種情況下,一般需要更小的 learning rate。
基于上面性質(zhì),也正是我們使用激活函數(shù)的原因
3.2 Sigmoid 函數(shù)
Sigmoid函數(shù)時使用范圍最廣的一類激活函數(shù),具有指數(shù)函數(shù)的形狀,它在物理意義上最為接近生物神經(jīng)元。其自身的缺陷,最明顯的就是飽和性。從函數(shù)圖可以看到,其兩側(cè)導數(shù)逐漸趨近于0,殺死梯度。
Sigmoid激活函數(shù)和導函數(shù)如下:
對應的圖像如下:
畫圖對應的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(-10, 10, 0.025)
plt.plot(x,1/(1+np.exp(-x)))
plt.title("y = 1/(1+exp(-x))")
plt.show()
plt.plot(x,np.exp(-x)/(1+np.exp(-x))**2)
plt.title("y = exp(-x)/(1+exp(-x))^2")
plt.show()
優(yōu)點:
這應該是神經(jīng)網(wǎng)絡(luò)中使用最頻繁的激勵函數(shù)了,它把一個實數(shù)(輸入的連續(xù)實值)壓縮到0到1之間,當輸入的數(shù)字非常大的時候,結(jié)果會接近1,當輸入非常大的負數(shù)時,則會得到接近0的結(jié)果。在早期的神經(jīng)網(wǎng)絡(luò)中使用地非常多,因為它很好地解釋了神經(jīng)元受到刺激后是否被激活和向后傳遞的場景(0:幾乎沒有被激活;1:完全被激活)。
缺點:
不過近幾年在深度學習的應用中比較少見到它的身影,因為使用Sigmoid函數(shù)容易出現(xiàn)梯度彌散或者梯度飽和。當神經(jīng)網(wǎng)絡(luò)的層數(shù)很多時,如果每一層的激活函數(shù)都采用Sigmoid函數(shù)的話,就會產(chǎn)生梯度彌散和梯度爆炸的問題,其中梯度爆炸發(fā)生的概率非常小,而梯度消失發(fā)生的概率比較大。
上面也畫出了Sigmoid函數(shù)的導數(shù)圖,我們可以看到,如果我們初始化神經(jīng)網(wǎng)絡(luò)的權(quán)重為[0, 1] 之間的隨機數(shù)值,由反向傳播算法的數(shù)學推導可知,梯度從后向前傳播時,每傳遞一層梯度值都會減少為原來的 0.25 倍,因為利用反向傳播更新參數(shù)時,會乘以它的導數(shù),所以會一直減少。如果輸入的是比較大或比較小的數(shù)(例如輸入100,經(jīng)Sigmoid 函數(shù)后結(jié)果接近于1,梯度接近于0),會產(chǎn)生梯度消失線性(飽和效應),導致神經(jīng)元類似于死亡狀態(tài)。而當網(wǎng)絡(luò)權(quán)值初始化為(1 , +∞) 區(qū)間的值,則會出現(xiàn)梯度爆炸情況。
還有Sigmoid函數(shù)的output不是0均值(zero-centered),這是不可取的,因為這會導致后一層的神經(jīng)元將得到上一層輸出的非 0 均值的信號作為輸入。產(chǎn)生一個結(jié)果就是:如 x > 0 , 則 f = wTx + b,那么對 w 求局部梯度則都為正,這樣在反向傳播的過程中 w 要么都往正方向更新,要么都往負方形更新,導致一種捆綁的效果,使得收斂緩慢。當然了,如果按照 batch 去訓練,那么那個 batch 可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產(chǎn)生一些不好的影響,不過跟上面提到的梯度消失問題相比還是好很多的。
最后就是對其解析式中含有冪函數(shù),計算機求解時相對比較耗時,對于規(guī)模比較大的深度網(wǎng)絡(luò),這會較大的增加訓練時間。
科普:什么是飽和呢?
當一個激活函數(shù) h(x) 滿足:
當 h(x) 即滿足左飽和又滿足又飽和,稱之為飽和。
3.3 tanh函數(shù)
tanh是雙曲函數(shù)中的一個,tanh() 為雙曲正切。在數(shù)學中,雙曲正切 tanh 是由雙曲正弦和雙曲余弦這兩者基本雙曲函數(shù)推導而來。
正切函數(shù)時非常常見的激活函數(shù),與Sigmoid函數(shù)相比,它的輸出均值是0,使得其收斂速度要比Sigmoid快,減少迭代次數(shù)。相對于Sigmoid的好處是它的輸出的均值為0,克服了第二點缺點。但是當飽和的時候還是會殺死梯度。
tanh激活函數(shù)和導函數(shù)分別如下:
對應的圖像分別為:
圖像所對應的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(-10, 10, 0.025)
plt.plot(x,(1-np.exp(-2*x))/(1+np.exp(-2*x)))
plt.title("y = (1-exp(-2x))/(1+exp(-2x))")
plt.show()
plt.plot(x,4*np.exp(-2*x)/(1+np.exp(-2*x))**2)
plt.title("y = 4exp(-2x)/(1+exp(-2x))^2")
plt.show()
在神經(jīng)網(wǎng)絡(luò)的應用中,tanh通常要優(yōu)于Sigmoid的,因為 tanh的輸出在 -1~1之間,均值為0,更方便下一層網(wǎng)絡(luò)的學習。但是有一個例外,如果做二分類,輸出層可以使用 Sigmoid,因為它可以算出屬于某一類的概率。
tanh 讀作 Hyperbolic Tangent,它解決了Sigmoid函數(shù)的不是 zero-centered 輸出問題,tanh 函數(shù)將輸入值壓縮到 -1 和 1 之間,該函數(shù)與 Sigmoid 類似,也存在著梯度彌散或梯度飽和和冪運算的缺點。
為什么tanh 相比 Sigmoid收斂更快
1,梯度消失問題程度:
可以看出,tanh(x) 的梯度消失問題比 sigmoid要輕,梯度如果過早消失,收斂速度較慢。
2,以零為中心的影響,如果當前參數(shù)(w0, w1)的最佳優(yōu)化方向是 (+d0, -d1),則根據(jù)反向傳播計算公式,我們希望x0和x1符號相反,但是如果上一級神經(jīng)元采用 Sigmoid 函數(shù)作為激活函數(shù),Sigmoid不以零為中心,輸出值恒為正,那么我們無法進行更快的參數(shù)更新,而是走Z字形逼近最優(yōu)解。
3.4,ReLU 函數(shù)
針對Sigmoid函數(shù)和tanh的缺點,提出ReLU函數(shù)。
線性整流函數(shù)(Rectified Linear Unit, ReLU),又稱修正線性單元,是一種人工神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)(activation function),通常指代以斜坡函數(shù)及其變種為代表的非線性函數(shù)。
最近幾年比較受歡迎的一個激活函數(shù),無飽和區(qū),收斂快,計算簡單,有時候會比較脆弱,如果變量的更新太快,還沒有找到最佳值,就進入小于零的分段就會使得梯度變?yōu)榱?#xff0c;無法更新直接死掉了。
ReLU激活函數(shù)和導函數(shù)分別為
對應的圖像分別為:
圖像對應的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(-10, 10, 0.025)
plt.plot(x,np.clip(x,0,10e30))
plt.title("y = relu(x)=max(x,0)")
plt.show()
from matplotlib import pyplot as plt
plt.plot(x,x>0,"o")
plt.title("y = relu'(x)")
plt.show()
ReLU優(yōu)點:
ReLU是修正線性單元(The Rectified Linear Unit)的簡稱,近些年來在深度學習中使用得很多,可以解決梯度彌散問題,ReLU函數(shù)就是一個取最大值函數(shù),因為它的導數(shù)等于1或者就是0(注意:它并不是全區(qū)間可導的,但是我們可以取 Sub-gradient)。相對于sigmoid和tanh激勵函數(shù),對ReLU求梯度非常簡單,計算也很簡單,可以非常大程度地提升隨機梯度下降的收斂速度。(因為ReLU是線性的,而sigmoid和tanh是非線性的)。所以它有以下幾大優(yōu)點:
- 1,解決了gradient vanishing (梯度消失)問題(在正區(qū)間)
- 2,計算方便,求導方便,計算速度非常快,只需要判斷輸入是否大于0
- 3,收斂速度遠遠大于 Sigmoid函數(shù)和 tanh函數(shù),可以加速網(wǎng)絡(luò)訓練
ReLU缺點: 但ReLU的缺點是比較脆弱,隨著訓練的進行,可能會出現(xiàn)神經(jīng)元死亡的情況,例如有一個很大的梯度流經(jīng)ReLU單元后,那權(quán)重的更新結(jié)果可能是,在此之后任何的數(shù)據(jù)點都沒有辦法再激活它了。如果發(fā)生這種情況,那么流經(jīng)神經(jīng)元的梯度從這一點開始將永遠是0。也就是說,ReLU神經(jīng)元在訓練中不可逆地死亡了。所以它的缺點如下:
- 1,由于負數(shù)部分恒為零,會導致一些神經(jīng)元無法激活
- 2,輸出不是以0為中心
ReLU的一個缺點是當x為負時導數(shù)等于零,但是在實踐中沒有問題,也可以使用leaky ReLU。總的來說,ReLU是神經(jīng)網(wǎng)絡(luò)中非常常用的激活函數(shù)。
ReLU 也有幾個需要特別注意的問題:
1,ReLU 的輸出不是 zero-centered
2,Dead ReLU Problem,指的是某些神經(jīng)元可能永遠不會被激活,導致相應的參數(shù)永遠不會被更新,有兩個主要原因可能導致這種情況產(chǎn)生:
(1) 非常不幸的參數(shù)初始化,這種情況比較少見
(2) learning rate 太高,導致在訓練過程中參數(shù)更新太大,不幸使網(wǎng)絡(luò)進入這種狀態(tài)。
解決方法是可以采用 Xavier 初始化方法,以及避免將 learning rate 設(shè)置太大或使用 adagrad 等自動調(diào)節(jié) learning rate 的算法。盡管存在這兩個問題,ReLU目前仍然是最常見的 activation function,在搭建人工神經(jīng)網(wǎng)絡(luò)的時候推薦優(yōu)先嘗試。
ReLU 激活函數(shù)在零點是否可導?
答案是在零點不可導。
這里首先需要復習一些數(shù)學概念:連續(xù)與可導。
連續(xù):設(shè)函數(shù) y = f(x) 在點 x0 的某一領(lǐng)域內(nèi)有定義,如果函數(shù) y = f(x) 當 x——> x0 時的極限存在,且
,則稱函數(shù) y = f(x) 在點 x0 處連續(xù)。
這里需要注意左極限等于右極限等于函數(shù)值,即
,顯然 ReLU函數(shù)是連續(xù)的在零點。但是不可導。
可導:設(shè)函數(shù) y = f(x) 在點 x0 的某一鄰域內(nèi)有定義,則當自變量 x 在 x0 處取得增量 Δx 時,相應的 y 取增量
;如果 Δx ——> 0 時, Δy / Δx 極限存在,則稱 y= f(x) 在點 x0 處可導,并稱這個極限為函數(shù) y = f(x) 在點 x0 處的導數(shù),記為:
然而左導數(shù)和右導數(shù)并不相等,因而函數(shù)在該處不可導,實際上,如果函數(shù)導數(shù)存在,當且僅當其左右導數(shù)均相等。
而 ReLU 左導數(shù)等于 0 ,右導數(shù)等于1,因此不可導。
ReLU 在零點不可導,那么在反向傳播中如何處理?
caffe源碼~/caffe/src/caffe/layers/relu_layer.cpp倒數(shù)第十行代碼:
1
bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0)+ negative_slope * (bottom_data[i] <= 0));
這句話就是說間斷點的求導按左導數(shù)來計算。也就是默認情況下(negative_slope=0),RELU的間斷點處的導數(shù)認為是0。
3.5 Leaky ReLU 函數(shù)(P-ReLU)
Leaky ReLU激活函數(shù)和導函數(shù)如下:
對應的圖像分別如下:
圖像對應的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(-10, 10, 0.025)
a = 0.2
plt.plot(x,x*np.clip((x>=0),a,1))
plt.title("y = LeakyRelu(x)")
plt.show()
from matplotlib import pyplot as plt
plt.plot(x,np.clip((x>=0),a,1),"o")
plt.title("y = LeakyRelu'(x)")
plt.show()
人們?yōu)榱私鉀Q Dead ReLU Problem,提出了將 ReLU 的前半段設(shè)為 ax 而非0,通常 a = 0.01,另外一種直觀的想法是基于參數(shù)的方法,即 ParmetricReLU : f(x)=max(ax, x),其中 a 可由方向傳播算法學出來。理論上來說,Leaky ReLU 有ReLU的所有優(yōu)點,外加不會有 Dead ReLU 問題,但是在實際操作當中,并沒有完全證明 Leaky ReLU 總是好于 ReLU。
Leaky ReLU 主要是為了避免梯度小時,當神經(jīng)元處于非激活狀態(tài)時,允許一個非0的梯度存在,這樣不會出現(xiàn)梯度消失,收斂速度快。他的優(yōu)缺點根ReLU類似。
3.6 ELU 函數(shù)(Exponential Linear Unit)
融合了Sigmoid和ReLU,左側(cè)具有軟飽和性,右側(cè)無飽和性。
右側(cè)線性部分使得ELU訥訥狗狗緩解梯度消失,而左側(cè)軟飽能夠讓 ELU 對輸入變化或噪聲更魯棒。因為函數(shù)指數(shù)項所以計算難度會增加。
ELU在正值區(qū)間的值為x本身,這樣減輕了梯度彌散問題(x>0區(qū)間導數(shù)處處為1),這點跟ReLU、Leaky ReLU相似。而在負值區(qū)間,ELU在輸入取較小值時具有軟飽和的特性,提升了對噪聲的魯棒性。
函數(shù)及導數(shù)的圖像如下圖所示:
下圖是ReLU、LReLU、ELU的曲線比較圖:
ELU 也是為了解決 ReLU 存在的問題而提出,顯然,ELU有 ReLU的基本所有優(yōu)點,以及不會出現(xiàn)Dead ReLU 問題,輸出的均值接近0,zero-centered,它的一個小問題在于計算量稍大。類似于 Leaky ReLU ,理論上雖然好于 ReLU,但是實際使用中目前并沒有好的證據(jù) ELU 總是優(yōu)于 ReLU。
3.7 Maxout 函數(shù)
這個函數(shù)可以參考論文《maxout networks》,Maxout 是深度學習網(wǎng)絡(luò)中的一層網(wǎng)絡(luò),就像池化層,卷積層一樣,我們可以把 maxout 看成是網(wǎng)絡(luò)的激活函數(shù)層,我們假設(shè)網(wǎng)絡(luò)某一層的輸入特征向量為: X=(x1, x2, ....xd),也就是我們輸入的 d 個神經(jīng)元,則maxout隱藏層中神經(jīng)元的計算公式如下:
Maxout也是近些年非常流行的激勵函數(shù),簡單來說,它是ReLU和Leaky ReLU的一個泛化版本,當w1、b1設(shè)置為0時,便轉(zhuǎn)換為ReLU公式。
它用于RELU的優(yōu)點而且沒有死區(qū),但是它的參數(shù)數(shù)量卻增加了一倍。
因此,Maxout繼承了ReLU的優(yōu)點,同時又沒有“一不小心就掛了”的擔憂。但相比ReLU,因為有2次線性映射運算,因此計算量也會翻倍。
權(quán)重 w 是一個大小為(d, m , k)三維矩陣, b 是一個大小為(m, k)的二維矩陣,這兩個就是我們需要學習的參數(shù)。如果我們設(shè)定參數(shù)為 k=1,那么這個時候,網(wǎng)絡(luò)就類似于以前我們所學習的普通的 MLP網(wǎng)絡(luò)。
我們可以這樣理解,本來傳統(tǒng)的 MLP 算法在第 i 層到 第 i+1 層,參數(shù)只有一組,然而現(xiàn)在我們不這么干了,我們在這一層同時訓練 n 組的 w, b 參數(shù),然后選擇激活值 Z 最大的作為下一層神經(jīng)元的激活值,這個 max(Z) 函數(shù)即充當了激活函數(shù)。
3.8 ReLU6 函數(shù)
ReLU 在 x > 0 的區(qū)域使用 x 進行線性激活,有可能造成激活后的值太大,影響模型的穩(wěn)定性,為抵消 ReLU激活函數(shù)的線性增長部分,可以使用ReLU6函數(shù)。
ReLU6 激活函數(shù)和導函數(shù)分別如下:
對應的圖像分別為:
函數(shù)對應的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(-10, 10, 0.025)
plt.plot(x,np.clip(x,0,6))
plt.title("y = relu6(x)=min(max(x,0),6)")
plt.show()
from matplotlib import pyplot as plt
plt.plot(x,(x>0)&(x<6),"o")
plt.title("y = relu6'(x)")
plt.show()
3.9 Softmax 函數(shù)
提起softmax函數(shù),我們首先理清全連接層到損失層之間的計算,來看下面這幅圖(侵刪!):
這張圖的等號左邊部分就是全連接層做的事,W是全連接層的參數(shù),我們也稱為權(quán)值,X是全連接層的輸入,也就是特征。從圖上可以看出特征X是N*1的向量,這是怎么得到的呢?這個特征就是由全連接層前面多個卷積層和池化層處理后得到的,假設(shè)全連接層前面連接的是一個卷積層,這個卷積層的輸出是100個特征(也就是我們常說的feature map的channel為100),每個特征的大小是4*4,那么在將這些特征輸入給全連接層之前會將這些特征flat成N*1的向量(這個時候N就是100*4*4=1600)。解釋完X,再來看W,W是全連接層的參數(shù),是個T*N的矩陣,這個N和X的N對應,T表示類別數(shù),比如你是7分類,那么T就是7。我們所說的訓練一個網(wǎng)絡(luò),對于全連接層而言就是尋找最合適的W矩陣。因此全連接層就是執(zhí)行WX得到一個T*1的向量(也就是圖中的logits[T*1]),這個向量里面的每個數(shù)都沒有大小限制的,也就是從負無窮大到正無窮大。然后如果你是多分類問題,一般會在全連接層后面接一個softmax層,這個softmax的輸入是T*1的向量,輸出也是T*1的向量(也就是圖中的prob[T*1],這個向量的每個值表示這個樣本屬于每個類的概率),只不過輸出的向量的每個值的大小范圍為0到1。
現(xiàn)在知道softmax的輸出向量的意思了,就是概率,該樣本屬于各個類的概率!
softmax 函數(shù),又稱為歸一化指數(shù)函數(shù)。它是二分類函數(shù) Sigmoid在多分類上的推廣,目的是將多分類的結(jié)果以概率的形式展現(xiàn)出來,下圖展示 了softmax的計算方法:
那么為什么softmax是這種形式呢?
首先,我們知道概率有兩個性質(zhì):1,預測的概率為非負數(shù)‘2,各種預測結(jié)果概率之和等于1.
softmax 就是將在負無窮到正無窮上的預測結(jié)果按照這兩步轉(zhuǎn)換為概率的。
3.9.1 將預測結(jié)果轉(zhuǎn)化為非負數(shù)。
下圖是 y=exp(x) 的圖像,我們可以知道指數(shù)函數(shù)的值域取值范圍是零到正無窮,softmax第一步就是將模型的預測結(jié)果轉(zhuǎn)化到指數(shù)函數(shù)上,這樣保證了概率的非負性。
3.9.2 各種預測結(jié)果概率之和等于1
為了確保各個預測結(jié)果的概率之和等于1,我們只需要將轉(zhuǎn)換后的結(jié)果進行歸一化處理。方法就是將轉(zhuǎn)化后的結(jié)果除以所有轉(zhuǎn)化后結(jié)果之和,可以理解為轉(zhuǎn)化后結(jié)果占總數(shù)的百分比。這樣就得到了近似的概率。
簡單舉個例子:
假如模型對一個三分類問題的預測結(jié)果為-3、1.5、2.7。我們要用softmax將模型結(jié)果轉(zhuǎn)為概率。步驟如下:
1)將預測結(jié)果轉(zhuǎn)化為非負數(shù)
y1 = exp(x1) = exp(-3) = 0.05
y2 = exp(x2) = exp(1.5) = 4.48
y3 = exp(x3) = exp(2.7) = 14.88
2)各種預測結(jié)果概率之和等于1
z1 = y1/(y1+y2+y3) = 0.05/(0.05+4.48+14.88) = 0.0026
z2 = y2/(y1+y2+y3) = 4.48/(0.05+4.48+14.88) = 0.2308
z3 = y3/(y1+y2+y3) = 14.88/(0.05+4.48+14.88) = 0.7666
總結(jié)一下,softmax如何將多分類輸出轉(zhuǎn)換為概率,可以分為兩步:
- 1,分子:通過指數(shù)函數(shù),將實數(shù)輸出映射到零到正無窮
- 2,分母:將所有結(jié)果相加,進行歸一化
下面是斯坦福大學 CS224n 課程中最 softmax的解釋:
3.10 Softplus函數(shù)
函數(shù)如下:
函數(shù)圖:
4,如何選擇合適的激活函數(shù)
一般我們可以這樣:
- 1,首先嘗試ReLU,速度快,但是要注意訓練的狀態(tài)
- 2,如果ReLU效果欠佳,嘗試Leaky ReLU 或者 Maxout 等變種
- 3,嘗試 tanh正切函數(shù)(以零為中心,零點處梯度為1)
- 4,Sigmoid tanh 在RMM(LSTM 注意力機制等)結(jié)構(gòu)中有所應用,作為門控或者概率值
- 5,在淺層神經(jīng)網(wǎng)絡(luò)中,如不超過四層,可選擇使用多種激勵函數(shù),沒有太大的影響
深度學習中往往需要大量時間來處理大量數(shù)據(jù),模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網(wǎng)絡(luò)盡量使用 zero-centered 數(shù)據(jù)(可以經(jīng)過數(shù)據(jù)預處理實現(xiàn))和 zero-centered 輸出。所以要盡量選擇輸出具有 zero-centered 特點的激活函數(shù)以加快模型的收斂速度。
如果是使用 ReLU,那么一定要小心設(shè)置 learning rate,而且要注意,不要讓網(wǎng)絡(luò)出現(xiàn)很多“dead”神經(jīng)元,如果這個問題不好解決,那么可以試試 Leaky ReLU ,PReLU , 或者 Maxout。
最好不要用 Sigmoid函數(shù),不過可以試試 tanh,不過可以預期它的效果會比不上 ReLU和 maxout。
最后,咱給小編:
1. 點贊+關(guān)注
2. 點頭像關(guān)注后多多評論,轉(zhuǎn)發(fā)給有需要的朋友。
謝謝!!
總結(jié)
以上是生活随笔為你收集整理的sigmoid函数_常用的激活(激励)函数——深度学习笔记(建议收藏)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: char添加一个字符_给你五十行代码把图
- 下一篇: 基于Emgu CV+百度人脸识别,实现视