sigmoid和tanh是“飽和激活函數”,而ReLU及其變體則是“非飽和激活函數”。使用“非飽和激活函數”的優勢在於兩點:(1)“非飽和激活函數”能解決所謂的“梯度消失”問題。(2)能加快收斂速度。
sigmoid將實值輸出壓縮在[0,1]范圍內;tanh函數將實值輸出壓縮在[-1, 1]的范圍。
sigmoid函數在歷史上曾非常常用,輸出值范圍為[0, 1]之間的實數。但是現在它已經不太受歡迎了,實際中很少使用。原因如下:
(1)sigmoid函數飽和使梯度消失(sigmoidsaturate and kill gradients)。我們從導函數中可以看出sigmoid的導數都是小於0.25的,那么在進行反響傳播的時候,梯度相乘結果會慢慢的趨近於0。這樣,幾乎就沒有梯度信號通過神經元傳遞到前面層的梯度更新中,因此這時前面層的權值幾乎沒有更新,這就叫梯度消失。除此之外,為了防止飽和,必須對於權重矩陣的初始化特別留意。如果初始化權重過大,可能很多神經元得到一個比較小的梯度,致使神經元不能很好的更新權重提前飽和,神經網絡就幾乎不學習。
(2)sigmoid函數輸出不是“零中心”(zero-centered)。一個多層的sigmoid神經網絡,如果你的輸入x都是正數,那么在反向傳播中w的梯度傳播到網絡的某一處時,權值的變化要么全正要么全負。當梯度從上層傳播下來,w的梯度都是用x乘以f的梯度,因此如果神經元輸出的梯度是正的,那么所有w的梯度就會是正的,反之依然。這就造成你的w只能往同一個方向走,模型擬合的過程就會十分緩慢。
(3)指數函數的計算是比較消耗計算資源的。
tanh函數
tanh函數跟sigmoid外形上是很像的,實際上,tanh是sigmoid的變形,
tanh與sigmoid不同的是,tanh是“零為中心”的。因此,在實際應用中,tanh會比sigmoid更好一些。但是在飽和神經元的情況下,tanh還是沒有解決梯度消失問題。
優點:(1)tanh解決了sigmoid的輸出非“零中心”的問題
缺點:(1)依然有sigmoid函數過飽和的問題。(2)依然進行的是指數運算。
ReLU
近年來,ReLU函數變得越來越受歡迎。全稱是Rectified Linear Unit,中文名是:修正線性單元。
優點:(1)ReLU解決了梯度消失的問題,至少x在正區間內,神經元不會飽和;
(2)由於ReLU線性、非飽和的形式,在SGD中能夠快速收斂;
(3)計算速度要快很多。ReLU函數只有線性關系,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。
缺點:(1)ReLU的輸出不是“零中心”;
(2)隨着訓練的進行,可能會出現神經元死亡,權重無法更新的情況。這種神經元的死亡是不可逆轉的死亡。
總結:訓練神經網絡的時候,一旦學習率沒有設置好,第一次更新權重的時候,輸入的是負值,那么這個含有ReLU的神經節點就會死亡,再也不會被激活。在實際訓練中,如果學習率設置的太高,可能會發現網絡中40%的神經元都會死掉,且在整個訓練集中這些神經元都不會被激活。所以,設置一個合適的較小的學習率會降低這種情況的發生。所以必須設置一個合理的學習率。為了解決神經元節點死亡的情況,有人提出了Leaky ReLU、P-ReLU、R-ReLU、ELU等激活函數。
引出的問題:神經網絡中ReLU是線性還是非線性函數?為什么ReLU這種“看似線性”的激活函數所形成的網絡,居然能夠增加非線性的表達能力?
(1)ReLU是非線性激活函數。
線性網絡:如果把線性網絡看成一個大的矩陣M。那么輸入樣本A和B,則會經過同樣的線性變換MA,MB(這里A和B經歷的線性變換矩陣M是一樣的)
(2)的確對於單一的樣本A,經過由ReLU激活函數所構成神經網絡,其過程確實可以等價是經過了一個線性變換M1,但是對於樣本B,在經過同樣的網絡時,由於每個神經元是否激活(0或者Wx+b)與樣本A經過時情形不同了,因此B所經歷的線性變換M2並不等於M1。因此,ReLU構成的神經網絡雖然對每個樣本都是線性變換,但是不同樣本之間所經歷的線性變換M並不一樣,所以整個樣本空間在經過ReLU構成的網絡時其實是經歷了非線性變換的。
參考:https://blog.csdn.net/qq_42422981/article/details/89561955