機(jī)器學(xué)習(xí)中常用激活函數(shù)和損失函數(shù)
1. 激活函數(shù)
1.1 各激活函數(shù)曲線對比
常用激活函數(shù):
tf.sigmoid()
tf.tanh()
tf.nn.relu()
tf.nn.softplus()
tf.nn.softmax()
tf.nn.dropout()
tf.nn.elu()
import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import derivative
def sigmoid(x):
y = 1 / (1 + np.exp(-x))
return y
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x)+np.exp(-x))
def relu(x):
return [max(xi,0) for xi in x]
def elu(x,a=1):
y = []
for xi in x:
if xi >= 0:
y.append(xi)
else:
y.append(a*(np.exp(xi)-1))
return y
def softplus(x):
return np.log(1+np.exp(x))
def derivative_f(func,input,dx=1e-6):
y = [derivative(func,x,dx) for x in input]
return y
x = np.linspace(-5,5,1000)
flg = plt.figure(figsize=(15,5))
ax1 = flg.add_subplot(1,2,1)
ax1.axis([-5,5,-1,1])
plt.xlabel(r'active function',fontsize=18)
ax1.plot(x,sigmoid(x),'r-',label='sigmoid')
ax1.plot(x,tanh(x),'g--',label='tanh')
ax1.plot(x,relu(x),'b-',lw=1,label='relu')
ax1.plot(x,softplus(x),'y--',label='softplus')
ax1.plot(x,elu(x),'b--',label='elu')
ax1.legend()
ax2 = flg.add_subplot(1,2,2)
plt.xlabel(r'derivative',fontsize=18)
ax2.plot(x,derivative_f(sigmoid,x),'r-',label='sigmoid')
ax2.plot(x,derivative_f(tanh,x),'g--',label='tanh')
ax2.plot(x,derivative_f(softplus,x),'y-',label='softplus')
ax2.legend()
plt.show()


1.2 各激活函數(shù)優(yōu)缺點(diǎn)
sigmoid函數(shù)
-
優(yōu)點(diǎn):在于輸出映射在(0,1)范圍內(nèi),單調(diào)連續(xù),適合用作輸出層,求導(dǎo)容易
-
缺點(diǎn):一旦輸入落入飽和區(qū),一階導(dǎo)數(shù)接近0,就可能產(chǎn)生梯度消失的情況
tanh函數(shù)
-
優(yōu)點(diǎn):輸出以0為中心,收斂速度比sigmoid函數(shù)要快
-
缺點(diǎn):存在梯度消失問題
relu函數(shù)
-
優(yōu)點(diǎn):目前最受歡迎的激活函數(shù),在x<0時,硬飽和,在x>0時,導(dǎo)數(shù)為1,所以在x>0時保持梯度不衰減,從而可以緩解梯度消失的問題,能更快收斂,并提供神經(jīng)網(wǎng)絡(luò)的稀疏表達(dá)能力
-
缺點(diǎn):隨著訓(xùn)練的進(jìn)行,部分輸入或落入硬飽和區(qū),導(dǎo)致無法更新權(quán)重,稱為‘神經(jīng)元死亡’
elu函數(shù)
-
優(yōu)點(diǎn):有一個非零梯度,這樣可以避免單元消失的問題
-
缺點(diǎn):計(jì)算速度比relu和它的變種慢,但是在訓(xùn)練過程中可以通過更快的收斂sua年度來彌補(bǔ)
softplus函數(shù)
- 該函數(shù)對relu做了平滑處理,更接近腦神經(jīng)元的激活模型
softmax函數(shù)
- 除了用于二分類還可以用于多分類,將各個神經(jīng)元的輸出映射到(0,1空間)
dropout函數(shù)
-
tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)
-
一個神經(jīng)元以概率keep_prob決定是否被抑制,如果被抑制,神經(jīng)元的輸出為0,如果不被抑制,該神經(jīng)元將被放大到原來的1/keep_prob倍,默認(rèn)情況下,每個神經(jīng)元是否被抑制是相互獨(dú)立的
一般規(guī)則
- 當(dāng)輸入數(shù)據(jù)特征相差明顯時,用tanh效果很好,當(dāng)特征相差不明顯時用sigmoid效果比較好,sigmoid和tanh作為激活函數(shù)需要對輸入進(jìn)行規(guī)范化,否則激活后的值進(jìn)入平坦區(qū),而relu不會出現(xiàn)這種情況,有時也不需要輸入規(guī)范化,因此85%-90%的神經(jīng)網(wǎng)絡(luò)會使用relu函數(shù)
2. 損失函數(shù)
損失函數(shù)一般分為二分類損失函數(shù)、多分類損失函數(shù)和回歸問題損失函數(shù)
二分類損失函數(shù)有:0-1損失、hinge損失、LogisticCrossEntropyLoss
多分類損失有:SoftmaxCrossEntropyLoss
回歸問題損失函數(shù)有:均方差誤差或根均方差誤差、平均絕對值誤差和huber損失函數(shù)
2.1 0- 1損失
對于二分類問題,Y= {-1,1},我們希望??????????
,最自然的損失是0-1損失,即
該損失函數(shù)能夠直觀地刻畫分類的錯誤率,但是由于其非凸,非光滑使得算法很難對該函數(shù)進(jìn)行優(yōu)化,下面將總結(jié)0-1損失的二個代理函數(shù):HingeLoss,LogsiticCrossEntropyLoss
2.2 HingeLoss
定義:
Hinge損失函數(shù)是0-1損失函數(shù)相對緊的凸上界,且當(dāng)fy >=1時,該函數(shù)不對其做任何懲罰,Hinge損失在fy=1處不可導(dǎo),因此不能用梯度下降法進(jìn)行優(yōu)化,而是用次梯度下降法
2.3 LogisticCrossEntropyLoss
對數(shù)似然函數(shù):
注:??(??)為??????????????函數(shù)
2.4 SoftmaxCrossEntropyLoss
損失函數(shù):
2.5 均方差
當(dāng)預(yù)測值距離真實(shí)值越大時,平方損失函數(shù)的懲罰力度越大,因此它對異常點(diǎn)比較敏感,為了解決這個問題,可以使用平均絕對損失函數(shù)
2.6 平均絕對誤差
絕對損失函數(shù)相當(dāng)于在做中值回歸,相比于做均值回歸的平方損失函數(shù)對異常點(diǎn)的魯棒性更好一些,當(dāng)時有個問題是在f=y時無法求導(dǎo),綜合考慮可導(dǎo)性和對異常點(diǎn)的魯棒性,采用Huber損失函數(shù)
2.7 HuberLoss
Huber Loss 是一個用于回歸問題的帶參損失函數(shù), 優(yōu)點(diǎn)是能增強(qiáng)平方誤差損失函數(shù)(MSE, mean square error)對離群點(diǎn)的魯棒性
當(dāng)預(yù)測偏差小于 δ 時,它采用平方誤差
當(dāng)預(yù)測偏差大于 δ 時,采用的線性誤差

注:上圖來源于http://www.rzrgm.cn/nowgood/p/Huber-Loss.html
3. 附:tensorflow中的損失函數(shù)
3.1 sigmoid_cross_entropy_with_logits函數(shù)
-
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None)
-
該函數(shù)不僅可以用于二分類,也可以用于多分類,例如:判斷圖片中是否包含幾種動物中的一種或多種
二分類logstic損失函數(shù)梯度推導(dǎo)
二項(xiàng)邏輯斯蒂回歸模型是一種分類模型,由條件概率p(y|x)表示,形式未參數(shù)化的邏輯斯蒂分布,這里的變量X為實(shí)數(shù),隨機(jī)變量y取值為1或0,邏輯斯蒂模型條件概率分布如下:
假設(shè)
損失函數(shù):
對數(shù)似然函數(shù):
求??(??(??))的極大值,得到w的估計(jì)值,由于??(??(??))
為凸函數(shù),可以直接求損失函數(shù)的一階偏導(dǎo):
由于????(??)????
得到:
3.2 weighted_cross_entropy_with_logits函數(shù)
-
tf.nn.weighted_cross_entropy_with_logits(targets,logits,pos_weight,name=None)
-
pos_weight正樣本的一個系數(shù)
-
該函數(shù)在sigmoid_cross_entropy_with_logits函數(shù)的基礎(chǔ)上為每個正樣本添加了一個權(quán)重,其損失函數(shù)如下:
3.3 softmax_cross_entropy_with_logits函數(shù)
-
tf.nn.softmax_cross_entropy_with_logits(_sentinel,labels,logits,name)
-
適用于每個類別相互獨(dú)立且排斥的情況,例如,判斷的圖片只能屬于一個種類而不能同時包含多個種類
-
損失函數(shù):
3.4 sparse_softmax_cross_entropy_with_logits函數(shù)
-
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel,labels,logits,name)
-
該函數(shù)與softmax_cross_entropy_with_logits的唯一區(qū)別在于labels,該函數(shù)的標(biāo)簽要求排他性的即只有一個正確類型,labels的形狀要求是[batch_size]而值必須是從0開始編碼的int32或int64,而且范圍是[0,num_class],該函數(shù)沒用過
浙公網(wǎng)安備 33010602011771號