PyTorch學習筆記(20) ——激活函數

0. 前言

本博客內容翻譯自紐約大學數據科學中心在2020發佈的《Deep Learning》課程的Activation Functions and Loss Functions部分.

廢話不多說,下面直接開始吧 ^ . ^

1. 激活函數

本內容將回顧一些重要的激活函數以及其在PyTorch中的實現,它們來自各種各樣的論文,並在一些任務上有着優異的表現~

  • ReLU torch.nn.ReLU()
    在這裏插入圖片描述

ReLU的函數圖示如下:
在這裏插入圖片描述

  • RReLU torch.nn.RReLU()

ReLU有很多變種, RReLU是Random ReLU的意思,定義如下:
在這裏插入圖片描述
對RReLU而言, a 是一個在給定範圍內的隨機變量(訓練), 在推理時保持不變。同LeakyReLU不同的是,RReLU的a是可以learnable的參數,而LeakyReLU的a是固定的。
在這裏插入圖片描述

  • LeakyReLU torch.nn.LeakyReLU()

在這裏插入圖片描述在這裏插入圖片描述

這裏a是固定值,LeakyReLU的目的是爲了避免激活函數不處理負值(小於0的部分梯度爲0),通過使用negative slope,其使得網絡可以在傳遞負值部分的梯度,讓網絡可以學習更多的信息,在一些應用中確實有較大的益處。

  • PReLU torch.nn.PReLU()
    在這裏插入圖片描述
    不同於RReLU的a可以是隨機的,PReLU中的a就是一個learnable的參數。
    在這裏插入圖片描述
    需要注意的是: 上述激活函數(即ReLU、LeakyReLU、PReLU)是 尺度不變(scale-invariant) 的。

  • Softplus torch.nn.Softplus()

Sofrplus作爲損失函數在StyleGAN1和2中都得到了使用,下面分別是其表達式和圖解。
在這裏插入圖片描述
在這裏插入圖片描述
Softplus 是ReLU的光滑近似,可以有效的對輸出都爲正值的網絡進行約束。

隨着β\beta的增加,Softplus與ReLU越來越接近。

  • ELU torch.nn.ELU()
    在這裏插入圖片描述
    在這裏插入圖片描述
    ELU不同於ReLU的點是,它可以輸出小於0的值,使得系統的平均輸出爲0. 因此,ELU會使得模型收斂的更加快速,其變種(CELU, SELU)只是不同參數組合ELU。

  • CELU torch.nn.CELU()

跟ELU相比,CELU是將ELU中的exp(x)exp(x)變爲exp(x/α)exp(x/\alpha).
在這裏插入圖片描述
在這裏插入圖片描述

  • SELU torch.nn.SELU()

跟ELU相比,SELU是將ELU乘上了一個scale變量。
在這裏插入圖片描述
在這裏插入圖片描述

  • GELU torch.nn.GELU()

在這裏插入圖片描述

其中, Φ(x)\Phi(x)高斯分佈的累積分佈函數 (Cumulative Distribution Function for Gaussian Distribution).

在這裏插入圖片描述

  • ReLU6 torch.nn.ReLU6()

在這裏插入圖片描述
在這裏插入圖片描述
ReLU6是在ReLU的基礎上,限制正值的上限爲6. one-stage的目標檢測網絡SSD中用到這個激活函數啦~

  • Sigmoid torch.nn.Sigmoid()

Sigmoid是將數據限制在0到1之間。而且,由於Sigmoid的最大的梯度爲0.25,隨着使用sigmoid的層越來越多,網絡就變得很難收斂啦~

因此,對深度學習,ReLU及其變種被廣泛使用來避免收斂困難的問題。
在這裏插入圖片描述
在這裏插入圖片描述

  • Tanh torch.nn.Tanh()

Tanh就是雙曲正切,其輸出的數值範圍爲-1到1. 其計算可以由三角函數計算,也可以由如下的表達式來得出:
在這裏插入圖片描述
在這裏插入圖片描述
Tanh除了居中(-1到1)外,基本上與Sigmoid相同。這個函數的輸出的均值大約爲0。因此,模型收斂速度更快。注意,如果每個輸入變量的平均值接近於0,那麼收斂速度通常會更快,原理同Batch Norm。

  • Softsign torch.nn.Softsign()
    在這裏插入圖片描述
    在這裏插入圖片描述
    同Sigmoid有點類似,但是它比Sigmoid達到漸進線(asymptot n. [數] 漸近線)的速度更慢,有效的緩解了梯度消失的問題(gradient vanishing problem (to some extent).)。

  • Hardtanh torch.nn.Hardtanh()

如下圖所示,Hardtanh就是1個線性分段函數[-1, 1],但是用戶可以調整下限min_val和上限max_val,使其範圍擴大/縮小。
在這裏插入圖片描述
在這裏插入圖片描述
當權值保持在較小的範圍內時,Hardtanh的工作效果出奇的好。

  • Threshold torch.nn.Threshold()

在這裏插入圖片描述
這種Threshold的方式現在很少使用,因爲網絡將不能傳播梯度回來。這也是在60年代和70年代阻止人們使用反向傳播的原因,因爲當時的科研人員主要使用的是Binary的神經元,即輸出只有0和1,脈衝信號。

  • Tanhshrink torch.nn.Tanhshrink()
    在這裏插入圖片描述
    在這裏插入圖片描述
    除了稀疏編碼外,很少使用它來計算潛在變量(latent variable)的值。

  • Softshrink torch.nn.Softshrink()
    在這裏插入圖片描述
    在這裏插入圖片描述
    這種方式目前也不怎麼常用,其目的是通過設置λ\lambda,將靠近0的值直接強制歸0,由於這種方式對小於0的部分沒有約束,所以效果不太好~

  • Hardshrink torch.nn.Hardshrink()
    在這裏插入圖片描述
    在這裏插入圖片描述
    同Softshrink類似,除了稀疏編碼以外,很少被使用。

  • LogSigmoid torch.nn.LogSigmoid()

LogSigmoid是在Sigmoid基礎上,wrap了一個對數函數。
在這裏插入圖片描述
在這裏插入圖片描述
這種方式用作損失函數比較多,而幾乎沒人用它來做激活函數。

  • Softmin torch.nn.Softmin()
    在這裏插入圖片描述
    將數字變成概率分佈,類似Softmax。

  • Softmax torch.nn.Softmax()
    在這裏插入圖片描述

  • LogSoftmax torch.nn.LogSoftmax()
    在這裏插入圖片描述
    同LogSigmoid類似,LogSoftmax用作損失函數比較多,而幾乎沒人用它來做激活函數。

2. Q&A

① 對PReLU, RReLU這種變種來說,a是可學習或者固定的,有什麼差別呢?

答: 固定a表示對負值區域,激活函數依然可以傳遞給網絡固定的梯度。而讓a是1個可學習的參數,意味着系統的非線性轉換爲線性映射。這可能對一些應用很有幫助: 比如實現一個不考慮邊緣極性(regardless of the edge polarity)的邊緣檢測器

② 想要的non-linearity的程度?

答: 理論上,我們可以將整個非線性函數以非常複雜的方式進行參數化: 如切比雪夫多項式ChebyShev等。參數化可以視爲學習過程的一部分。在某種程度上,複雜程度取決於ChebyShev展開式的項數。

③ 與系統中有更多的單元相比,參數化的優點是什麼?

答: 這主要取決於任務類型, 當你在做低維空間的迴歸任務時,參數化可能有用。但是,當你想要做類似image recognition這種高維空間的任務時,單調非線性的效果會更好。

簡而言之,你可以參數任何你想要參數化的方程,但是這可能並不會帶來很大收益,甚至有反效果。

④ 1 kink vs 2 kink

答: double kink (2 kink)表示當你放大輸入爲原來的2倍,那麼你的輸出將會與之前完全不同(不是原來的輸出的2倍的關係)。這意味着網絡具有很大的非線性。

而 one kink意味着輸入你放大輸入爲原來的2倍,那麼你的輸出也會是原來的2倍,即非線性沒有double kink那麼強。

⑤ 帶kinks和帶光滑非線性的激活函數,哪個更好?

答: 這與規模等變有關。如果帶有hard kinks,這意味着當你對輸入數據乘以2,那麼你得到的輸出應該也會等比放大2倍。而如果你有個光滑的變換過程(通過激活函數賦予),當你對輸入乘以100,那麼你的輸出看起來會有個hard kink,這是因爲平滑的部分縮小了100倍。

而當你對輸入除以100,那麼kink就變得非常光滑了。因此,通過對輸入的scale進行縮小或者放大,你可以修正激活單元的行爲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章