天天看點

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

0. 前言

本部落格内容翻譯自紐約大學資料科學中心在2020釋出的《Deep Learning》課程的Activation Functions and Loss Functions部分.

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

1. 激活函數

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

  • ReLU

    torch.nn.ReLU()

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

ReLU的函數圖示如下:

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

    torch.nn.RReLU()

ReLU有很多變種, RReLU是Random ReLU的意思,定義如下:

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

對RReLU而言, a 是一個在給定範圍内的随機變量(訓練), 在推理時保持不變。同LeakyReLU不同的是,RReLU的a是可以learnable的參數,而LeakyReLU的a是固定的。

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

    torch.nn.LeakyReLU()

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

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

  • PReLU

    torch.nn.PReLU()

    PyTorch學習筆記(20) ——激活函數
    不同于RReLU的a可以是随機的,PReLU中的a就是一個learnable的參數。
    PyTorch學習筆記(20) ——激活函數
    需要注意的是: 上述激活函數(即ReLU、LeakyReLU、PReLU)是 尺度不變(scale-invariant) 的。
  • Softplus

    torch.nn.Softplus()

Sofrplus作為損失函數在StyleGAN1和2中都得到了使用,下面分别是其表達式和圖解。

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

Softplus 是ReLU的光滑近似,可以有效的對輸出都為正值的網絡進行限制。

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

  • ELU

    torch.nn.ELU()

    PyTorch學習筆記(20) ——激活函數
    PyTorch學習筆記(20) ——激活函數
    ELU不同于ReLU的點是,它可以輸出小于0的值,使得系統的平均輸出為0. 是以,ELU會使得模型收斂的更加快速,其變種(CELU, SELU)隻是不同參數組合ELU。
  • CELU

    torch.nn.CELU()

跟ELU相比,CELU是将ELU中的 e x p ( x ) exp(x) exp(x)變為 e x p ( x / α ) exp(x/\alpha) exp(x/α).

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

    torch.nn.SELU()

跟ELU相比,SELU是将ELU乘上了一個scale變量。

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

    torch.nn.GELU()

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

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

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

    torch.nn.ReLU6()

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

ReLU6是在ReLU的基礎上,限制正值的上限為6. one-stage的目标檢測網絡SSD中用到這個激活函數啦~

  • Sigmoid

    torch.nn.Sigmoid()

Sigmoid是将資料限制在0到1之間。而且,由于Sigmoid的最大的梯度為0.25,随着使用sigmoid的層越來越多,網絡就變得很難收斂啦~

是以,對深度學習,ReLU及其變種被廣泛使用來避免收斂困難的問題。

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

    torch.nn.Tanh()

Tanh就是雙曲正切,其輸出的數值範圍為-1到1. 其計算可以由三角函數計算,也可以由如下的表達式來得出:

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

Tanh除了居中(-1到1)外,基本上與Sigmoid相同。這個函數的輸出的均值大約為0。是以,模型收斂速度更快。注意,如果每個輸入變量的平均值接近于0,那麼收斂速度通常會更快,原理同Batch Norm。

  • Softsign

    torch.nn.Softsign()

    PyTorch學習筆記(20) ——激活函數
    PyTorch學習筆記(20) ——激活函數
    同Sigmoid有點類似,但是它比Sigmoid達到漸進線(asymptot n. [數] 漸近線)的速度更慢,有效的緩解了梯度消失的問題(gradient vanishing problem (to some extent).)。
  • Hardtanh

    torch.nn.Hardtanh()

如下圖所示,Hardtanh就是1個線性分段函數[-1, 1],但是使用者可以調整下限

min_val

和上限

max_val

,使其範圍擴大/縮小。

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

當權值保持在較小的範圍内時,Hardtanh的工作效果出奇的好。

  • Threshold

    torch.nn.Threshold()

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

這種Threshold的方式現在很少使用,因為網絡将不能傳播梯度回來。這也是在60年代和70年代阻止人們使用反向傳播的原因,因為當時的科研人員主要使用的是Binary的神經元,即輸出隻有0和1,脈沖信号。

  • Tanhshrink

    torch.nn.Tanhshrink()

    PyTorch學習筆記(20) ——激活函數
    PyTorch學習筆記(20) ——激活函數
    除了稀疏編碼外,很少使用它來計算潛在變量(latent variable)的值。
  • Softshrink

    torch.nn.Softshrink()

    PyTorch學習筆記(20) ——激活函數
    PyTorch學習筆記(20) ——激活函數
    這種方式目前也不怎麼常用,其目的是通過設定 λ \lambda λ,将靠近0的值直接強制歸0,由于這種方式對小于0的部分沒有限制,是以效果不太好~
  • Hardshrink

    torch.nn.Hardshrink()

    PyTorch學習筆記(20) ——激活函數
    PyTorch學習筆記(20) ——激活函數
    同Softshrink類似,除了稀疏編碼以外,很少被使用。
  • LogSigmoid

    torch.nn.LogSigmoid()

LogSigmoid是在Sigmoid基礎上,wrap了一個對數函數。

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

這種方式用作損失函數比較多,而幾乎沒人用它來做激活函數。

  • Softmin

    torch.nn.Softmin()

    PyTorch學習筆記(20) ——激活函數
    将數字變成機率分布,類似Softmax。
  • Softmax

    torch.nn.Softmax()

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

    torch.nn.LogSoftmax()

    PyTorch學習筆記(20) ——激活函數
    同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進行縮小或者放大,你可以修正激活單元的行為。

繼續閱讀