← 機械学習テキスト 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:パーセプトロンと多層パーセプトロン | 関連:誤差逆伝播法(勾配消失はここで効く)

要点(BLUF)


1. なぜ非線形が必要か

結論:線形変換を重ねても、それは1つの線形変換にすぎないからです。

隠れ層が2層あり、活性化が無い(恒等写像 ϕ(z)=z\phi(z)=z)場合を考えます。重みを W1,W2W_1, W_2、バイアスを省略すると、

y=W2(W1x)=(W2W1)x=Wx\mathbf{y} = W_2 (W_1 \mathbf{x}) = (W_2 W_1)\,\mathbf{x} = W'\,\mathbf{x}

要するに:2層が W=W2W1W' = W_2 W_1 という1つの行列に潰れます。何層重ねても表現できるのは線形関数だけで、層を深くする意味がありません。

ここに非線形 ϕ\phi を挟むと、

y=W2ϕ(W1x)\mathbf{y} = W_2\,\phi(W_1 \mathbf{x})

となり、ϕ\phi が線形でない限りこの合成は1つの行列にまとめられません。非線形こそが「深さ」を意味あるものにする、つまり多層パーセプトロンが複雑な関数を近似できる源泉です(パーセプトロンと多層パーセプトロン の普遍近似はこの非線形性に依存します)。

補足:「非線形ならなんでもよい」のではありません。微分しやすく誤差逆伝播法 で勾配を流す)、勾配が消えにくく計算が軽いものが好まれます。以下の関数選びはすべてこの3条件のトレードオフです。


2. sigmoid

σ(z)=11+ez,σ(z)=σ(z)(1σ(z))\sigma(z) = \frac{1}{1+e^{-z}}, \qquad \sigma'(z) = \sigma(z)\,\bigl(1-\sigma(z)\bigr)

要するに:sigmoid の微分はどんな入力でも 0.25 以下。さらに zz が大きい/小さい(飽和領域)では σ\sigma が 0 か 1 に張り付き、σ0\sigma' \approx 0 になります。これが後述の勾配消失の主犯です。

もう1つの弱点は出力がすべて正(ゼロ中心でない)こと。ある層の出力がすべて正だと、次の層の重みに流れる勾配の符号が揃ってしまい、更新がジグザグになって収束が遅くなります。


3. tanh

tanh(z)=ezezez+ez,tanh(z)=1tanh2(z)\tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}, \qquad \tanh'(z) = 1 - \tanh^2(z)

要するに:tanh は「ゼロ中心の sigmoid」。中心付近では sigmoid より勾配が大きく学習しやすいものの、飽和すれば微分は同じく 0 に近づくので、勾配消失そのものは解決しません。実際 tanh(z)=2σ(2z)1\tanh(z) = 2\sigma(2z)-1 という関係があり、両者は本質的に同じ S 字飽和型です。


4. ReLU(Rectified Linear Unit)

ReLU(z)=max(0,z),ReLU(z)={1(z>0)0(z<0)\mathrm{ReLU}(z) = \max(0, z), \qquad \mathrm{ReLU}'(z) = \begin{cases} 1 & (z > 0) \\ 0 & (z < 0) \end{cases}

z=0z=0 では微分は定義されませんが、実装上は 0 か 1 を割り当てます。)

ReLU の利点は3つです。

  1. 勾配消失を緩和:正領域では微分がつねに 1。深い網でも勾配がそのまま流れます(後述)。
  2. 計算が軽い:指数関数が不要で max 一発。
  3. 疎な活性化:負の入力は 0 になるので、一部のニューロンだけが発火する疎な表現になります。

一方の弱点が dying ReLU 問題です。z<0z<0 では微分が 0。あるニューロンが学習中に常に負の入力を受ける状態に陥ると、誤差逆伝播法 の勾配が 0 のまま流れ、重みが二度と更新されず「死んだ」ままになります。大きすぎる学習率や偏った初期化で起きやすく、多数のニューロンが死ぬと網の表現力が落ちます。

なぜ起きるか:勾配は出力側から δ\delta として伝わってきますが、ReLU の微分 0 がそれを完全に遮断します。一度ゼロ出力に落ちると入力側へ「お前を直せ」という信号が届かないので、自力で復活できないのです。


5. ReLU の派生

dying ReLU と「ゼロ中心でない」を補うために、負領域に小さな傾きを与える派生が多数あります。

関数定義(z<0z<0 側)狙い
Leaky ReLUαz\alpha zα\alpha は固定の小さな正数、例 0.01)負領域でも微小な勾配 α\alpha を残し「死」を防ぐ
PReLUαz\alpha zα\alpha学習で最適化傾きをデータに合わせて調整
ELUα(ez1)\alpha(e^{z}-1)負領域を滑らかにし、出力平均をゼロに寄せる
GELUzΦ(z)z\,\Phi(z)入力を「通すか/消すか」を確率的にゲートする滑らかなReLU
Swish / SiLUzσ(z)z\,\sigma(z)sigmoid をゲートに使った滑らかなReLU

GELU(Gaussian Error Linear Unit) は Transformer 系で定番の活性化です(要最新確認)。標準正規分布の累積分布関数 Φ\Phi を使い、

GELU(z)=zΦ(z)=z12(1+erf ⁣(z/2))\mathrm{GELU}(z) = z\,\Phi(z) = z\cdot\frac{1}{2}\Bigl(1 + \mathrm{erf}\!\bigl(z/\sqrt{2}\bigr)\Bigr)

と定義されます(erf\mathrm{erf} はガウス誤差関数)。実装では tanh による近似式

GELU(z)12z(1+tanh ⁣[2/π(z+0.044715z3)])\mathrm{GELU}(z) \approx \frac{1}{2}z\Bigl(1 + \tanh\!\bigl[\sqrt{2/\pi}\,(z + 0.044715\,z^3)\bigr]\Bigr)

がよく使われます。要するに:ReLU が「正なら通す/負なら 0」と硬く切るのに対し、GELU は「入力の大きさに応じて確率的に通す割合を決める」滑らかなゲートです。zz\to\inftyΦ(z)1\Phi(z)\to1 なので ReLU に近づき、zz\to-\inftyΦ(z)0\Phi(z)\to0 なので 0 に近づきます。原点付近が滑らかで微分が途切れない点が ReLU より優れます。

Swish / SiLUzσ(z)z\,\sigma(z)。SiLU(Sigmoid Linear Unit)は係数なし、Swish は zσ(βz)z\,\sigma(\beta z)β\beta を持つ一般形です。GELU と同じく「線形 × ゲート」の形で、近年の大規模モデルでは Swish のゲート付き派生 SwiGLU が GELU を上回るという報告もあります(要最新確認。生成・LLM領域は変化が速いので採用前に最新を確認してください)。


6. 勾配消失問題のメカニズム

ここが活性化関数選びの核心です。誤差逆伝播法 では、第 ll 層の誤差 δ(l)\delta^{(l)} が出力側から次の再帰で伝わります(記号は誤差逆伝播のノートに準拠)。

δ(l)=(W(l+1)δ(l+1))ϕ ⁣(z(l))\delta^{(l)} = \Bigl(W^{(l+1)\top}\,\delta^{(l+1)}\Bigr) \odot \phi'\!\bigl(z^{(l)}\bigr)

これを入力側まで展開すると、各層の活性化の微分 ϕ\phi'で掛かります。LL 層を遡ると、ざっくり

Lz(1)    l=1Lϕ ⁣(z(l))(重みの積)\frac{\partial \mathcal{L}}{\partial z^{(1)}} \;\sim\; \prod_{l=1}^{L} \phi'\!\bigl(z^{(l)}\bigr)\cdot(\text{重みの積})

要するに:sigmoid のように ϕ0.25|\phi'|\le 0.25 だと、層を1枚遡るごとに勾配が最大でも 1/41/4 に減ります。10 層あれば 0.25101060.25^{10}\approx 10^{-6} で、入力に近い層の勾配はほぼ消滅します。これが勾配消失で、深い網で前段がまったく学習しなくなる現象の正体です。

ReLU が効く理由はここで明確になります。正領域では ϕ=1\phi'=1 なので、いくつ層を重ねても勾配が 1 のまま遮られずに伝わりϕ\prod \phi' が指数的に潰れません。「ReLU は勾配消失を緩和する」とは、まさにこの ϕ\phi' の積が小さくならないことを指します。

flowchart TB
    subgraph S["sigmoid/tanh:勾配消失"]
        A1["出力層の勾配 1.0"] --> A2["× φ' ≤ 0.25"]
        A2 --> A3["前層 ≈ 0.25"]
        A3 --> A4["× φ' ≤ 0.25"]
        A4 --> A5["前々層 ≈ 0.06"]
        A5 --> A6["入力側 ≈ 0(消失)"]
    end
    subgraph R["ReLU:勾配が保たれる"]
        B1["出力層の勾配 1.0"] --> B2["× φ' = 1(正領域)"]
        B2 --> B3["前層 ≈ 1.0"]
        B3 --> B4["× φ' = 1"]
        B4 --> B5["入力側 ≈ 1.0(保たれる)"]
    end

注意:勾配消失は活性化だけの問題ではなく、重みの大きさにも依存します。重みが大きすぎれば逆に勾配が爆発します(勾配爆発)。活性化の選択に加え、適切な初期化や正規化で対処します → 重み初期化と正規化

活性化関数の系統マップ

graph TD
    Root["活性化関数"] --> Sat["飽和型(S字)"]
    Root --> Piece["区分線形・非飽和型"]

    Sat --> Sig["sigmoid:0〜1・微分 ≤ 0.25・非ゼロ中心"]
    Sat --> Tanh["tanh:-1〜1・ゼロ中心・最大微分 1"]
    Sig -.->|"飽和で勾配消失"| Problem["勾配消失問題"]
    Tanh -.->|"飽和で勾配消失"| Problem

    Piece --> ReLU["ReLU:max(0, z)・正領域 φ'=1"]
    ReLU -->|"勾配消失を緩和"| Good["深い網で学習可能"]
    ReLU -.->|"負領域 φ'=0"| Dead["dying ReLU"]

    Dead --> Leaky["Leaky ReLU/PReLU:負側に傾き α"]
    Dead --> ELU["ELU:負側を滑らかに"]
    ReLU --> Smooth["GELU/Swish:滑らかなゲート型"]
    Smooth -->|"Transformer で定番(要最新確認)"| Modern["近年の主流"]

7. 出力層の活性化は別もの

ここまでは隠れ層の話です。出力層の活性化は「何を予測したいか」で決まり、隠れ層とは選び方が異なります。

要するに:隠れ層は「勾配を流す」ための非線形(ReLU 系が主流)、出力層は「予測の形に合わせる」ための変換(softmax・恒等など)。役割が違うので混同しないでください。なお softmax は出力を確率にするための変換で、隠れ層の非線形性とは目的が別です。


⚠️ よくある誤解・落とし穴


対応するシミュレーション

simulations/activation_functions.py:sigmoid・tanh・ReLU・Leaky ReLU・GELU を関数本体と微分の両方で並べてプロットします。sigmoid/tanh は入力の絶対値が大きい領域で微分が 00 に潰れる(飽和=勾配消失の原因)のに対し、ReLU 系は正の領域で微分が 11 を保つことを、グラフと数値(x=5x=5 での微分値)で確認できます。

活性化関数と微分の比較・飽和(勾配消失)vs ReLU


関連ノート