幾種常見的激活函數(shù)


??? 常見的傳統(tǒng)激活函數(shù)主要有兩個(gè):sigmoid和tanh。


代碼運(yùn)行figure1

首先說一下sigmoid函數(shù)。

sigmoid函數(shù)

??? 它是使用范圍最廣的一類激活函數(shù),具有指數(shù)函數(shù)形狀,在物理上最接近神經(jīng)元。它的輸出范圍在(0,1)之間,可以被表示成概率,或者用于數(shù)據(jù)的歸一化。

但是它有兩個(gè)嚴(yán)重的缺陷:

?????? 1. 軟飽和性——導(dǎo)數(shù) f'(x)=f(x)(1-f(x)),當(dāng)x趨于無窮時(shí),f(x)的兩側(cè)導(dǎo)數(shù)逐漸趨于0。

?????? 在后向傳遞時(shí),sigmoid向下傳遞的梯度包含了一個(gè)f'(x)因子,因此,一旦落入飽和區(qū)f'(x)就變得接近于0,導(dǎo)致了向后傳遞的梯度也非常小。此時(shí),網(wǎng)絡(luò)參數(shù)很難得到有效訓(xùn)練,這種現(xiàn)象被稱為梯度消失。一般在5層以內(nèi)就會(huì)產(chǎn)生梯度消失的現(xiàn)象。

??????? 2. sigmoid函數(shù)的輸出均大于0,這就使得輸出不是0均值,這稱為偏置現(xiàn)象。這將會(huì)導(dǎo)致后一層的神經(jīng)元將得到上一層輸出的非0均值的信號(hào)作為輸入。

然后是tanh函數(shù)。


tanh函數(shù)

??? tanh函數(shù)與sigmoid函數(shù)相比,輸出均值為0,這就使得其收斂速度要比sigmoid快,從而可以減少迭代次數(shù)。

??? 缺點(diǎn)就是同樣具有軟飽和性,會(huì)造成梯度消失。

針對(duì)sigmoid和tanh的飽和性,產(chǎn)生了ReLU函數(shù)。


ReLU函數(shù)

??? ReLU全稱為Rectified Linear Units,可以翻譯成線性整流單元或者修正線性單元。

??? 它在x>0時(shí)不存在飽和問題,從而使保持梯度不衰減,從而解決了梯度消失問題。這讓我們能夠直接以監(jiān)督的方式訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),而無需依賴無監(jiān)督的逐層預(yù)訓(xùn)練。然而,隨著訓(xùn)練的推進(jìn),部分輸入會(huì)落入硬飽和區(qū),導(dǎo)致對(duì)應(yīng)權(quán)重?zé)o法更新,這種現(xiàn)象稱為“神經(jīng)元死亡”

??? 與sigmoid類似,ReLU的輸出均值也大于0,所以偏移現(xiàn)象和神經(jīng)元死亡共同影響網(wǎng)絡(luò)的收斂性。

Leaky-ReLU


Leaky-Relu函數(shù)

??? 為了避免ReLU在x<0時(shí)的神經(jīng)元死亡現(xiàn)象,添加了一個(gè)參數(shù)。

代碼運(yùn)行figure2

之后就是ELU函數(shù)。


ELU函數(shù)

它結(jié)合了sigmoid和ReLU函數(shù),左側(cè)軟飽和,右側(cè)無飽和。

??? 右側(cè)線性部分使得ELU能緩解梯度消失,而左側(cè)軟飽和能讓對(duì)ELU對(duì)輸入變化或噪聲更魯棒。ELU的輸出均值接近于0,所以收斂速度更快。

最后附上常見的幾種激活函數(shù)的圖像實(shí)現(xiàn)(運(yùn)行結(jié)果已給出):

import matplotlib.pyplotas plt


import numpyas np


x = np.linspace(-10, 10, 60)


def elu(x, a):


y = []


for iin x:


if i >=0:


y.append(i)


else:


y.append(a * np.exp(i) -1)


return y


relu = np.maximum(x, [0] *60)


relu6 = np.minimum(np.maximum(x, [0] *60), [6] *60)


softplus = np.log(np.exp(x) +1)


elu = elu(x, 1)


softsign = x / (np.abs(x) +1)


sigmoid =1 / (1 + np.exp(-x))


tanh = np.tanh(x)


lrelu = np.maximum(0.1 * x, x)


plt.figure()


plt.plot(x, relu6, label='relu6', linewidth=3.0)


plt.plot(x, relu, label='relu', color='black', linestyle='--', linewidth=2.0)


plt.plot(x, elu, label='elu', linewidth=2.0)


plt.plot(x, lrelu, label='lrelu', linewidth=1.0)


ax = plt.gca()


ax.spines['right'].set_color('none')


ax.spines['top'].set_color('none')


ax.xaxis.set_ticks_position('bottom')


ax.spines['bottom'].set_position(('data', 0))


ax.yaxis.set_ticks_position('left')


ax.spines['left'].set_position(('data', 0))


plt.legend(loc='best')


plt.figure()


plt.ylim((-1.2, 1.2))


plt.plot(x, softsign, label='softsign', linewidth=2.0)


plt.plot(x, sigmoid, label='sigmoid', linewidth=2.0)


plt.plot(x, tanh, label='tanh', linewidth=2.0)


plt.plot(x, softplus, label='softplus', linewidth=2.0)


# plt.plot(x, hyperbolic_tangent,label='hyperbolic_tangent',linewidth=2.0)


ax = plt.gca()


ax.spines['right'].set_color('none')


ax.spines['top'].set_color('none')


ax.xaxis.set_ticks_position('bottom')


ax.spines['bottom'].set_position(('data', 0))


ax.yaxis.set_ticks_position('left')


ax.spines['left'].set_position(('data', 0))


plt.legend(loc='best')


plt.show()




參考文獻(xiàn):深度學(xué)習(xí)筆記(三):激活函數(shù)和損失函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容