神经网络-激活函数
上一篇講了一下多層前饋神經網絡的結構,這一篇我們來具體講一講里面的激活函數。
對于一個神經元,先計算輸入向量和權重向量的內積,加上偏置項,再送入一個函數進行變化。這個函數就是激活函數。在神經網絡的結構里,除了輸入層的神經元不需要激活函數,后面的若干層隱藏層和輸出層的神經元都需要激活函數。
為什么需要激活函數
因為如果不使用激活函數函數,整個神經網絡其實還是一個線性模型,并不能解決非線性問題。假如,現在有一個四層的神經網絡,第一層為輸入向量x,第一層至第二層的權重向量為?,偏置項為;第二層至第三層的權重向量為,偏置項為; 第三層至第四層的的權重向量分別為,偏置項為?。
第二層輸出結果 :
第三層輸出結果:
第四層輸出結果:
我們可以看到最后的結果還是一個線性函數:
?
給每一個神經元加上一個非線性的激活函數以后,結果就會變為非線性 。
作為激活函數需要哪些條件:
接著我們來看一下由激活函數導致的一個問題,梯度消失。神經網絡其實很早就已經出現了,但是在一段時間后就沒落了。主要就是因為梯度消失,會影響模型的訓練。
梯度消失
在之前我們說過在訓練神經網絡的時候會用到反向傳播算法結合梯度下降來更新神經網絡每一層的參數。每一層的梯度計算公式為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????
我們可以看到每次都要計算激活函數的導數,如果激活函數的導數是一個小于1的數,的值在反向傳播的過程中就會越變越小,這樣就會導致在反向傳播的過程中梯度消失,影響神經網絡的訓練。
飽和性
激活函數的飽和性會對梯度消失產生影響。飽和性又分為硬飽和,軟飽和。
軟飽和可以定義為:
? ? ? ? ? ? ? ? ? ? ? ? ?
與極限的定義類似,飽和也分為左飽和和有飽和。
軟飽和左飽和:
? ? ? ? ? ? ? ?
軟飽和右飽和:
? ? ? ? ? ? ? ? ??
硬飽和可以定義為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? f'(x)=0,當 |x| > c,其中 c 為常數
同理,硬飽和也可以分為左飽和和又飽和。
常用的激活函數
1、sigmoid函數:
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ??
? ? ?sigmoid函數導數:
? ? ? ? ? ? ? ? ? ? ? ? ??
sigmoid函數適合需要0~1的場合,比如概率,適合作為輸出層。因為它的值域在0到1之間。sigmoid函數在特征相差比較復復雜或是相差不是特別大時,需要更細微的分類判斷的時候,效果會好一些。因為sigmoid函數具有軟飽和性,它的導數的最大值為0.25,所以在神經網絡的層數很深的情況下,就容易參數梯度消失。
2、tanh函數
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??, tanh函數和sigmoid函數之間的關系
? ? tanh函數導數?
? ? ? ? ? ? ? ? ? ? ? ??
tanh函數適合需要-1~1的場合,因為它的值域在-1到1之間。tanh函數也具有軟飽和性,它導數的最大值為1,相比于sigmoid函數能夠緩解一點梯度消失。因為 tanh 的輸出均值比 sigmoid 更接近 0,SGD會更接近 natural gradient(一種二次優化技術),從而降低所需的迭代次數。tanh函數在特征相差明顯時的效果會很好。需要注意的是,使用sigmoid和tanh作為激活函數的話,一定要注意對輸入層進行歸一化,否則激活后的值都會進入平坦區,使隱含層的輸出全部趨同。但是下面的ReLU并不需要輸入歸一化來防止它們達到飽和。
3、ReLU函數
? ? ? ? ? ? ? ? ? ? ? ? ??
?
? ? ?ReLU函數導數?
? ? ? ? ? ? ? ? ? ? ? ? ??
ReLU函數為左側硬飽和激活函數。但是,相比于之前兩個函數,能夠更好的緩解梯度消失問題。但是會產生一個ReLU壞死的情況。
4、Leaky ReLU?
? ? ? ? ? ? ? ? ? ? ? ? ??, 參數并不固定為0.01
? ?
?Leaky ReLU導數
? ? ? ? ? ? ? ? ? ? ? ??
Leaky ReLU在ReLU的基礎之上做了一個小小的改動,當x<0時,f(x)的值不為0,而是一個小于1的系數乘以x。這樣可以防止dead神經元。
除了通過改變激活函數來緩解梯度消失,也有其他緩解梯度消失的方法。例如:DBN中的分層預訓練,Batch Normalization的逐層歸一化,Xavier和MSRA權重初始化等代表性技術。
參考鏈接:https://docs.deepin.io/?p=753?
? ? ? ? ? ? ? ? ??https://zhuanlan.zhihu.com/p/22142013
? ? ? ? ? ? ? ? ? Amari, S.-I., Natural gradient works efficiently in learning. Neural computation, 1998. 10(2): p. 251-276.
總結
 
                            
                        - 上一篇: 如何用python计算函数的值域_(Ma
- 下一篇: 初识托福TOEFL口语
