深度學習---啟用函式
阿新 • • 發佈:2019-01-27
在說常用的啟用函式之前,先看一下生物神經元與人工神經元之間的啟用函式的區別。
在生物神經元中,啟用函式的作用為:是否相應上一個神經元,如果響應比較大,則啟用下一個神經元,往下以此傳遞。而人工神經元中的啟用函式,又成為“非線性對映函式”,它並不是去啟用什麼東西,而是增加神經網路的非線性因素,提升神經網路的表達能力。下面介紹常見的幾種啟用函式:sigmoid、tanh、relu等。
sigmoid函式
函式曲線為:
sigmoid啟用函式:將輸出對映到[0,1],但是x指的範圍只有[-5,+5],當|x| >5時,sigmoid的梯度為0,在神經網路的方向傳播過程中,導數處於該區域的誤差很難甚至無法傳至前層,就會導致引數無法更新,引起梯度消失,進一步導致神經網路無法訓練。並且它的輸出也不是以0為中心,這與神經網路期望均值為0是不相符的。
tanh函式
函式曲線為:
tanh啟用函式將輸出結果對映到[-1,1];比sigmoid函式的收斂速度要快;結果是以0為中心對稱,但是它依然不能解決梯度消失的問題。
relu啟用函式
relu函式,在深度學習中使用非常廣泛,函式的公式為:,它對應的去曲線為:
相比simmoid與tanh啟用函式,它在SGD中可以加速模型的收斂;並且解決了梯度消失的問題;同時提高了神經網路稀疏的表達能力。
但relu又一個設計設計缺陷,當x<0時,引數的梯度為0,這將導致這部分引數不能更新,而引起“死區”現象。
最後附上啟用函式的實現程式碼,雖然比較Easy,但有程式碼,看起來還是比較方便的。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,11)
def show_pic(x,y):
plt.plot(x,y)
plt.show()
def tanh(x):
y = (1 - np.exp(-2*x))/(1 + np.exp(-2*x))
show_pic(x,y)
def sigmoid(x):
y = 1/(1 + np.exp(-x))
show_pic(x,y)
def relu(x):
y = []
for data in x:
if data>0:
y.append(data)
else:
y.append(0)
show_pic(x,y)
relu(x)
tanh(x)
sigmoid(x)