為什么要引入激活函數?
如果不用激活函數(其實相當於激勵函數是f(x)=x),在這種情況下你每一層輸出都是上層輸入的線性函數,很容易驗證,無論你神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機了。
正因為上面的原因,我們決定引入非線性函數作為激勵函數,這樣深層神經網絡就有意義了(不再是是輸入的線性組合,可以逼近任意函數)。最早的想法是sigmoid函數或者tanh函數,輸出有界,很容易充當下一層輸入。激活函數的作用是為了增加神經網絡模型的非線性。否則你想想,沒有激活函數的每層都相當於矩陣相乘,就算你疊加了若干曾之后,無非還是個矩陣相乘罷了。所以你沒有非線性結構的話,根本就算不上什么神經網絡。

它能夠把輸入的連續實值“壓縮”到0和1之間,特別的,如果是非常大的負數,那么輸出就是0;如果是非常大的正數,輸出就是1.
signoid函數曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因為他的一些缺點:
當輸入非常大或者非常小的時候,這些神經元的梯度是接近於0的,從圖中可以看出梯度的趨勢;
sigmoid的輸出不是0均值,這回導致后一層的神經元將得到上一層輸出的非0均值信號將作為輸入(為什么不能是非0均值的???)
Tanh是Sigmoid的變形,與sigmoid不同的是,tanh是0均值的,因此,實際應用中,tanh會比sigmoid更好。
ReLU函數

從圖中可以看出,輸入負信號時,輸出都是0,非負的情況下,輸出就等於輸入。
解決了gradient vanishing問題(在正區間)
計算速度非常快,只需要判斷輸入是否大於0
收斂速度遠快於sigmoid和tanh
ReLU也有幾個需要特別注意的問題:
1、ReLU的輸出不是0均值的
2、Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生:(1)非常不幸的參數初始化,這種情況比較少見(2)learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以采用Xavier初始化方法,以及避免learning rate設置他打或者使用adagrad等自動調節learning rate的算法
為什么會引入Relu呢?
第一,采用Sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而采用Relu激活函數,整個過程的計算量節省很多。
第二:對於深層網絡,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導致趨於0,這種情況會造成信息丟失,從而無法完成深層網絡的訓練)
第三:ReLU會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關系,緩解了過擬合問題的發生。
當然現在也有一些對ReLU的改進,比如prelu。random relu等,在不同的數據集上會有一些訓練速度上或者准確率上的改進
現在主流的做法,會多做一些batch normalization,盡可能保證每一層網絡的輸入具有相同的分布。而最新的論文中,有加入bypass connection之后,發現改變batch normalization的位置會有更好的效果。
深度學習的基本原理是基於人工神經網絡,信號從一個神經元進入,經過非線性的activation function,傳入到下一層神經元;再經過該層神經元的activate,繼續往下傳遞,如此循環往復,直到輸出層。正是由於這些非線性函數的反復疊加,才使得神經網絡有足夠的capacity來抓取復雜的pattern,在各個領域取得state-of-the-art的結果。顯而易見,activation function在深度學習中非常重要,也是很活躍的研究領域之一。
