DEEP LEARNING

ReLU系活性化関数の比較

ニューラルネットワークの各ニューロンに使われる活性化関数を比較します。ReLUを基本として、その弱点を克服するために生まれた6つの関数を重ねて表示し、形状や導関数の違いを直感的に理解できます。

INTERACTIVE CHART
ReLU
Leaky ReLU
ELU
GELU
Swish (SiLU)
Mish
ReLU0.000
f(0.0) の値
Leaky ReLU0.000
f(0.0) の値
ELU0.000
f(0.0) の値
GELU0.000
f(0.0) の値
Swish (SiLU)0.000
f(0.0) の値
Mish0.000
f(0.0) の値
活性化関数 f(x)
横軸が入力値 x、縦軸が活性化関数の出力 f(x) です。 紫の破線は現在選択中の入力値 x を示し、各関数の値がドットで表示されます。 x=0 を境に負の領域での振る舞いの違いに注目してください。
導関数 f'(x)
各関数の導関数(勾配)を表示しています。 勾配が0になると学習が止まる「勾配消失」が起きます。ReLUは x<0 で勾配が完全に0になりますが、 他の関数は負の領域でも勾配が残ることがわかります。
表示する関数
入力値 x0.00
グラフ上の垂直線の位置
Leaky ReLU α0.10
負の領域の傾き(大きいほど信号を通す)
ELU α1.00
負の飽和値の大きさ(大きいほど深く沈む)
Swish β1.00
β=1でSiLU、大きいほどReLUに近づく
解説

🧠
活性化関数とは

活性化関数は、ニューラルネットワークの各ニューロンが「入力の信号をどう変換して次に渡すか」を決める関数です。 人間の脳の神経細胞が「一定以上の刺激で発火する」のと同じように、入力が小さければ抑え、大きければ通す — というフィルターの役割を果たします。もし活性化関数がなければ、ニューラルネットワークは何層重ねても単純な直線(一次関数)しか表現できません。 活性化関数が非線形性を導入することで、曲線や複雑なパターンを学習できるようになります。

なぜReLU系が主流なのか

  • 📉Sigmoid/tanhの問題:かつて主流だったSigmoidやtanhは、入力が大きくなると導関数がほぼ0になります。深い層まで勾配が伝わらず学習が進まない — これが勾配消失問題です。上のツールで導関数グラフを見ると、ReLU系はx>0で勾配が1に近く安定していることがわかります。
  • 🚀ReLUの登場:2012年のAlexNetがReLUを採用して画像認識で圧勝。max(0, x) という極めてシンプルな計算で、Sigmoidより6倍速く学習が収束しました。以来、ReLUがデフォルトの選択肢になっています。
  • 💀Dying ReLU問題:ReLUはx<0で出力も勾配も完全に0になるため、一度「死んだ」ニューロンは二度と復活しません。上のツールでReLUだけ表示し、x<0の領域を見ると、出力も導関数も完全に0であることが確認できます。Leaky ReLU以降の関数はこの問題を解決するために生まれました。

📊
各関数の特徴比較

関数負の領域滑らかさ主な用途
ReLUmax(0, x)完全に0(不活性化)×(角がある)CNNの隠れ層全般
Leaky ReLUmax(αx, x)αx(小さく残る)×(角がある)GANなど
ELUα(eˣ-1)-αに飽和○(滑らか)深いネットワーク
GELUx·Φ(x)少し負になる◎(完全に滑らか)BERT, GPT, ViT
Swishx·σ(βx)少し負になる◎(完全に滑らか)EfficientNet
Mishx·tanh(sp(x))少し負になる◎(完全に滑らか)YOLOv4

📖
用語解説

活性化関数(Activation Function)
= ニューロンの出力を変換する関数
ニューラルネットワークの各ニューロンで、入力の重み付き和を受け取って出力に変換する関数です。 これがないと何層重ねても y = ax + b のような直線しか表現できません。 上のグラフの各曲線がそれぞれ1種類の活性化関数です。
入力f(x)活性化
導関数(Derivative)
= 関数の「傾き」を表す関数
ある点での関数の変化の速さを表します。 ニューラルネットワークの学習(逆伝播)では、この導関数の値を使って重みを更新します。 導関数が0だと「どちらに重みを動かしても変わらない」ので学習が止まってしまいます。 下のグラフの f'(x) がこれです。
傾き
勾配消失(Vanishing Gradient)
= 導関数が0に近づき学習が止まる現象
逆伝播で各層の導関数を掛け合わせるため、導関数が1未満だと深い層ほど勾配がどんどん小さくなり、学習が事実上停止します。 Sigmoidは導関数の最大値が0.25しかないため、10層もあればほぼ0になります。 ReLU系はx>0で導関数が1なので、この問題を大幅に緩和しました。
0.250.060.0160.004勾配が層ごとに縮小
Dying ReLU
= ニューロンが永久に出力0になる問題
ReLUは入力が負のとき出力も勾配も0です。学習中に重みが大きく負に振れると、以降すべての入力で出力が0になり、勾配も0なので二度と復活しません。 Leaky ReLU(負でもαx)やELU(負でも勾配あり)はこの問題を防ぎます。 上のツールでReLUとLeaky ReLUを比べてみてください。
= 0死んだ領域
ゼロ中心(Zero-centered)
= 出力の平均が0に近い性質
出力が常に正(ReLU)だと、次の層への入力が偏り、重み更新の方向が制限されて学習効率が落ちます。 ELU・GELU・Swish・Mishは負の出力も少し持つため、出力の平均が0に近くなり学習が安定します。 上のグラフでx<0の領域を見ると、これらの関数が少しだけ負の値を出していることがわかります。
少し負
滑らかさ(Smoothness)
= 関数にカクッとした角がないこと
ReLUはx=0に角(微分不連続点)があり、導関数が0から1に不連続にジャンプします。 GELU・Swish・Mishはどの点でも滑らかで、導関数も連続的に変化します。 これにより最適化がスムーズになり、より良い極小値に到達しやすくなると報告されています。
滑らか

🧭
どの活性化関数を選ぶべきか

1
まずはReLUを試す
最もシンプルで計算が速く、多くのタスクで十分な性能を発揮します。CNNの隠れ層ではReLUがデフォルトの選択肢です。迷ったらまずReLUから始めましょう。
2
Dying ReLUが起きたらLeaky ReLU / ELU
学習中にニューロンが「死んで」しまう場合は、負の領域でも勾配が残るLeaky ReLUやELUに切り替えます。GAN(敵対的生成ネットワーク)ではLeaky ReLUがよく使われます。
3
Transformer系ならGELU
BERT・GPT・Vision Transformerなど、Transformer系のモデルではGELUが事実上の標準です。PyTorchやTensorFlowのTransformer実装もGELUを採用しています。
4
性能を追求するならSwish / Mish
Swish(Google Brain発)はEfficientNetで採用され、Mish(YOLOv4で採用)とともにReLUを上回る精度が報告されています。ただし計算コストが少し高いため、精度と速度のトレードオフを考慮してください。

📜
活性化関数の歴史と進化

1958
ステップ関数
パーセプトロンの原型。0か1かの二値出力で、微分ができないため学習に使えなかった
1986
Sigmoid
逆伝播法の登場とともに普及。滑らかで微分可能だが、勾配消失問題が深層学習のボトルネックに
1997
tanh
Sigmoidのゼロ中心版。LSTMなどRNN系で今も使われるが、勾配消失は依然として課題
2010
ReLU
Nairらが提案し、2012年のAlexNetで一気に普及。シンプルかつ高速で、ディープラーニング革命の立役者
2013
Leaky ReLU
Dying ReLU問題への最初の解答。負の領域に小さな傾きαを導入
2016
ELU
負側を指数関数で滑らかにし、出力平均をゼロに近づけた改良版
2016
GELU
正規分布の累積分布関数を利用。Transformer系モデルの標準に
2017
Swish (SiLU)
Googleが自動探索で発見。x·σ(x) というシンプルな式でReLUを上回る性能
2019
Mish
Swishの改良版。YOLOv4で採用され、画像認識で高い精度を達成

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 ReLU

ReLUの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
Mish

2019年に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の魅力です。

関連コンテンツ