激活函數是神經網絡中能夠産生非線性特質的一個根源,如果沒有激活函數的存在,那麼整個網絡隻剩下線性運算,線性運算的複合還仍然線性運算,最終的效果隻相當于單層的線性模型。是以,激活函數是拟合一個預期資料分布的關鍵。
1.sigmoid函數
數學表達式如下:
函數圖像如下所示:
特征:
輸入:正負均可(圖示為-10~+10)
輸出(0,1)當輸入極大或極小時,可以取到實數0和實數1.
缺點:
1.在深度神經網絡中梯度反向傳遞時導緻梯度爆炸或梯度消失,其中梯度爆炸發生的機率非常小,而梯度消失發生的機率比較大。若初始化神經網絡的權值為 [0,1] 之間的随機值,那麼梯度在穿過多層後将變得非常小(0~0.25之間),即出現梯度消失現象;當網絡權值初始化為 (1,+∞) 區間内的值,則會出現梯度爆炸情況。
2.Sigmoid 的 output 不是0均值(即zero-centered),這會導緻後一層的神經元将得到上一層輸出的非0均值的信号作為輸入。 産生的一個結果是使得收斂緩慢。 如果按batch去訓練,則可以得到不同的信号,這個問題可以緩解一下。是以,非0均值這個問題雖然會産生一些不好的影響,不過比梯度消失問題相比要好一些。
3.解析式中含有幂運算,計算機求解時相對來講比較耗時。對于規模比較大的深度網絡,會較大地增加訓練時間。
優點:
平滑、易于求導。
在Python中畫sigmoid曲線:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1.0/(1+np.exp(-x))
sigmoid_inputs=np.arange(-10,10,0.1)
sigmoid_outputs=sigmoid(sigmoid_inputs)
print("Sigmoid Function Input :: {}".format(sigmoid_inputs))
print("Sigmoid Function Output :: {}".format(sigmoid_outputs))
plt.plot(sigmoid_inputs,sigmoid_outputs)
plt.xlabel("Sigmoid Inputs")
plt.ylabel("Sigmoid Outputs")
plt.show()