1. 程式人生 > 實用技巧 >神經網路基本組成 - 啟用函式層 12

神經網路基本組成 - 啟用函式層 12

神經網路如果僅僅是由線性的卷積運算堆疊組成, 則其無法形成複雜的表達空間, 也就很難提取出高語義的資訊, 因此還需要加入非線性的對映, 又稱為啟用函式, 可以逼近任意的非線性函式, 以提升整個神經網路的表達能力。 在物體檢測任務中, 常用的啟用函式有SigmoidReLUSoftmax函式。

1Sigmoid函式

Sigmoid型函式又稱為Logistic函式, 模擬了生物的神經元特性, 即當神經元獲得的輸入訊號累計超過一定的閾值後, 神經元被啟用而處於興奮狀態, 否則處於抑制狀態。 其函式表達如式(3-1) 所示。

Sigmoid函式曲線與梯度曲線如圖3.4所示。 可以看到, Sigmoid函式將特徵壓縮到了(0,1)區間, 0端對應抑制狀態, 而1對應啟用狀態, 中間部分梯度較大。

PyTorch實現Sigmoid函式很簡單, 示例如下:

PyTorch實現Sigmoid函式很簡單, 示例如下:

 1 import torch
 2 from torch import nn
 3 
 4 input = torch.ones(1, 1, 2, 2)
 5 print(input)
 6 
 7 sigmoid = nn.Sigmoid()
 8 out = sigmoid(input)
 9 
10 print(out)
View Code

Sigmoid函式可以用來做二分類, 但其計算量較大, 並且容易出現梯度消失現象。 從曲線圖(圖3.4) 中可以看出, 在Sigmoid函式兩側的特徵導數接近於0, 這將導致在梯度反傳時損失的誤差難以傳遞到前面的網路層(因為根據鏈式求導, 梯度接近於0) 。

2. ReLU函式

為了緩解梯度消失現象, 修正線性單元(Rectified Linear UnitReLU) 被引入到神經網路中。 由於其優越的效能與簡單優雅的實現, ReLU已經成為目前卷積神經網路中最為常用的啟用函式之一。 ReLU
數的表示式如式(3-2) 所示。

ReLU函式及其梯度曲線如圖3.5所示。 可以看出, 在小於0的部分,值與梯度皆為0, 而在大於0的部分中導數保持為1, 避免了Sigmoid函式中梯度接近於0導致的梯度消失問題。

下面是PyTorch實現ReLU啟用函式示例。

 1 from torch import nn
 2 
 3 input = torch.ones(1, 1, 2, 2)
4 print(input) 5 >> tensor([[[[1., 1.], 6 [1., 1.]]]]) 7 8 # nn.ReLU()可以實現inplace操作, 即可以直接將運算結果覆蓋到輸入中, 以節省記憶體 9 relu = nn.ReLU(inplace=True) 10 print(relu(input)) 11 # # 可以看出大於0的值保持不變, 小於0的值被置為0 12 >> tensor([[[[1., 1.], 13 [1., 1.]]]])
View Code

ReLU函式計算簡單, 收斂快, 並在眾多卷積網路中驗證了其有效性。