1
ReLU(Rectified Linear Unit)2012年の画像認識コンペ(ImageNet)でAlexNetが採用し、ディープラーニングのブレイクスルーを起こした活性化関数です。 現在もCNNの隠れ層で最も広く使われています。
計算式
f(x) = max(0, x)
入力 x が0より大きければそのまま通す、0以下なら0にする — たったこれだけです。 たとえば x=3 なら f(3)=3、x=-2 なら f(-2)=0 です。
導関数(勾配)
f'(x) = 1 (x > 0), 0 (x ≤ 0)
x>0 のとき勾配は常に1で、信号がそのまま通ります。これがSigmoidの勾配消失問題を解決した理由です。 ただし x≤0 では勾配が完全に0になり、一度この状態になったニューロンは学習が止まります(Dying ReLU問題)。
具体的な計算例
f(2.5) = max(0, 2.5) = 2.5
f(0) = max(0, 0) = 0
f(-3) = max(0, -3) = 0
上のツールで入力値 x を動かしてReLU(赤い線)の値を確認してみてください。x=0を境にカクッと折れ曲がるのがわかります。
2
Leaky ReLUReLUのDying ReLU問題を最もシンプルに解決した関数です。 「漏れのある(Leaky)ReLU」という名前の通り、負の領域でも信号を少しだけ漏らします。 GAN(敵対的生成ネットワーク)で特によく使われます。
計算式
f(x) = x (x > 0)
f(x) = α · x (x ≤ 0)
x>0 のときはReLUと同じくそのまま通します。x≤0 のときはReLUのように0にせず、α倍して小さな値を残します。 αは通常0.01〜0.1程度の小さな値です。上のツールでLeaky ReLU αスライダーを動かすと、負の領域の傾きが変わります。
導関数(勾配)
f'(x) = 1 (x > 0), α (x ≤ 0)
x≤0 でも勾配がα(0ではない)なので、ニューロンが永久に不活性化することがありません。 これがReLUとの最大の違いです。導関数グラフでx<0の領域を比べてみてください。
具体的な計算例(α = 0.1 の場合)
f(2.5) = 2.5(正なのでそのまま)
f(-3) = 0.1 × (-3) = -0.3(ReLUなら0だが、-0.3が残る)
f(-10) = 0.1 × (-10) = -1.0
αを大きくすると負の領域の傾きが急になります。α=1にするとただの y=x(直線)になってしまうので、小さな値にするのがポイントです。
3
ELU(Exponential Linear Unit)Leaky ReLUが直線で負の領域を処理するのに対し、ELUは指数関数(exponential)を使って滑らかに処理します。 出力の平均がゼロに近くなる性質があり、深いネットワークで学習が安定しやすくなります。
計算式
f(x) = x (x > 0)
f(x) = α · (eˣ - 1) (x ≤ 0)
x>0 のときはReLUと同じです。x≤0 のときは指数関数 eˣ を使います。 eˣ は x が大きく負のとき0に近づくので、f(x) は -α に飽和します。 つまり、どれだけ負の入力が来ても出力は -α より小さくなりません。Leaky ReLUのように際限なく負に行かないのがポイントです。
導関数(勾配)
f'(x) = 1 (x > 0), α · eˣ (x ≤ 0)
x=0で導関数がαに連続的につながるため、ReLUのような「角」がありません。 x が大きく負になると勾配は0に近づきますが、Leaky ReLUと違って滑らかに0に近づくのが特徴です。
具体的な計算例(α = 1.0 の場合)
f(2) = 2(正なのでそのまま)
f(-1) = 1.0 × (e⁻¹ - 1) = 1.0 × (0.368 - 1) = -0.632
f(-5) = 1.0 × (e⁻⁵ - 1) = 1.0 × (0.007 - 1) ≈ -0.993(-1に近づく)
上のツールでELU αを大きくすると、負側の飽和値(底)が深くなるのがわかります。α=1がデフォルトで、-1付近で底打ちします。
4
GELU(Gaussian Error Linear Unit)BERT・GPT・Vision Transformerなど、現在の大規模モデルで最も広く使われている活性化関数です。 「入力が正規分布に従うとき、大きな値ほど通しやすく、小さな値ほど抑える」という確率的な考え方に基づいています。
計算式
f(x) = x · Φ(x)
※ Φ(x) は正規分布の累積分布関数
Φ(x) は「正規分布で x 以下の値が出る確率」です。x が大きいほどΦ(x) は1に近づき、f(x) ≈ x になります。 x が大きく負ならΦ(x) ≈ 0 で、f(x) ≈ 0 です。実際の計算では以下の近似式が使われます:
f(x) ≈ 0.5x(1 + tanh(√(2/π) · (x + 0.044715x³)))
式は複雑に見えますが、直感的には「大きい入力は通す、小さい入力は抑える、境目が滑らか」という関数です。 ReLUの「0か通すか」の二択を、確率的に柔らかくしたものと考えてください。
導関数(勾配)
GELUの導関数はどの点でも連続的に変化します(角がない)。 x>0 では勾配が1に近く、x<0 では滑らかに0に近づきます。 導関数グラフで青い線を見ると、x=0付近で0.5を通るなめらかなS字カーブになっていることがわかります。
具体的な計算例
f(2) = 2 × Φ(2) = 2 × 0.977 ≈ 1.955(ほぼそのまま通る)
f(0) = 0 × Φ(0) = 0 × 0.5 = 0
f(-1) = -1 × Φ(-1) = -1 × 0.159 ≈ -0.159(少しだけ負)
f(-3) = -3 × Φ(-3) = -3 × 0.001 ≈ -0.004(ほぼ0)
x=-1付近で少し負の値を取るのが特徴です。上のグラフで青い線の x=-1 付近を見ると、わずかに0より下に沈んでいることがわかります。
5
Swish / SiLU(Sigmoid Linear Unit)2017年にGoogle Brainが自動探索(NAS)で発見した活性化関数です。 人間が設計したのではなく、「どんな数式が最も性能が良いか」を機械に探させた結果、この式が見つかりました。 β=1 のとき SiLU(Sigmoid Linear Unit)とも呼ばれます。EfficientNetで採用されています。
計算式
f(x) = x · σ(βx)
※ σ(x) = 1/(1+e⁻ˣ) はシグモイド関数
入力 x に、自分自身のシグモイド値 σ(βx) を掛け算しています。 σ(βx) は0〜1の値なので、「自分自身で自分の通す量を決める」自己ゲート機構と呼ばれます。βが大きいほどσ(βx) のカーブが急になり、ReLUに近い形状になります。 β→∞ でReLUに一致し、β=0 で f(x) = x/2 の直線になります。 上のツールでSwish βスライダーを動かして確かめてみてください。
導関数(勾配)
f'(x) = σ(βx) · (1 + βx · (1 - σ(βx)))
導関数は常に連続で、滑らかなカーブを描きます。 x>0 では勾配が1に近づき、x<0 では0に近づきますが、どこにも「角」がありません。 GELUと同様に、x が少し負のところで勾配が少しだけ負になるのも特徴です。
具体的な計算例(β = 1 の場合)
f(2) = 2 × σ(2) = 2 × 0.881 ≈ 1.762
f(0) = 0 × σ(0) = 0 × 0.5 = 0
f(-1) = -1 × σ(-1) = -1 × 0.269 ≈ -0.269
f(-5) = -5 × σ(-5) = -5 × 0.007 ≈ -0.034(ほぼ0に戻る)
x=-1付近で最も深く負に沈み、そこから0に戻っていきます。この「谷」がSwishの特徴的な形状です。
6
Mish2019年にDiganta Misraが提案した、Swishの改良版です。 物体検出で有名なYOLOv4に採用され、画像認識タスクでSwishやReLUを上回る精度が報告されています。 調整すべきパラメータがなく、そのまま使えるのも利点です。
計算式
f(x) = x · tanh(softplus(x))
= x · tanh(ln(1 + eˣ))
この式を分解して理解しましょう:
① softplus(x) = ln(1 + eˣ)
ReLUを滑らかにした関数。x が大きいとき ≈ x、x が大きく負のとき ≈ 0
② tanh(…) で -1〜1 に圧縮
softplusの結果をtanhで -1〜1 の範囲に押し込める(自己ゲートの役割)
③ x × (②の結果) で最終出力
Swishと同じ「自己ゲート」の構造。入力 x に自分自身から作ったゲート値を掛ける
導関数(勾配)
f'(x) = tanh(sp) + x · sech²(sp) · σ(x)
Swishと似た形状ですが、Mishの方が導関数の谷がわずかに浅いのが特徴です。 これにより勾配がより安定し、学習が滑らかに進むと言われています。 上のツールでSwishとMishを両方表示し、導関数グラフを比べてみてください。
具体的な計算例
f(2) = 2 × tanh(ln(1+e²)) = 2 × tanh(2.13) ≈ 2 × 0.973 ≈ 1.944
f(0) = 0 × tanh(ln(2)) = 0 × 0.600 = 0
f(-1) = -1 × tanh(ln(1+e⁻¹)) = -1 × tanh(0.313) ≈ -0.303
f(-5) ≈ -5 × tanh(0.007) ≈ -0.034
SwishとMishはほぼ同じ形状ですが、Mishの方がx=-1付近の谷がわずかに深く、そのまわりの勾配が安定しています。 パラメータ不要で「そのまま使える」のがMishの魅力です。