激活函數(shù)
激活函數(shù)的意義:激活函數(shù)為層與層之間增加非線性連接谆趾,增加模型的復(fù)雜性啄踊,如果層之間沒有非線性疏遏,那么即使很深的層堆疊也等同于單個(gè)層
例如連接這兩個(gè)線性函數(shù)等于得到另一個(gè)線性函數(shù)
1.Sigmoid
- 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 平滑梯度:防止輸出值產(chǎn)生跳躍
- 輸出值約束在0-1之間:規(guī)范化每個(gè)神經(jīng)元的輸出值
- 明確的預(yù)測:對(duì)于X大于2或小于-2的X,趨向于將Y值(預(yù)測)帶到曲線的邊緣立哑,非常接近1或0挂滓。
缺點(diǎn)
- 梯度消失問題:只對(duì)-4 to 4之間的值敏感苦银,對(duì)于非常高或非常低的X值,預(yù)測值幾乎沒有變化,從而導(dǎo)致梯度消失幔虏。 這可能會(huì)導(dǎo)致網(wǎng)絡(luò)拒絕進(jìn)一步學(xué)習(xí)纺念,或者太慢而無法準(zhǔn)確
- 計(jì)算代價(jià)大
- 不以0為中心:無法對(duì)具有強(qiáng)負(fù),中性和強(qiáng)正值的輸入數(shù)據(jù)進(jìn)行建模想括。
- 公式及梯度公式
- 函數(shù)圖與導(dǎo)數(shù)圖
image-20210308140111421.png
- 代碼實(shí)現(xiàn)
# sigmoid 函數(shù)
import numpy as np
def sigmoid_function(x):
z = (1/(1 + np.exp(-x)))
return z
# sigmoid 導(dǎo)數(shù)
def sigmoid_derivative(x):
return sigmoid(x)*(1-sigmoid(x))
2.Tanh
- 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 以0為中心:可以更輕松地對(duì)具有強(qiáng)負(fù)陷谱,中性和強(qiáng)正值的輸入數(shù)據(jù)進(jìn)行建模。
- 平滑梯度:防止輸出值產(chǎn)生跳躍
- 輸出值約束在-1-1之間:規(guī)范化每個(gè)神經(jīng)元的輸出值
缺點(diǎn)
- 梯度消失問題:僅對(duì)-2 to 2之間的值敏感瑟蜈,對(duì)于非常高或非常低的X值烟逊,預(yù)測值幾乎沒有變化,從而導(dǎo)致梯度消失铺根。 這可能會(huì)導(dǎo)致網(wǎng)絡(luò)拒絕進(jìn)一步學(xué)習(xí)宪躯,或者太慢而無法準(zhǔn)確
- 計(jì)算代價(jià)大
- 公式及梯度公式
- 函數(shù)圖與導(dǎo)數(shù)圖
image-20210308141039070.png
- 代碼實(shí)現(xiàn)
# Tanh 函數(shù)
import numpy as np
def tanh_function(x):
z = (2/(1 + np.exp(-2*x))) -1
return z
# Tanh 導(dǎo)數(shù)
def tanh_derivative(x):
return 1 - (tanh_function(x))**2
3.ReLU
- 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 計(jì)算代價(jià)小:允許網(wǎng)絡(luò)更快的收斂
- 非線性分段函數(shù):盡管它看起來像線性函數(shù)位迂,但ReLU具有微分函數(shù)并允許反向傳播
缺點(diǎn)
- Dying ReLU問題:當(dāng)輸入接近零或?yàn)樨?fù)時(shí)访雪,函數(shù)的梯度變?yōu)榱悖W(wǎng)絡(luò)將無法執(zhí)行反向傳播掂林,也無法學(xué)習(xí)臣缀。
- 公式及梯度公式
- 函數(shù)圖與導(dǎo)數(shù)圖
image-20210308141854474.png
- 代碼實(shí)現(xiàn)
# ReLU 函數(shù)
def relu_function(x):
if x<0:
return 0
else:
return x
# ReLU 導(dǎo)數(shù)
def relu_derivative(x):
if x>= 0:
return 1
else:
return 0
4.Leaky ReLU
- 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 防止Dying ReLU問題:ReLU的這種變化在負(fù)區(qū)域具有較小的正斜率,因此即使對(duì)于負(fù)輸入值泻帮,它也能夠進(jìn)行反向傳播
- 計(jì)算代價(jià)懈闻恪:允許網(wǎng)絡(luò)更快的收斂
- 非線性分段函數(shù):盡管它看起來像線性函數(shù),但ReLU具有微分函數(shù)并允許反向傳播
缺點(diǎn)
- 結(jié)果不一致:Leaky ReLU無法為負(fù)輸入值提供一致的預(yù)測刑顺。
- 公式及梯度公式
- 函數(shù)圖與導(dǎo)數(shù)圖
image-20210308143426244.png
- 代碼實(shí)現(xiàn)
# Leaky ReLU函數(shù)
import numpy as np
def leaky_relu_function(x):
if x >= 0:
return x
else:
return 0.01x
# Leaky ReLU 導(dǎo)數(shù)
def leaky_relu_derivative(x):
if x >= 0:
return 1
else:
return 0.01
5.Parametric ReLU
- 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 允許學(xué)習(xí)負(fù)斜率:與Leaky ReLU不同,此函數(shù)提供函數(shù)負(fù)數(shù)部分的斜率作為參數(shù)饲常。 因此蹲堂,可以進(jìn)行反向傳播并學(xué)習(xí)最合適的α值。
缺點(diǎn)
- 對(duì)于不同的問題可能會(huì)有不同的表現(xiàn)贝淤。
- 公式及梯度公式
- 函數(shù)圖
prelu-300x262.png
- 代碼實(shí)現(xiàn)
# Parametric 函數(shù)
def parametric_function(x, alpha):
if x >= 0:
return x
else:
return alpha*x
# Parametric 導(dǎo)數(shù)
def parametric_derivative(x, alpha):
if x >= 0:
return 1
else:
return alpha
Softmax
- 優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 能夠處理多分類:其他激活函數(shù)只能處理一個(gè)類柒竞,將每個(gè)類別的輸出歸一化在0和1之間,得出輸入值屬于特定類別的概率播聪。
- 常用于輸出神經(jīng)元:通常朽基,Softmax僅用于輸出層,用于需要將輸入分類為多個(gè)類別的神經(jīng)網(wǎng)絡(luò)离陶。
- 公式
- 梯度公式(由于該函數(shù)的獨(dú)特性稼虎,下面重點(diǎn)講下其推導(dǎo)過程)
推導(dǎo)開始:
為了方便進(jìn)行代碼書寫,此處可以改寫為雅克比矩陣的形式
知識(shí)補(bǔ)充: 雅克比矩陣
假如
都是
的函數(shù)招刨,并且相對(duì)于各個(gè)自變量的偏微分都存在霎俩,那么定義
為:
- 代碼實(shí)現(xiàn)
# softmax 函數(shù)
import numpy as np
def softmax_function(arr):
"""
input: a array
return: a array after computed
"""
exps = np.exp(arr)
sums = np.sum(exps)
return np.divide(exps, sums)
# softmax 導(dǎo)數(shù)
def softmax_derivative(arr):
"""
input: a array after computed by softmax
output: n*n matrix, n = len(arr)
"""
s = arr.reshape(-1, 1)
return np.diagflat(s) - np.dot(s, s.T)