激活函數的作用主要是引入非線性因素,解決線性模型表達能力不足的缺陷
sigmoid函數可以從圖像中看出,當x向兩端走的時候,y值越來越接近1和-1,這種現象稱為飽和,飽和意味着當x=100和x=1000的映射結果是一樣的,這種轉化相當於將1000大於100的信息丟失了很多,所以一般需要歸一化數據。




softplus函數相比於relu函數更加平滑,會保存部分小於零的函數,但是計算量也更大了。
relu函數在信號響應上有很多優勢,但是僅僅在正向傳播中,由於其對負值全部舍去很容易使模型輸出全零而無法訓練。例如:隨機初始化的w中存在負值,其對應的正值輸入特征也就被全部屏蔽了,同理對應的負值輸入反而被激活了。因此,一些relu變種被開發,此處不詳細講解。
Swish是谷歌公司發現一個效果更優於relu的激活函數:

神經網絡激活函數總結:
tanh函數適用於特征相差明顯時的效果會很好,在循環中會不斷擴大特征效果並將其顯示出來。但當特征之間相差比較復雜沒有明顯的區別,或者特征間的相差不是特別大需要細微的分類判斷時,sigmoid函數的效果會更好。relu函數的優勢在於經過處理后的數據具有很好的稀疏性。
keras中自定義激活函數:
from keras import backend as K from keras.models import Sequential,Model from keras.layers import Dense import numpy as np def Swish(x): return x*K.sigmoid(1.0*x) model = Sequential() model.add(Dense(32,activation="relu",input_dim=100)) model.add(Dense(16,activation="relu",name="Dense_1")) model.add(Dense(1, activation=Swish,name="Dense_2"))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy']) #假設訓練和測試使用同一組數據 data = np.random.random((1000, 100)) labels = np.random.randint(2, size=(1000, 1)) model.fit(data,labels,epochs=10,batch_size=32) model.predict(data)
