YOLOv4 tricks解讀(二) 激活函數篇


論文題目: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM