Mish:一個新的SOTA激活函數,ReLU的繼任者
以下文章來源於AI公園 ,作者ronghuaiyang

專注分享干貨的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個激活函數進行了比較。
我做了一個Mish的PyTorch實現,用它替換了ReLU,沒有做任何其他更改,並在困難的ImageWoof數據集上使用廣泛的優化器(Adam、Ranger、RangerLars、Novograd等)對它進行了測試。
我發現Mish在訓練穩定性、平均准確率(1-2.8%)、峰值准確率(1.2% - 3.6%)等方面都有了全面的提高,與本文的結果相匹配或超過。
下面是Ranger Optimizer + Mish與FastAI排行榜相比:
這是通過簡單地在FastAI的XResNet50中使用Mish替換ReLU,並使用各種優化器(上面的Ranger結果)運行來實現的。沒有任何其他變化,包括學習率。注意:優化Mish的學習率很可能會獲得更好的結果。本文提出了相對於ReLU而言,較低的學習率供參考。
Mish檢查了理想的激活函數應該是什么(平滑、處理負號等)的所有內容,並提出了一套泛化的初始測試。在過去的一年里,我測試了大量新的激活函數,其中大多數都失敗了,從基於MNIST的論文,到基於更真實的數據集的測試。因此,Mish可能最終會為深度學習實踐者提供一種新的激活功能,並有很大的機會超過長期占據主導地位的ReLU。
我通過下面的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實現:
Tensorflow中的Mish函數:
Tensorflow:x = x *tf.math.tanh(F.softplus(x))
Mish和其他的激活函數相比怎么樣?
下圖顯示了Mish與其他一些激活函數的測試結果。這是多達73個測試的結果,在不同的架構,不同的任務上:
為什么Mish表現這么好?
以上無邊界(即正值可以達到任何高度)避免了由於封頂而導致的飽和。理論上對負值的輕微允許允許更好的梯度流,而不是像ReLU中那樣的硬零邊界。
最后,可能也是最重要的,目前的想法是,平滑的激活函數允許更好的信息深入神經網絡,從而得到更好的准確性和泛化。
盡管如此,我測試了許多激活函數,它們也滿足了其中的許多想法,但大多數都無法執行。這里的主要區別可能是Mish函數在曲線上幾乎所有點上的平滑度。
這種通過Mish激活曲線平滑性來推送信息的能力如下圖所示,在本文的一個簡單測試中,越來越多的層被添加到一個測試神經網絡中,而沒有一個統一的函數。隨着層深的增加,ReLU精度迅速下降,其次是Swish。相比之下,Mish能更好地保持准確性,這可能是因為它能更好地傳播信息:
如何把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到你的相關目錄,並包含它,然后將你的網絡激活函數指向它:
另外,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。