搬出神經網絡的萬能近似定理可知,“一個前饋神經網絡如果具有線性輸出層和至少一層具有任何一種‘‘擠壓’’ 性質的激活函數的隱藏層,只要給予網絡足夠數量的隱藏單元,它可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的Borel可測函數。”簡單來說,前饋神經網絡有“夠深的網絡層”以及“至少一層帶激活函數的隱藏層”,既可以擬合任意的函數。

在此激活函數起的作用是實現特征空間的非線性轉換,貼切的來說是,“數值上擠壓,幾何上變形”。如下圖,在帶激活函數的隱藏層作用下,可以對特征空間進行轉換,最終使得數據(紅色和藍色線表示的樣本)線性可分。

而如果網絡沒有激活函數的隱藏層(僅有線性隱藏層),以3層的神經網絡為例,可得第二層輸出為:

對上式中第二層的輸出a^[2]進行化簡計算

可見無論神經網絡有多少層,輸出都是輸入x的線性組合,多層線性神經網絡本質上還是線性模型,而其轉換后的特征空間還是線性不可分的。

如何選擇合適的激活函數?

如果一個函數能提供非線性轉換(即導數不恒為常數),可導(可導是從梯度下降方面考慮。可以有一兩個不可導點, 但不能在一段區間上都不可導)等性質,即可作為激活函數。在不同網絡層(隱藏層、輸出層)的激活函數關注的重點不一樣,隱藏層關注的是計算過程的特性,輸出層關注的輸出個數及數值范圍。

那如何選擇合適的激活函數呢?這是結合不同激活函數的特點的實證過程。

從函數圖像上看,tanh函數像是伸縮過的sigmoid函數然后向下平移了一格,確實就是這樣,因為它們的關系就是線性關系。

對于隱藏層的激活函數,一般來說,tanh函數要比sigmoid函數表現更好一些。

因為tanh函數的取值范圍在[-1,+1]之間,隱藏層的輸出被限定在[-1,+1]之間,可以看成是在0值附近分布,均值為0。這樣從隱藏層到輸出層,數據起到了歸一化(均值為0)的效果。

另外,由于Sigmoid函數的輸出不是零中心的(Zero-centered),該函數的導數為:sigmoid * (1 – sigmoid),如果輸入x都是正數,那么sigmoid的輸出y在[0.5,1]。那么sigmoid的梯度 = [0.5, 1] * (1 – [0.5, 1]) ~= [0, 0.5] 總是 > 0的。假設最后整個神經網絡的輸出是正數,最后 w 的梯度就是正數;反之,假如輸入全是負數,w 的梯度就是負數。這樣的梯度造成的問題就是,優化過程呈現“Z字形”(zig-zag),因為w 要么只能往下走(負數),要么只能往右走(正的),導致優化的效率十分低下。而tanh就沒有這個問題。

對于輸出層的激活函數,因為二分類問題的輸出取值為{0,+1},所以一般會選擇sigmoid作為激活函數。另外,sigmoid天然適合做概率值處理,例如用于LSTM中的門控制。

觀察sigmoid函數和tanh函數,我們發現有這樣一個問題,就是當|z|很大的時候,激活函數的斜率(梯度)很小。在反向傳播的時候,這個梯度將會與整個損失函數關于該神經元輸出的梯度相乘,那么相乘的結果也會接近零,這會導致梯度消失;同樣的,當z落在0附近,梯度是相當大的,梯度相乘就會出現梯度爆炸的問題(一般可以用梯度裁剪即Gradient Clipping來解決梯度爆炸問題)。由于其梯度爆炸、梯度消失的缺點,會使得網絡變的很難進行學習。

為了彌補sigmoid函數和tanh函數的缺陷,就出現了ReLU激活函數。ReLU激活函數求導不涉及浮點運算,所以速度更快。在z大于零時梯度始終為1;在z小于零時梯度始終為0;z等于零時的梯度可以當成1也可以當成0,實際應用中并不影響。對于隱藏層,選擇ReLU作為激活函數,能夠保證z大于零時梯度始終為1,從而提高神經網絡梯度下降算法運算速度。

而當輸入z小于零時,ReLU存在梯度為0的特點,一旦神經元的激活值進入負半區,那么該激活值就不會產生梯度/不會被訓練,雖然減緩了學習速率,但也造成了網絡的稀疏性——稀疏激活,這有助于減少參數的相互依賴,緩解過擬合問題的發生。

對于上述問題,也就有了leaky ReLU,它能夠保證z小于零是梯度不為0,可以改善RELU導致神經元稀疏的問題而提高學習速率。但是缺點也很明顯,因為有了負數的輸出,導致其非線性程度沒有RELU強大,在一些分類任務中效果還沒有Sigmoid好,更不要提ReLU。(此外ReLU還有很多變體RReLU、PReLU、SELU等,可以自行擴展)在一些分類任務中效果還沒有Sigmoid好,更不要提ReLU。(此外ReLU還有很多變體RReLU、PReLU、SELU等,可以自行擴展)

softplus 是 ReLU 的平滑版本,也就是不存在單點不可導。但根據實際經驗來看,并沒什么效果,ReLU的結果是更好的。

swish函數又叫作自門控激活函數,它近期由谷歌的研究者發布,數學公式為:

和 ReLU 一樣,Swish 無上界有下界。與 ReLU 不同的是,Swish 有平滑且非單調的特點。根據論文(https://arxiv.org/abs/1710.05941v1),Swish 激活函數的性能優于 ReLU 函數。

maxout 進一步擴展了 ReLU,它是一個可學習的 k 段函數。它具有如下性質:

1、maxout激活函數并不是一個固定的函數,不像Sigmod、Relu、Tanh等固定的函數方程

2、它是一個可學習的激活函數,因為w參數是學習變化的。

3、它是一個分(k)段線性函數:

# Keras 簡單實現Maxout

# input shape: [n, input_dim]
# output shape: [n, output_dim]
W = init(shape=[k, input_dim, output_dim])
b = zeros(shape=[k, output_dim])
output = K.max(K.dot(x, W) + b, axis=1)
# Keras 簡單實現RBF
from keras.layers import Layer
from keras import backend as K

class RBFLayer(Layer):
def __init__(self, units, gamma, **kwargs):
super(RBFLayer, self).__init__(**kwargs)
self.units = units
self.gamma = K.cast_to_floatx(gamma)

def build(self, input_shape):
self.mu = self.add_weight(name='mu',
shape=(int(input_shape[1]), self.units),
initializer='uniform',
trainable=True)
super(RBFLayer, self).build(input_shape)

def call(self, inputs):
diff = K.expand_dims(inputs) - self.mu
l2 = K.sum(K.pow(diff,2), axis=1)
res = K.exp(-1 * self.gamma * l2)
return res

def compute_output_shape(self, input_shape):
return (input_shape[0], self.units)

# 用法示例:
model = Sequential()
model.add(Dense(20, input_shape=(100,)))
model.add(RBFLayer(10, 0.5))

softmax 函數,也稱歸一化指數函數,常作為網絡的輸出層激活函數,它很自然地輸出表示具有 n個可能值的離散型隨機變量的概率分布。

數學函數式如上,公式引入了指數可以擴大類間的差異。

經驗性的總結

對于是分類任務的輸出層,二分類的輸出層的激活函數常選擇sigmoid函數,多分類選擇softmax;回歸任務根據輸出值確定激活函數或者不使用激活函數;對于隱藏層的激活函數通常會選擇使用ReLU函數,保證學習效率。其實,具體選擇哪個函數作為激活函數沒有一個固定的準確的答案,應該要根據具體實際問題進行驗證(validation)。

文章轉自微信公眾號@算法進階

上一篇:

深度學習視覺研究綜述

下一篇:

神經網絡學習到的是什么?(Python)
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費