Mish:一個新的state of the art的激活函數,ReLU的繼任者

編譯: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個新的排行榜記錄!

Mish:一個新的state of the art的激活函數,ReLU的繼任者

我們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個激活函數進行了比較。

Mish:一個新的state of the art的激活函數,ReLU的繼任者

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


Mish:一個新的state of the art的激活函數,ReLU的繼任者

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

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

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

Mish:一個新的state of the art的激活函數,ReLU的繼任者

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

Mish:一個新的state of the art的激活函數,ReLU的繼任者

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

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

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

Mish:一個新的state of the art的激活函數,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:一個新的state of the art的激活函數,ReLU的繼任者

Mish的PyTorch實現

Tensorflow中的Mish函數:

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

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

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

Mish:一個新的state of the art的激活函數,ReLU的繼任者

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

為什麼Mish表現這麼好?

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

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

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

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

Mish:一個新的state of the art的激活函數,ReLU的繼任者

更平滑的激活功能允許信息更深入地流動……注意,隨著層數的增加,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:一個新的state of the art的激活函數,ReLU的繼任者

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

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

Mish:一個新的state of the art的激活函數,ReLU的繼任者

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

Mish:一個新的state of the art的激活函數,ReLU的繼任者

總結

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

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

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

英文原文:https://medium.com/@lessw/meet-mish-new-state-of-the-art-ai-activation-function-the-successor-to-relu-846a6d93471f


分享到:


相關文章: