深度學習那些事 — 啟用函式
這篇文章介紹啟用函式,之所以將啟用函式單獨拿出來進行介紹,因為多層感知機在剛開始發展的時候,梯度會消失,所以它梯度不會太深,訓練不了太深的引數,其實最核心的問題就是啟用函式,結合反向求導那篇文章求導的過程,我們提出兩個問題,帶著這兩個問題往下看。
有的啟用函式為什麼導致那個引數無法收斂?
梯度為什麼會消失?
啟用函式特徵
非線性:當啟用函式是非線性的時候,一個兩層的神經網路就可以逼近基本上所有的函數了。如果 MLP不適用啟用函式,那麼深層網路跟單層神經網路是等價的。
可微性:當優化方法是基於梯度的時候,這個性質是必須的。
單調性:當啟用函式是單調的時候,單層網路能夠保證是凸函式。
從啟用函式特徵我們可以知道,啟用函式一定要是非線性的,如果是線性的,就相當於一層非常厚的線性模型,就是因為非線性,才能讓神經網路得到更復雜的模型。如果啟用函式不可微就沒法求它的導數。單調的時候才能保證這個函式式凸函式,凸函式只有一個最優解。
前面是啟用函式必須要有的特性,現在看看不同的啟用函式都有什麼特性呢?
如果輸出結果是有限的,梯度優化更加穩定,不會出現極端的情況。當輸出結果是無限的模型會更加高效,隨之帶來的結果是不穩定的,一般需要把學習速率設定更小一點。學習速率太大了容易激進,太小了得不到收斂。
01
Sigmoid 啟用函式
下圖藍色曲線就是啟用函式的曲線,黃色的是啟用函式導數曲線,導數的值域在0-0.25之間,就驗證之前說過的,輸出是有限的收斂能穩定。所以要初始化要小心。不管輸入範圍多少,輸出範圍一直是0-1之間。
02
Sigmoid 啟用函式
下圖黃色是啟用函式,藍色是函式本身,都是受限制的,只不過範圍不一樣。
前面介紹的兩個存在梯度消失,下面介紹的這個不會,但是神經元容易死掉。
03
Relu 啟用函式
如果小於0,不被啟用,大於0的話,啟用結果是輸入和輸出是一樣的。這個 正好類似f(x)約等於x,輸出不受限制。
反向傳播演算法-核心思想
為什麼啟用函式決定了梯度會不會消失?決定了神經元會不會死掉?
請看下圖中公式:前部分算的是誤差值(這裡由兩部分組成,其中一個啟用函式的導數),後部分算的是下層節點具體的值,前面的誤差乘一個小於1的數,算出來的值只能越來越小,也就是從上層往下層傳遞的時候,乘了好幾次小於1的值,誤差會越來越小,只要層數越深,最後導致求下層邊的權重的時候這個權重幾乎等於0了,最後導數消失,就是梯度消失。
梯度消失導致的結果是什麼?
看上圖中更新引數,舊的引數是黃色的,減去導數值乘上學習速率,如果導數值小,相當於每次沒有減,這就導致梯度消失導致權重無法更新問題,權重沒有辦法更新,這個模型就學不下去,所以說以前多層感知機三層就很多了,再多的話下面就學不好,學不好就導致整個模型非常差。
下面這個是sig()啟用函式:
下面是Relu啟用函式:
Relu啟用函式導數等於1,hi也可以大於1,所以就解決了梯度消失問題,雖然解決了梯度消失問題,Relu啟用函式不設上限,神經元容易死掉。
為什麼神經元容易死掉?
hi這個值,假設前饋的時候hi非常大,通過啟用函式之後也是很大,那導數也就非常大,如果用非常大的導數更新的時候,會導致 變成負數,那下次,新的引數值來了,負數給了這個啟用函式,啟用函式不會被啟用,前饋計算的時候這個節點也是0,反向傳播的時候沒有被啟用的節點的導數是0,也就是說這個節點死掉,以後也不會參與之後的過程。
小結
啟用函式是梯度消失的根本原因。
Relu可以解決梯度消失問題,但會導致網路變得脆弱。
現在也有好多變種,既可以不讓梯度消失,也不會把神經元變得脆弱。