1. Sigmod 函數
Sigmoid 函數是應用最廣泛的非線性激活函數之一,它可以將值轉換為 $0$ 和 $1$ 之間,如果原來的輸出具有這樣的特點:值越大,歸為某類的可能性越大,
那么經過 Sigmod 函數處理的輸出就可以代表屬於某一類別的概率。其數學表達式為:
$$y = \frac{1}{1 + e^{-x}} = \frac{e^{x}}{1 + e^{x}}$$
$$y^{'} = y(1 - y)$$

import torch S = torch.nn.Sigmoid() # 這是一個類。需要初始化后才能使用。 x = torch.randn(2) y = S(x) # 元素層面的操作 print(y) """ tensor([0.6922, 0.2307]) """
從數學上來看,非線性的 $Sigmoid$ 函數對中央區的信號增益較大,對兩側區的信號增益小,在信號的特征空間映射上,有很好的效果。
從神經科學上來看,中央區酷似神經元的興奮態,兩側區酷似神經元的抑制態,因而在神經網絡學習方面,可以將重點特征推向中央區,
將非重點特征推向兩側區。無論是哪種解釋,看起來都比早期的線性激活函數, 階躍激活函數高明了不少。
2. Relu 函數
Relu 函數是分段線性函數,把所有的負值都變為 $0$,而正值不變,這種操作稱為單側抑制。Relu 函數定義很簡單:
$$y = \left\{\begin{matrix}
x, & x \geq 0 \\
0, & x < 0
\end{matrix}\right.$$
其函數圖像和導數圖像分別為:

使用這個函數作為激活函數有如下幾個特點:
1)更加符合生物學特性:相關大腦方面的研究表明生物神經元的信息編碼通常是比較分散及稀疏的。通常情況下,大腦中在同一時間大概只
有 1%-4% 的神經元處於活躍狀態,也就是說根本用不到全部的神經元。這個函數由於小於 $0$ 部分為 $0$,大於 $0$ 部分才有值,意味着,輸
入不同的樣本將會激活不同的神經元,每次訓練只會涉及到部分權重,不需要更新整個網絡參數,一定程度上也避免了過擬合。
2)當數值過大或者過小,$sigmoid$ 函數的導數接近於 $0$,而它的導數又是鏈式求導的一部分,因而可能導致梯度趨於 $0$,而 $relu$ 是非飽和
激活函數,不存在這種現象,避免了梯度消失問題。
3)導數很好求,加快反向傳播過程。
import torch m = torch.nn.ReLU() input = torch.randn(2) output = m(input)
3. Tanh 函數
tanh 是雙曲函數中的一個,tanh() 為雙曲正切。
$$\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$$
它的導數為
$$\begin{align*}
\tanh^{'}(x) &= \left ((e^x-e^{-x})(e^x+e^{-x})^{-1} \right )^{'} \\
&=(e^x+e^{-x})(e^x+e^{-x})^{-1}-(e^x-e^{-x})(e^x+e^{-x})^{-2}(e^x-e^{-x})\\
&=1-\frac{(e^x-e^{-x})^{2}}{(e^x+e^{-x})^{2}}\\
&=1-\tanh^2(x)
\end{align*}$$
其函數圖像和導數圖像分別為:

使用這個函數作為激活函數有如下幾個特點:
1)tanh 類似於幅度增大 sigmoid,將輸入值轉換為 -1 至 1 之間。tanh 的導數取值范圍在 0 至 1 之間,優於 sigmoid 的 0 至 1/4,在一定程度上,
減輕了梯度消失的問題。
2)tanh 是 0 均值的,在實際應用中 tanh 會比 sigmoid 更好。
import torch m = torch.nn.Tanh() input = torch.randn(2) output = m(input)
