526 views
やりたいこと
Pythonの描画ライブラリである Matplotlibを使って、活性化関数をグラフにしてみたい。
やってみた
(1) sigmoid, tanh
グラフを見ると一目瞭然だが、
入力値の絶対値が大きい時に出力値が飽和する(=出力値がほぼ一定になる)
↓
逆伝播を実行時に微分値(=傾き、勾配)がほぼ 0になる。
↓
勾配消失問題(Vanishing Gradient Problem)

import numpy as np
import matplotlib.pyplot as plt
# 入力値の範囲
x = np.linspace(-10, 10, 400)
# 活性化関数
sigmoid = 1 / (1 + np.exp(-x))
tanh = np.tanh(x)
# グラフ描画
plt.figure(figsize=(8, 5))
plt.plot(x, sigmoid, label='sigmoid', linestyle='-', linewidth=2)
plt.plot(x, tanh, label='tanh', linestyle='-', linewidth=2)
plt.title('Activation Functions')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
plt.tight_layout()
plt.show()
(2) ReLU
入力値が負の値(x < 0)の場合に出力が 0に固定される。
↓
死んだニューロン問題(Dead Neuron Problem)
死んだReLU問題(Dying ReLU Problem)
✨ ReLU = max(0, x) のメリット
🔹正の入力はそのまま通す → 勾配は1で消失しにくい
🔹負の入力は切り捨てる(0)→ 非線形を生む、スパース活性化
→ ノイズに強くなる。過学習のリスクを減らす。
🔹計算が軽い(if文一つで済む)

# ReLU 関数の定義
relu = np.maximum(0, x)
# グラフ描画
plt.figure(figsize=(8, 5))
plt.plot(x, relu, label='ReLU', linestyle='-', linewidth=2)
plt.title('ReLU Activation Function')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
plt.tight_layout()
plt.show()
(3) Leaky ReLU
死んだReLU問題への対策として登場した。

# Leaky ReLU 関数の定義(負の領域に係数0.1)
leaky_relu = np.where(x > 0, x, 0.1 * x)
# グラフ描画
plt.figure(figsize=(8, 5))
plt.plot(x, leaky_relu, label='Leaky ReLU (slope=0.1)', linestyle='-', linewidth=2)
plt.title('Leaky ReLU Activation Function')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.legend()
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
plt.tight_layout()
plt.show()
ReLU vs Leaky ReLU
速度面、学習性能面で大差はないようだ。
深層ネットワークや不安定なデータセットなど、
ReLUでうまく行かなかったら Leaky ReLUを使ってみる
の使い方で良いようだ。
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-02-10: 0回 2026-02-09: 0回 2026-02-08: 0回 2026-02-07: 0回 2026-02-06: 2回 2026-02-05: 0回 2026-02-04: 0回