論文題目:YOLOv4: Optimal Speed and Accuracy of Object Detection
文獻地址:https://arxiv.org/pdf/2004.10934.pdf
源碼地址:https://github.com/AlexeyAB/darknet

YOLOv4中談及了許多近年來提出的激活函數,包括ReLU,LReLU,PReLU,ReLU6,ELU,SELU,Swish,hard-Swish和Mish。 本文總結這些深度學習的損失函數。
01 sigmoid與tanh
Sigmoid和tanh是有着優美的S型曲線的數學函數。在邏輯回歸、人工網絡中有着廣泛的應用。
從數學上來看,非線性的Sigmoid函數對中央區的信號增益較大,對兩側區的信號增益小,在信號的特征空間映射上,有很好的效果。
從神經科學上來看,中央區酷似神經元的興奮態,兩側區酷似神經元的抑制態,因而在神經網絡學習方面,可以將重點特征推向中央區,將非重點特征推向兩側區。
無論是哪種解釋,看起來都比早期的線性激活函數(y=x),階躍激活函數(-1/1,0/1)高明了不少。
sigmoid
sigmoid將輸入映射到[0, 1]之間。數學形式為:

函數圖像:

缺點:
-
存在飽和現象,造成梯度消失。
- 表達能力的極限在-6~6之間;
- 在-3~3之間會有比較好的效果;
- 不是關於原點中心對稱的。
tensorflow調用:
1 tf.nn.sigmoid(x, name=None)
tanh
tanh將輸入映射到[-1, 1]之間,輸出是原點中心對稱的。但函數值變化敏感,同樣存在飽和問題。tanh實際上是一個放大的sigmoid函數,可以表示為2sigmoid(2x)-1,也可以表示為:

函數圖像:
tensorflow調用
1 tf.nn.tanh(x, name=None)
一般而言,當特征相差明顯時,使用tanh效果會很好;當特征相差不是特別大,sigmoid函數效果會更好一些。

02 ReLU系列
近年來ReLU非常流行,並且包含很多變體:ReLU,ReLU6,LReLU,PReLU
ReLU
![]()
函數圖像:

優點:
- 相較於 sigmoid 和 tanh 函數, ReLU 對於 SGD 的收斂有巨大的加速作用。並且,有文獻指出有6倍之多。
- 計算量小,沒有指數的運算,對硬件友好;
- 有很好的稀疏性。即,將數據轉化為只有最大數值,其他都為0。
缺點:
- 造成神經元"dead"[對於輸入為負值,全部為0]
- 可能會造成梯度爆炸,輸出沒有上限。
tensorflow調用:
1 tf.nn.relu(features, name=None)
在實際使用時,會對relu增加上界的設定,即ReLU6:

tensorflow調用:
1 tf.nn.relu6(features, name=None)
softplus函數與ReLU函數接近,但比較平滑, 同ReLU一樣是單邊抑制,有寬廣的接受域(0,+inf), 但是由於指數運算/對數運算計算量大的原因,而不太被人使用.


2003年Lennie等人估測大腦同時被激活的神經元只有1~4%,進一步表明神經元工作的稀疏性。
從信號方面來看,即神經元同時只對輸入信號的少部分選擇性響應,大量信號被刻意的屏蔽了,這樣可以提高學習的精度,更好更快地提取稀疏特征。
Leaky ReLU(LReLU) && Parametric ReLU(PReLU)
針對ReLU會造成很多神經元dead的問題的改進。可以統一表達為下式:

不同的是Leaky ReLU的α是固定的,而Parametric ReLU的α不是固定的,是通過訓練得到的。
LReLU:

ReLU 中當 x<0 時,函數值為 0 。而 Leaky ReLU 則是給出一個很小的負數梯度值,比如 0.01 。

tensorflow調用:
1 tf.nn.leaky_relu(features, alpha=0.2, name=None)
PReLU:

函數圖像如下:

與LReLU不同的是,PReLU中的α不是固定的,而是可以學習的。解決了超參數α難設定的問題。
也就是說,PReLU為帶參數的ReLU。如果ai=0,那么PReLU退化為ReLU;如果ai是一個很小的固定值(如ai=0.01),則PReLU退化為Leaky ReLU(LReLU)。 有實驗證明,與ReLU相比,LReLU對最終的結果幾乎沒什么影響。

ReLU family:

(Randomized Leaky ReLU的α是由一個高斯分布中隨機產生的)
03 ELU系列
ELU

圖像如下:

從表達式與圖像上看:
- ELU融合了sigmoid和ReLU,左側具有軟飽和性,右側無飽和性;
- ELU的輸出均值接近於0,收斂速度更快

SELU

這是一個在一篇102頁paper發表出來的激活函數,全篇90多頁的附錄,書寫了公式證明... 總結其實就是下式,直觀來看,就是給ELU的表達式乘以了λ。即SELU(x)=λ·ELU(x)(有興趣可以一觀https://arxiv.org/pdf/1706.02515.pdf)

其中,


tensorflow調用
1 tf.nn.selu(features, name=None)
04 Swish && hard-Swish
swish
谷歌大腦在selu出了不久就提出了swish激活函數方法,秒殺所有激活函數。

其中σ表示sigmoid函數。

β是個常數或可訓練的參數。Swish 具備無上界有下界、平滑、非單調的特性。
Swish 在深層模型上的效果優於 ReLU。例如,僅僅使用 Swish 單元替換 ReLU 就能把 NASNetA 在 ImageNet 上的 top-1 分類准確率提高 0.9%,Inception-ResNet-v 的分類准確率提高 0.6%。

tensorflow調用
1 tf.nn.swish(features, name=None)
或者可以手動編寫:
1 x * tf.sigmoid(beta * x)
Hard-swish
Hard-Swish是在MobileNetv3中提出的,是針對Swish函數的sigmoid操作對硬件不夠友好的問題做的改進。使用ReLU6的改善


05 Mish
![]()
https://github.com/digantamisra98/Mish


從函數表達式上來看,Mish的計算量着實不小;
從上圖中看,Mish的圖像略微古怪,居然不是單調的;
但從下圖來看,效果着實不錯。

激活函數大匯總

參考:
(1)https://www.cnblogs.com/makefile/p/activation-function.html
(2)https://www.cnblogs.com/neopenx/p/4453161.html
(3)https://blog.csdn.net/u011984148/article/details/101444274
(4)https://towardsdatascience.com/mish-8283934a72df
