🧠 STEP 4: 活性化関数
ニューラルネットワークに「非線形性」を与える重要な関数を理解しよう
📋 このステップで学ぶこと
- 活性化関数とは何か?なぜ必要なのか?
- シグモイド関数(Sigmoid)とtanh関数
- ReLU(現在最も人気の活性化関数)
- Leaky ReLU、ELU(ReLUの改良版)
- Softmax関数(多クラス分類用)
- 活性化関数の選び方
🎯 1. 活性化関数とは何か?
1-1. 活性化関数の基本
活性化関数(Activation Function)とは、ニューラルネットワークの各ニューロン(ユニット)で出力を変換する関数です。
STEP 2で学んだステップ関数は、「0か1のスイッチ」のようなものでした。
しかし、現実世界ではもっと柔軟な判断が必要です。
例えば、「天気が良ければ買い物に行く」という判断も、
実際には「すごく良い → 絶対行く」「まあまあ → たぶん行く」「微妙 → 迷う」のようにグラデーションがあります。
活性化関数は、このグラデーション(連続的な変化)を表現するためのものです。
1-2. なぜ活性化関数が必要なのか?
活性化関数がなければ、ニューラルネットワークは非常に限られた問題しか解けません。
活性化関数がないと、どんなに層を重ねても単純な線形変換にしかなりません。
以下の図は横スクロールできます。
- 非線形性を導入:直線では表せない複雑なパターンを学習可能にする
- 出力を適切な範囲に制限:数値が無限に大きくなる(爆発する)のを防ぐ
- 勾配の伝播を助ける:学習を効率的に進められるようにする
1-3. 活性化関数の位置
活性化関数は、各層の重み付き和の計算の後に適用されます。
📊 2. ステップ関数(復習と問題点)
2-1. ステップ関数の復習
STEP 2で学んだステップ関数は、最も単純な活性化関数です。
step(x) = 1 (x > 0 のとき)
step(x) = 0 (x ≤ 0 のとき)
入力が0より大きければ1、そうでなければ0を出力します。
以下の図は横スクロールできます。
2-2. ステップ関数の問題点
問題1:微分ができない
x=0の点で不連続(ジャンプ)しているため、その点で微分ができません。
ニューラルネットワークの学習では微分が必要なため、これは大きな問題です。
問題2:勾配がほとんど0
x≠0のところでは勾配(傾き)が0です。
勾配が0だと、重みの更新ができず、学習が進みません。
問題3:柔軟性がない
出力が0か1しかないため、「80%の確率で猫」のような柔軟な表現ができません。
ステップ関数の問題を解決するために、様々な活性化関数が開発されました。
これから、代表的な活性化関数を順番に学んでいきましょう。
📈 3. シグモイド関数(Sigmoid)
3-1. シグモイド関数とは?
シグモイド関数(Sigmoid Function)は、ステップ関数をなめらかにした関数です。
「S字カーブ」を描くことから、シグモイド(S字型)と呼ばれます。
σ(x) = 1 / (1 + e-x)
eはネイピア数(約2.718)で、数学の重要な定数です。
e-xはeの-x乗を意味します。
出力範囲:0 〜 1(0より大きく1より小さい値)
以下の図は横スクロールできます。
3-2. シグモイド関数の値を計算してみよう
x = 0 のとき:
σ(0) = 1 / (1 + e⁰) = 1 / (1 + 1) = 1/2 = 0.5
x = 2 のとき:
σ(2) = 1 / (1 + e⁻²) = 1 / (1 + 0.135) ≈ 0.88
x = -2 のとき:
σ(-2) = 1 / (1 + e²) = 1 / (1 + 7.39) ≈ 0.12
x = 10 のとき:
σ(10) ≈ 0.9999(ほぼ1)
3-3. Pythonで実装してみよう
import numpy as np
NumPy(数値計算ライブラリ)を読み込みます。expなどの数学関数が使えます。
def sigmoid(x):
「sigmoid」という名前の関数を定義します。xは入力値です。
return 1 / (1 + np.exp(-x))
シグモイド関数の計算式そのものです。
np.exp(-x)は e-x を計算します。
sigmoid(0) = 0.5000 sigmoid(1) = 0.7311 sigmoid(-1) = 0.2689 sigmoid(5) = 0.9933 sigmoid(-5) = 0.0067 sigmoid(10) = 0.999955
3-4. シグモイド関数のメリットとデメリット
| メリット ✅ | デメリット ❌ |
|---|---|
| なめらかで微分可能 | 勾配消失問題がある |
| 出力が0〜1(確率として解釈可能) | 出力が0中心でない |
| 古典的で理解しやすい | 計算コストが高い(exp計算) |
3-5. 勾配消失問題とは?
シグモイド関数の最大の問題点は、入力の絶対値が大きいと勾配がほぼ0になることです。
ニューラルネットワークの学習では、誤差逆伝播法を使って重みを更新します。
このとき、勾配(傾き)を層から層へ掛け算で伝えていきます。
深い層への勾配 = 勾配₁ × 勾配₂ × 勾配₃ × …
もし各層の勾配が0.1だとすると:
5層後: 0.1 × 0.1 × 0.1 × 0.1 × 0.1 = 0.00001
→ 勾配が消えてしまい、浅い層の重みが更新されない!
→ 深いネットワークの学習が困難になる!
📉 4. tanh関数(ハイパボリックタンジェント)
4-1. tanh関数とは?
tanh関数(ハイパボリックタンジェント)は、シグモイド関数を-1〜1の範囲に拡張したものです。
tanh(x) = (ex – e-x) / (ex + e-x)
または、シグモイド関数を使って表すと:
tanh(x) = 2・sigmoid(2x) – 1
出力範囲:-1 〜 1
以下の図は横スクロールできます。
4-2. Pythonで実装
tanh(0) = 0.0000 tanh(1) = 0.7616 tanh(-1) = -0.7616 tanh(2) = 0.9640 tanh(-2) = -0.9640
4-3. シグモイドとtanhの比較
| 項目 | シグモイド | tanh |
|---|---|---|
| 出力範囲 | 0 〜 1 | -1 〜 1 |
| 中心値 | 0.5 | 0(ゼロ中心)✅ |
| 勾配消失 | あり | あり(やや軽減) |
| 主な用途 | 出力層(二値分類) | 隠れ層(RNN内部) |
tanhは出力が0を中心に分布するため、次の層への入力も0を中心とした値になります。
これにより、学習が安定し、収束が速くなります。
シグモイドは出力が常に正(0〜1)なので、次の層への入力が偏ってしまいます。
⚡ 5. ReLU(Rectified Linear Unit)
5-1. ReLUとは?
ReLU(Rectified Linear Unit)は、現在最も人気のある活性化関数です。
2012年のAlexNetの成功以降、ディープラーニングの標準となりました。
ReLU(x) = max(0, x)
つまり:
・x > 0 のとき → xをそのまま出力
・x ≤ 0 のとき → 0を出力
出力範囲:0 〜 ∞(上限なし)
以下の図は横スクロールできます。
5-2. ReLUの計算例
ReLU(-5) = max(0, -5) = 0
ReLU(-1) = max(0, -1) = 0
ReLU(0) = max(0, 0) = 0
ReLU(1) = max(0, 1) = 1
ReLU(5) = max(0, 5) = 5
ReLU(100) = max(0, 100) = 100
→ 負の値は0に、正の値はそのまま!
5-3. Pythonで実装
np.maximum(0, x)
0とxを比較して、大きい方を返します。
これだけでReLUが実装できます!非常にシンプルです。
ReLU(-5) = 0 ReLU(-1) = 0 ReLU(0) = 0 ReLU(1) = 1 ReLU(5) = 5 ReLU([-3 -1 0 1 3]) = [0 0 0 1 3]
5-4. なぜReLUが人気なのか?
| メリット ✅ | デメリット ❌ |
|---|---|
| 計算が超高速(max関数のみ) | Dying ReLU問題 |
| 勾配消失問題を解決(正の領域で勾配=1) | 負の入力で勾配が0 |
| スパース性(多くのニューロンが0を出力) | 出力が0中心でない |
| 深いネットワークで効果的 | – |
シグモイド:1 / (1 + exp(-x)) → 割り算、足し算、指数関数
tanh:(exp(x) – exp(-x)) / (exp(x) + exp(-x)) → 指数関数×4、割り算
ReLU:max(0, x) → 比較のみ!
→ ReLUはシグモイドの10倍以上速いと言われています
5-5. Dying ReLU問題
ReLUには「死んだニューロン(Dead Neuron)」が発生する問題があります。
Dying ReLU問題はあるものの、それを補って余りある利点があります。
隠れ層の活性化関数で迷ったら、まずReLUを使うのが定石です。
問題が発生したら、次に紹介する改良版を試しましょう。
🔧 6. ReLUの改良版
Dying ReLU問題を解決するために、いくつかの改良版が提案されています。
6-1. Leaky ReLU(リーキーレル)
Leaky ReLU(x) = x (x > 0 のとき)
Leaky ReLU(x) = 0.01 × x (x ≤ 0 のとき)
ポイント:負の領域でもわずかな傾き(0.01)を持たせる
→ 「少し漏れる(Leaky)」という意味
以下の図は横スクロールできます。
=== ReLUとLeaky ReLUの比較 === ReLU(-2) = 0 Leaky ReLU(-2) = -0.02 ReLU(-10) = 0 Leaky ReLU(-10) = -0.1
6-2. ELU(Exponential Linear Unit)
ELU(x) = x (x > 0 のとき)
ELU(x) = α × (ex – 1) (x ≤ 0 のとき)
特徴:
・負の領域でなめらかな曲線を描く
・平均出力が0に近づく(ゼロ中心に近い)
・Leaky ReLUより高性能な場合が多い
=== ELUの出力 === ELU(-2) = -0.8647 ELU(-1) = -0.6321 ELU(0) = 0.0000 ELU(1) = 1.0000 ELU(2) = 2.0000
6-3. 活性化関数の比較表
| 関数 | 出力範囲 | 計算速度 | 勾配消失 | 主な用途 |
|---|---|---|---|---|
| Sigmoid | 0 〜 1 | 遅い | あり | 出力層(二値分類) |
| tanh | -1 〜 1 | 遅い | あり | RNN(隠れ層) |
| ReLU | 0 〜 ∞ | 速い ⭐ | なし ⭐ | 隠れ層(デフォルト) |
| Leaky ReLU | -∞ 〜 ∞ | 速い | なし | ReLU改良 |
| ELU | -α 〜 ∞ | やや遅い | なし | 高性能が必要 |
🎲 7. Softmax関数
7-1. Softmaxとは?
Softmax関数は、多クラス分類の出力層で使われる特殊な活性化関数です。
複数の出力を「確率分布」に変換します。
Softmax(xi) = exi / Σ(exj)
特徴:
- すべての出力の合計が1になる
- 各出力を確率として解釈できる
- 最も大きい入力に対応する出力が最も大きくなる
7-2. Softmaxの動作を理解する
ステップ1:ニューラルネットワークの生の出力
猫のスコア: 2.5
犬のスコア: 1.2
鳥のスコア: 0.3
→ このままでは「どれくらい自信があるか」がわかりにくい
ステップ2:Softmaxを適用
猫の確率: 0.76(76%)
犬の確率: 0.20(20%)
鳥の確率: 0.04(4%)
合計: 1.00(100%)
→ 確率として解釈できる!「76%の自信で猫」
7-3. Pythonで実装
c = np.max(x)
入力の最大値を取得。オーバーフロー対策のために使用。
(e1000などの巨大な数を避けるため)
exp_x = np.exp(x – c)
各要素から最大値を引いてからexp。これでオーバーフローを防ぐ。
sum_exp_x = np.sum(exp_x)
expの合計を計算。
y = exp_x / sum_exp_x
各要素を合計で割って、合計が1になるようにする。
=== Softmaxの動作 === 入力スコア: [2.5 1.2 0.3] Softmax出力: [0.75858099 0.20664137 0.03477764] 合計: 1.0000 === 解釈 === 猫: 75.9% 犬: 20.7% 鳥: 3.5% 予測: 猫
- 多クラス分類の出力層で使用(3クラス以上)
- 二値分類(2クラス)の場合はSigmoidを使用
- 回帰問題では使わない(活性化関数なしで線形出力)
🎯 8. 活性化関数の選び方
8-1. 隠れ層の活性化関数
基本:ReLU
迷ったらReLUを使う!ほとんどの場合でうまく機能します。
Dying ReLU問題が発生したら:Leaky ReLU または ELU
多くのニューロンが0を出力し続ける場合に試す。
RNN(LSTM/GRU)の内部:tanh
RNNの内部構造ではtanhが使われることが多い(ゼロ中心のため)。
8-2. 出力層の活性化関数
二値分類(2クラス):Sigmoid
例:スパム判定(スパム or 非スパム)、病気診断(陽性 or 陰性)
出力:0〜1の値(確率として解釈)
多クラス分類(3クラス以上):Softmax
例:画像分類(猫 or 犬 or 鳥 or …)、手書き数字認識(0〜9)
出力:各クラスの確率(合計1)
回帰:活性化関数なし(恒等関数)
例:株価予測、温度予測
出力:任意の実数値
8-3. まとめチャート
入力層 → [ReLU] → [ReLU] → [ReLU] → [Softmax] → 出力
↑ ↑ ↑ ↑
隠れ層 隠れ層 隠れ層 出力層
隠れ層はすべてReLU、出力層はSoftmax(多クラス分類)
📝 STEP 4 のまとめ
- 活性化関数は、ニューラルネットワークに非線形性を与える重要な関数
- Sigmoidは0〜1の出力、tanhは-1〜1の出力
- ReLUは現在最も人気があり、隠れ層のデフォルト選択
- Leaky ReLU、ELUはReLUの改良版で、Dying ReLU問題を解決
- Softmaxは多クラス分類の出力層で使用(確率分布に変換)
- 勾配消失問題はSigmoid/tanhで発生、ReLUで解決
活性化関数の選択は、ニューラルネットワークの性能を大きく左右します。
基本ルール:
・隠れ層 → ReLU
・出力層 → 問題に応じて(二値分類=Sigmoid、多クラス=Softmax、回帰=なし)
次のSTEP 5では、損失関数を学び、
ニューラルネットワークが「何を学習するか」を理解しましょう!
📝 練習問題
活性化関数の役割
活性化関数がない場合、どうなりますか?最も適切なものを選んでください。
- A. ニューラルネットワークが全く学習できなくなる
- B. どんなに層を重ねても線形変換にしかならない
- C. 計算速度が劇的に向上する
- D. 精度が大幅に向上する
なぜBが正解なのか?
活性化関数がないと、各層の計算は単純な行列の掛け算になります。
行列の掛け算を何回繰り返しても、結果は1つの行列との掛け算と同じです。
他の選択肢の解説:
Aが不正確な理由:学習自体は可能ですが、表現力が線形に限られるため、複雑な問題は解けません。
C、Dが間違いの理由:活性化関数がないことは計算上はシンプルですが、これはメリットではなくデメリットです。非線形な問題が解けなくなります。
ReLU関数の計算
ReLU(-3)、ReLU(0)、ReLU(5)の値はそれぞれいくつですか?
- A. -3, 0, 5
- B. 0, 0, 5
- C. -3, 0, 0
- D. 0, 1, 5
ReLUの計算方法
ReLU(x) = max(0, x) なので、0とxを比較して大きい方を返します。
ReLUの覚え方:
- 負の値 → 0を出力(切り捨て)
- 0 → 0を出力
- 正の値 → そのまま出力
他の選択肢の解説:
Aが間違い:負の値をそのまま出力するのはLeaky ReLUの特徴です。ReLUは負の値を0にします。
Dが間違い:ReLU(0)は0です。1にはなりません。ステップ関数と混同しないように注意。
活性化関数の選択
画像を「猫」「犬」「鳥」の3クラスに分類する問題で、
出力層の活性化関数として最も適切なものを選んでください。
- A. ReLU
- B. Sigmoid
- C. Softmax
- D. 活性化関数なし
なぜSoftmaxなのか?
3クラス以上の多クラス分類では、Softmaxを使います。
Softmaxの特徴:
- 出力の合計が1になる(確率分布)
- 各クラスの確率として解釈できる
- 例:猫70%、犬20%、鳥10% → 合計100%
他の選択肢の解説:
Aが間違い:ReLUは隠れ層で使用します。出力層には使いません。
Bが間違い:Sigmoidは二値分類(2クラス)で使用します。
例:スパム判定(スパム or 非スパム)、病気診断(陽性 or 陰性)
Dが間違い:活性化関数なし(線形出力)は回帰問題で使用します。
例:株価予測、温度予測
覚え方:
勾配消失問題
次のうち、勾配消失問題が起こりやすい活性化関数を選んでください。
- A. ReLU
- B. Leaky ReLU
- C. Sigmoid
- D. ELU
勾配消失問題とは?
深いネットワークで、勾配(傾き)が層を伝わるうちにどんどん小さくなり、ほぼ0になってしまう問題です。
勾配が0になると、重みが更新されず、学習が進みません。
なぜSigmoidで起こるのか?
他の選択肢の解説:
A、B、DはReLU系の活性化関数です。
これらは正の領域で勾配が1なので、勾配消失問題が起こりにくいです。
重要な学び:
これがReLUが人気の最大の理由です。
ReLUの登場により、深いネットワーク(ディープラーニング)の学習が実用的になりました!
学習メモ
ディープラーニング基礎 - Step 4