Mish:一個新的SOTA激活函數,ReLU的繼任者


Mish:一個新的SOTA激活函數,ReLU的繼任者

CVer 昨天
 

以下文章來源於AI公園 ,作者ronghuaiyang

AI公園
AI公園

專注分享干貨的AI公眾號,圖像處理,NLP,深度學習,機器學習,應有盡有。希望大家能在AI的樂園中快樂玩耍。

點擊上方“CVer”,選擇加"星標"或“置頂”

重磅干貨,第一時間送達

本文轉載自:AI公園

作者:Less Wright

編譯:ronghuaiyang

導讀

對激活函數的研究一直沒有停止過,ReLU還是統治着深度學習的激活函數,不過,這種情況有可能會被Mish改變。

 

Diganta Misra的一篇題為“Mish: A Self Regularized Non-Monotonic Neural Activation Function”的新論文介紹了一個新的深度學習激活函數,該函數在最終准確度上比Swish(+.494%)和ReLU(+ 1.671%)都有提高。

我們的小型FastAI團隊使用Mish代替ReLU,打破了之前在FastAI全球排行榜上准確性得分記錄的一部分。結合Ranger優化器,Mish激活,Flat + Cosine 退火和自注意力層,我們能夠獲得12個新的排行榜記錄!

我們12項排行榜記錄中的6項。每條記錄都是用Mish而不是ReLU。(藍色高亮顯示,400 epoch的准確率為94.6,略高於我們的20 epoch的准確率為93.8:)

作為我們自己測試的一部分,對於ImageWoof數據集的5 epoch測試,我們可以說:

Mish在高顯著性水平上優於ReLU (P < 0.0001)。(FastAI論壇@ Seb)

Mish已經在70多個基准上進行了測試,包括圖像分類、分割和生成,並與其他15個激活函數進行了比較。

 

ReLU和Mish的對比,Mish的梯度更平滑

 

我做了一個Mish的PyTorch實現,用它替換了ReLU,沒有做任何其他更改,並在困難的ImageWoof數據集上使用廣泛的優化器(Adam、Ranger、RangerLars、Novograd等)對它進行了測試。

我發現Mish在訓練穩定性、平均准確率(1-2.8%)、峰值准確率(1.2% - 3.6%)等方面都有了全面的提高,與本文的結果相匹配或超過。

下面是Ranger Optimizer + Mish與FastAI排行榜相比:

 

Ranger優化器(RAdam和前瞻性)+ Mish激活超過當前的FastAI 排行榜評級。注意平穩、穩定的訓練曲線。

 

FastAI排行榜為5和20個epochs,ImageWoof數據集(難)。

 

這是通過簡單地在FastAI的XResNet50中使用Mish替換ReLU,並使用各種優化器(上面的Ranger結果)運行來實現的。沒有任何其他變化,包括學習率。注意:優化Mish的學習率很可能會獲得更好的結果。本文提出了相對於ReLU而言,較低的學習率供參考。

Mish檢查了理想的激活函數應該是什么(平滑、處理負號等)的所有內容,並提出了一套泛化的初始測試。在過去的一年里,我測試了大量新的激活函數,其中大多數都失敗了,從基於MNIST的論文,到基於更真實的數據集的測試。因此,Mish可能最終會為深度學習實踐者提供一種新的激活功能,並有很大的機會超過長期占據主導地位的ReLU。

Mish的性質

 

我通過下面的PyTorch代碼鏈接提供了Mish,以及一個修改過的XResNet (MXResNet),這樣你就可以快速地將Mish放入你的代碼中,並立即進行測試!

讓我們后退一步,了解什么是Mish,為什么它可能改進ReLU上的訓練,以及在神經網絡中使用Mish的一些基本步驟。

什么是Mesh?

直接看Mesh的代碼會更簡單一點,簡單總結一下,Mish=x * tanh(ln(1+e^x))。

其他的激活函數,ReLU是x = max(0,x),Swish是x * sigmoid(x)。

PyTorch的Mish實現:

Mish的PyTorch實現

 

Tensorflow中的Mish函數:

Tensorflow:x = x *tf.math.tanh(F.softplus(x))

Mish和其他的激活函數相比怎么樣?

下圖顯示了Mish與其他一些激活函數的測試結果。這是多達73個測試的結果,在不同的架構,不同的任務上:

Mish對比很多基准測試中的激活函數

 

為什么Mish表現這么好?

以上無邊界(即正值可以達到任何高度)避免了由於封頂而導致的飽和。理論上對負值的輕微允許允許更好的梯度流,而不是像ReLU中那樣的硬零邊界。

最后,可能也是最重要的,目前的想法是,平滑的激活函數允許更好的信息深入神經網絡,從而得到更好的准確性和泛化。

盡管如此,我測試了許多激活函數,它們也滿足了其中的許多想法,但大多數都無法執行。這里的主要區別可能是Mish函數在曲線上幾乎所有點上的平滑度。

這種通過Mish激活曲線平滑性來推送信息的能力如下圖所示,在本文的一個簡單測試中,越來越多的層被添加到一個測試神經網絡中,而沒有一個統一的函數。隨着層深的增加,ReLU精度迅速下降,其次是Swish。相比之下,Mish能更好地保持准確性,這可能是因為它能更好地傳播信息:

 

更平滑的激活功能允許信息更深入地流動……注意,隨着層數的增加,ReLU快速下降。

 

如何把Mish放到你自己的網絡中?

Mish的PyTorch和FastAI的源代碼可以在github的兩個地方找到:

1、官方Mish github:https://github.com/digantam98/Mish

2、非官方的Mish使用inline提升速度:https://github.com/lessw2020/mish

3 、我們與Ranger和Mish (MXResNet的一部分)一起的FastAI的記錄:https://github.com/lessw2020/Ranger-Mish-ImageWoof-5

復制mish.py到你的相關目錄,並包含它,然后將你的網絡激活函數指向它:

導入Mish函數,把激活函數設置為Mish

 

另外,FastAI用戶可以使用修改后的XResNet加載和測試,使用Mish而不是ReLU。復制文件mxresnet.py到本地目錄或路徑:

接下來指定相關的ResNet大小(18、34、50、101、152),並加載體系結構(cnn_learner,等等)。下面是我如何加載mxresnet50,使用Ranger優化:

總結

ReLU有一些已知的弱點,但是通常它執行起來很輕,並且在計算上很輕。Mish具有較強的理論淵源,在測試中,就訓練穩定性和准確性而言,Mish的平均性能優於ReLU。

復雜度只稍微增加了一點(V100 GPU和Mish,相對於ReLU,每epoch增加大約1秒),考慮到訓練穩定性的提高和最終精度的提高,稍微增加一點時間似乎是值得的。

最終,在今年測試了大量新的激活函數后,Mish在這方面處於領先地位,我懷疑它很有可能成為AI未來的新ReLU。


免責聲明!

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



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