活性化関数の一覧:グラフと微分を比較

シグモイド関数、tanh、ReLU、GELU、Swish、Mishなど16種類の活性化関数のグラフと導関数(微分)を重ねて比べられます。数式・出力の範囲・使われている例の一覧表つきで、ブラウザの中で深いネットワークの誤差逆伝播を計算し、どの関数で勾配消失が起きるかも確かめられます。

4
0.01
0.25
1.00
1.00

グラフにポインターを乗せる(スマホでは横にドラッグする)と、そのxでのf(x)とf′(x)を読めます。実線が関数、破線が導関数です。同時に表示できるのは8つまでで、表示している間は色が変わりません。

1つの関数を詳しく見る


0での傾き f′(0)—
最大の傾き max f′—
最小値 min f—
傾きが0.01未満の裾—

活性化関数16種の一覧

数式・出力の範囲・導関数の一覧です。最大の傾きと最小値は初期設定のパラメータでの値で、このページが描いている関数で数値的に確かめています。

関数f(x)と導関数f′(x)出力の範囲f′の最大値ゼロ中心飽和使われている例
シグモイドσ(x) = 1 / (1 + e^(−x))
σ′(x) = σ(x)·(1 − σ(x))
(0, 1)0.25
(x = 0)
いいえ両側2値分類の出力層、LSTM・GRUのゲート
tanh(双曲線正接)tanh(x) = (eˣ − e^(−x)) / (eˣ + e^(−x))
tanh′(x) = 1 − tanh²(x)
(−1, 1)1
(x = 0)
はい両側LSTM・GRUの状態更新、古典的なRNN
ReLU(ランプ関数)ReLU(x) = max(0, x)
ReLU′(x) = 0 (x < 0), 1 (x > 0)
[0, ∞)1
(x > 0)
いいえ左側(勾配がちょうど0)AlexNet・VGG・ResNet。CNNやMLPの標準
Leaky ReLUf(x) = x (x ≥ 0), αx (x < 0); α = 0.01
f′(x) = 1 (x > 0), α (x < 0)
(−∞, ∞)1
(x > 0)
いいえしないGANの識別器(DCGANはα = 0.2)
PReLUf(x) = x (x ≥ 0), a·x (x < 0)
f′(x) = 1 (x > 0), a (x < 0); ∂f/∂a = min(0, x)
(−∞, ∞)1
(x > 0)
いいえしない傾きaも学習する(PyTorchの初期値は0.25)。He et al.(2015)がImageNet向けCNNで導入(He初期化と同じ論文)
ELUf(x) = x (x > 0), α(eˣ − 1) (x ≤ 0); α = 1
f′(x) = 1 (x > 0), αeˣ (x ≤ 0)
(−α, ∞)1
(x > 0)
一部:負の出力で平均が0に近づく左側(−αへ滑らかに)Clevert et al.(2015)が深いネットの学習を速める目的で提案
SELUf(x) = λx (x > 0), λα(eˣ − 1) (x ≤ 0); λ ≈ 1.0507, α ≈ 1.6733
f′(x) = λ (x > 0), λαeˣ (x ≤ 0)
(−1.7581, ∞)1.7581
(x → 0⁻)
はい(LeCun正規初期化と組で設計)左側(−λα ≈ −1.7581へ)自己正規化ネットワーク(Klambauer et al., 2017)
GELUGELU(x) = x·Φ(x) = ½x(1 + erf(x/√2))
GELU′(x) = Φ(x) + x·φ(x)
[−0.1700, ∞)1.1289
(x = √2)
いいえ(最小−0.1700)左側(0へ)BERT・GPT-2・ViTのフィードフォワード層
GELU(tanh近似)f(x) = ½x(1 + tanh(√(2/π)·(x + 0.044715x³)))
f′(x) = ½(1 + t) + ½x(1 − t²)·√(2/π)·(1 + 0.134145x²); t = tanh(√(2/π)·(x + 0.044715x³))
[−0.1700, ∞)1.1290
(x ≈ 1.42)
いいえ(最小−0.1700)左側(0へ)GPT-2の元のコード。PyTorchのapproximate='tanh'
SiLU / Swishf(x) = x·σ(βx); β = 1: SiLU
f′(x) = σ(βx) + βx·σ(βx)·(1 − σ(βx))
[−0.2785, ∞)
(β = 1)
1.0998
(x ≈ 2.40, β = 1)
いいえ(最小−0.2785)左側(0へ)EfficientNet。LLaMA系LLMのSwiGLUフィードフォワード
MishMish(x) = x·tanh(softplus(x))
Mish′(x) = tanh(s) + x·sech²(s)·σ(x); s = softplus(x)
[−0.3088, ∞)1.0885
(x ≈ 1.49)
いいえ(最小−0.3088)左側(0へ)YOLOv4のバックボーン(Misra, 2019)
ソフトプラスsoftplus(x) = ln(1 + eˣ)
softplus′(x) = σ(x)
(0, ∞)→ 1
(x → ∞)
いいえ左側(0へ)分散やスケールなど、出力を正に保つ用途
ソフトサインsoftsign(x) = x / (1 + |x|)
softsign′(x) = 1 / (1 + |x|)²
(−1, 1)1
(x = 0)
はい両側(ただし多項式的にゆっくり)tanhの代替として検討された(Glorot & Bengio, 2010)。現在はまれ
ハードシグモイドf(x) = ReLU6(x + 3) / 6 = min(1, max(0, x/6 + ½))
f′(x) = 1/6 (−3 < x < 3), 0 (|x| > 3)
[0, 1]1/6
(−3 < x < 3)
いいえ両側(|x| > 3で勾配がちょうど0)MobileNetV3のSqueeze-and-Excitationブロック
Hard swishf(x) = x·ReLU6(x + 3) / 6
f′(x) = 0 (x < −3), (2x + 3)/6 (−3 ≤ x ≤ 3), 1 (x > 3)
[−0.375, ∞)1.5
(x = 3)
いいえ(最小−0.375)左側(x < −3で勾配がちょうど0)MobileNetV3(Howard et al., 2019)
ステップ関数f(x) = 1 (x ≥ 0), 0 (x < 0)
f′(x) = 0 (x ≠ 0)
{0, 1}0いいえ全域(逆伝播できる勾配がない)ローゼンブラットのパーセプトロン。誤差逆伝播では学習できない

深さと勾配:ブラウザで誤差逆伝播する

2入力・幅を選べる隠れ層L層・シグモイド出力1つの多層パーセプトロンを実際に作り、two-moonsの700点を入れて、2値交差エントロピーで順伝播と逆伝播を1回ずつ計算します。学習はしません。初期化した直後の勾配で、記事の深さの実験の前半と同じ測り方です。各点は1つの重み行列の |∂loss/∂W| の平均で、層1が入力側です。

24
シード 1
層1の勾配—
出力層の勾配—
失われた桁数—
入力側へ1層ごとの変化(log₁₀)—

比較用に、記事がnumpyで測った同じ量(幅32、記事の乱数シード、深さ1と深さ24の別々のネットワークの層1の勾配)は、シグモイド 1.14e-2 → 2.05e-17、ReLU 2.87e-2 → 4.60e-3、GELU 2.93e-2 → 2.16e-3、tanh 4.64e-2 → 1.59e-2 でした。このパネルは独自に乱数で重みを作るので数値そのものは一致しません。比べるのは桁の大きさです。

ReLU 1本でシグモイドをまねできるか

記事の最初の検証です。scale·ReLU(x + shift) + offset を窓の中でシグモイドに最小二乗でフィットし、同じ直線を窓の外でも見ます。shiftごとにscaleとoffsetを解析的に解き、shiftは窓の中で探索しています。

8
scale, shift, offset—
窓の中のR²—
[−30, 30]での最大誤差—
x = 30での直線の値(シグモイドは1.00)—

設定の意味

上の一覧で表示する関数を選びます(同時に8つまで)。「表示」でf(x)・導関数f′(x)・両方を切り替え、「xの範囲」で横軸の幅を変えます。Leaky ReLUのα、PReLUのa、ELUのα、Swishのβは関数の形を決める値です。深さのパネルでは、活性化関数、初期化の方法(Xavier・He・LeCun)、隠れ層の数L、幅を選びます。

まず試してみること

まず「シグモイド・tanh・ReLU」を押し、導関数の最大値がシグモイドは0.25、tanhは1で違うことを確かめてください。次に深さのパネルで「ReLUとシグモイド、24層」を押すと、シグモイドだけ層1の勾配が10⁻¹⁷付近まで下がります。「記事の4関数、深さ1〜24」を押すと、記事のグラフと同じ形を自分のブラウザで描けます。

結果の見方

グラフにポインターを乗せると、そのxでのf(x)とf′(x)が下の表に出ます。深さのパネルの各点は重み行列ごとの |∂loss/∂W| の平均で、学習前(初期化した直後)の値です。「失われた桁数」は出力層と層1の勾配の比の常用対数です。重みは乱数で作るので記事の数値とは一致しません。比べるのは桁の大きさです。

次は、何を確かめる?

このテーマを深く読む

勾配消失を24層のネットワークで実測したら、sigmoidだけテスト精度0.49(当てずっぽう)まで崩壊し、勾配が15桁消えていた

実験結果と考察を読む
このツールを共有

ほかの実験ツール · 実装で学ぶ · この実験の解説記事