淺談神經網絡中的激活函數
- 2019 年 10 月 3 日
- 筆記
激活函數是神經網絡中一個重要的環節,本文將介紹為什麼神經網絡網絡要利用激活函數,幾種常用的激活函數(邏輯函數Sigmoid、雙曲正切函數tanh、線性整流函數(ReLU),神經網絡中的梯度消失問題和ReLU如何避免梯度消失。
1 用激活函數的原因
如果神經網絡沒有進行可以提取非線性特徵的卷積操作,而且該神經網絡也不用激活函數,那麼這個神經網絡第i層輸出只有Wxi+b。這樣此神經網絡不論有多少層,第i層的輸出都是一個關於第i層輸入xi的線性組合,相當於此時多層神經網絡退化為一個多層的線性回歸模型,難以學習如圖像、音頻、文本等複雜數據的特徵。
正因為這個原因,神經網絡要引入激活函數來給神經網絡增加一些非線性的特性,所以目前常見的激活函數大多是非線性函數。這樣神經網絡中下一層得到的輸入不再是線性組合了。
2 常見的激活函數
2.1 邏輯函數Sigmoid [1]
邏輯函數(logistic function)或邏輯曲線(logistic curve)是一種常見的S函數,它是皮埃爾·弗朗索瓦·韋呂勒在1844或1845年在研究它與人口增長的關係時命名的。
一個簡單的Logistic函數表達式為:
[ fleft( x right) = frac{1}{{1 + {e^{ – x}}}} ]

圖1 標準邏輯函數的圖像
邏輯函數形如S,所以通常也叫做S形函數。
從函數圖像易知f(x)的定義域為[-∞, +∞], 值域是(0,1)
對f(x)求導數,易得
[f'left( x right) = {left( {frac{1}{{1 + {e^{ – x}}}}} right)^prime } = frac{{{e^{ – x}}}}{{{{left( {1 + {e^{ – x}}} right)}^2}}};; = fleft( x right)left( {1 – fleft( x right)} right)]
2.2 雙曲正切函數tanh [2]
雙曲正切函數是雙曲函數的一種。在數學中,雙曲函數是一類與常見的三角函數類似的函數。雙曲正切函數的定義為
[fleft( x right) = tanh left( x right) = frac{{{e^x} – {e^{ – x}}}}{{{e^x} + {e^{ – x}}}}]

圖2 雙曲正切函數的圖像(同邏輯函數類似)
從函數圖像易知f(x)的定義域為[-∞, +∞], 值域是(-1,1)
對f(x)求導數,易得
[f'left( x right) = {left( {frac{{{e^x} – {e^{ – x}}}}{{{e^x} + {e^{ – x}}}}} right)^prime } = frac{4}{{{{left( {{e^x} + {e^{ – x}}} right)}^2}}};; = 1 – f{left( x right)^2}]
2.3 線性整流函數ReLU [3]
線性整流函數(Rectified Linear Unit, ReLU),又稱修正線性單元, 是一種人工神經網絡中常用的激活函數,通常指代以斜坡函數及其變種為代表的非線性函數。
通常意義下,線性整流函數指代數學中的斜坡函數,即
[fleft( x right) = left{ begin{array}{l} xquad quad x ge 0 \ 0quad quad x < 0 \ end{array} right.]

圖3 ReLU函數圖像
從函數圖像易知f(x)的定義域為[-∞, +∞], 值域是[0, +∞)
對f(x)求導數,易得
[f'left( x right) = left{ begin{array}{l} 1quad quad x ge 0 \ 0quad quad x < 0 \ end{array} right.]
3 梯度消失問題和ReLU如何處理此問題
使用S形函數作為激活的神經網絡中,隨着神經網絡的層數增加,神經網絡後面層在梯度下降中求導的梯度幾乎為0,從而導致神經網絡網絡後面層的權值矩陣幾乎無法更新。表現為隨着隱藏層數目的增加,分類準確率反而下降了。這種現象叫做消失的梯度問題。
假設神經網絡只有三層,用S型函數作為激活函數
第一層輸入為x, 輸出為S(W1x+b1)
第二層輸入為S(W1x+b1),輸出為S(W2S(W1x+b1)+b2)
第三層輸入為S(W2S(W1x+b1)+b2),輸出為S(W3S(W2S(W1x+b1)+b2)+b3)
同時簡記住每層在激活函數處理前的值為ai, 輸出為fi
假設最後損失函數為L,L是一個關於f3的函數,那麼求導易得
[begin{array}{l} frac{{partial L}}{{partial {W_1}}} = frac{{partial L}}{{partial {f_3}}} cdot frac{{partial Sleft( {{W_3}Sleft( {{W_2}Sleft( {{W_1}x + {b_1}} right) + {b_2}} right) + {b_3}} right)}}{{partial {W_1}}} \ quad quad = frac{{partial L}}{{partial {f_3}}} cdot frac{{partial S}}{{partial {a_3}}} cdot frac{{partial {W_3}Sleft( {{W_2}Sleft( {{W_1}x + {b_1}} right) + {b_2}} right) + {b_3}}}{{partial {W_1}}} \ quad quad = frac{{partial L}}{{partial {f_3}}} cdot frac{{partial S}}{{partial {a_3}}} cdot {W_3} cdot frac{{partial Sleft( {{W_2}Sleft( {{W_1}x + {b_1}} right) + {b_2}} right)}}{{partial {W_1}}} \ quad quad = cdots \ quad quad = frac{{partial L}}{{partial {f_3}}} cdot frac{{partial S}}{{partial {a_3}}} cdot {W_3} cdot frac{{partial S}}{{partial {a_2}}} cdot {W_2} cdot frac{{partial S}}{{partial {a_1}}} cdot frac{{partial {a_1}}}{{partial {W_1}}} \ end{array}]
其中偏導數∂S/ ∂ai是造成梯度消失的原因,因為S函數的導數閾值為
[f'left( x right) = frac{{{e^{ – x}}}}{{{{left( {1 + {e^{ – x}}} right)}^2}}};; in left( {0,left. {frac{1}{4}} right]} right.]
即有0<∂S/ ∂a1≤0.25, 0<∂S/ ∂a2≤0.25, 0<∂S/ ∂3≤0.25, 在損失函數偏導表達式中三個偏導數相乘有:
[0 < frac{{partial S}}{{partial {a_3}}}frac{{partial S}}{{partial {a_2}}}frac{{partial S}}{{partial {a_1}}} le 0.015625]
這樣會減小損失函數的數值,如果神經網絡是20層,則有
[0 < frac{{partial S}}{{partial {a_{20}}}}frac{{partial S}}{{partial {a_{19}}}} cdots frac{{partial S}}{{partial {a_1}}} le {0.25^{20}} = {rm{9}}.0{rm{94}} times {10^{ – 13}}]
這是一個更小的數,所以神經網絡後幾層求第一層參數W1的梯度就非常小。而ReLU函數就是為了避免梯度消失問題,因為ReLU求導只有兩個值1或0,這樣的話只要神經網絡梯度中一條路徑上的導數都是1,那麼無論網絡有多少層,網絡後幾層的梯度都可以傳播到網絡前幾層。
參考資料
- https://en.wikipedia.org/wiki/Logistic_function
- https://en.wikipedia.org/wiki/Hyperbolic_function
- https://en.wikipedia.org/wiki/Rectifier_(neural_networks)