機械学習を行ううえで活性化関数の存在は非常に重要です。活性化関数はモデルに非線形性を与え、モデルの表現力を上げることに寄与します。基礎的なものではステップ関数、シグモイド関数、tanh関数、ReLUなどがあります。この中でもReLUの優秀さはこの中では群を抜いていました。圧倒的過ぎるシンプルさと、安定した実力を両立させていました。2017年にSwishが発明され、ようやくReLUは精度の面ではようやく第一線を退きました。
そんな活性化関数界隈に、実に2年ぶり(2019年8月)に期待のルーキーが登場しました。それがタイトルにもある”Mish”です。
MishはCIFAR 100などの複数のベンチマークでSwishやReLUを使用したネットワークより高いスコアを安定して獲得しています。実装は簡単で、しかも効果的なため、最近注目されている活性化関数です。
元論文はこちら
Mishの式
ς(x)はソフトプラス(softplus)関数と呼ばれる関数です。reluが発明されるまでは、ソフトプラス関数が活性化関数として使われていたこともあったようです。あとςはシグマ(=σ)です。論文と表記を揃えています。
Mishのグラフ
グラフは上の通りです。形を見ればお気づきかと思いますが、MishはSwishのアイデアを元に考案されています。つまり
・滑らか
・非単調
・最小値はあるけど最大値は無限(x≒-1.1924のとき最小値≒-0.30884)
という特徴があります。
Mishの微分
Mishの導関数は以下の通りです。
ただし、
ω=4(x+1)+4e^(2x)+e^(3x)+(4x+6)e^x
δ=2e^x+e^(2x)+2
です。
MishとSwishの導関数の比較
すごく似てますね。感覚的な話でいうと、2回微分のグラフを比較した時に、Mishの方がSwishよりもキツいグラフとなっています。つまり出力層が0付近において、Mishの方がより広いダイナミックレンジを持つといえます。ニューラルネットワークの学習において、その出力層があまり大きな数字を出す事はないため、0付近におけるダイナミックレンジの広いMishの方がSwishより優れた結果を出すというのは、直感的にも矛盾しないように思います。
Mishの実装
各フレームワークのカスタム機能を使えば簡単です。
- Tensorflow:
x*tf.math.tanh(tf.softplus(x))
- Torch:
x*torch.tanh(F.softplus(x))
尚、学習率はReLUの時より少し小さめにすることを元論文ではお勧めしています。