作者: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排行榜相比:
Ranger最佳化器(RAdam和前瞻性)+ 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:
2、非官方的Mish使用inline提升速度:
3 、我們與Ranger和Mish (MXResNet的一部分)一起的FastAI的記錄:
複製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。
英文原文: