活性化関数はニューラルネットワークにおいて不可欠な要素であり、ニューロンの出力値を決定する非線形変換を実装します。この関数により、ネットワークは複雑な非線形パターンを学習可能になります。
1. 活性化関数の必要性
活性化関数が存在しない場合、ニューラルネットワークの各層は線形変換(重み付き和)のみを実行します。複数層を重ねても全体は単一の線形モデルと等価であり、線形分離可能な問題(例: 2次元平面上の直線による二分類)しか解けません。画像認識や音声認識といった非線形データを扱うには、非線形性の導入が必須です。活性化関数により、万能近似定理に基づき任意の複雑な関数を近似可能になります。
2. 主な機能
- 非線形性の導入:曲線や境界の学習を可能にする
- 中間層の出力値を制御:線形計算結果を非線形出力に変換
- 情報流の調整:Sigmoid関数のように出力範囲が制限される場合、ゲート作用を発揮
3. 代表的な活性化関数
| 関数名 | 数式 | 出力範囲 | 特徴 | 適用例 |
| Sigmoid | σ(x) = 1/(1+e⁻ˣ) | (0, 1) | 滑らかな関数。確率解釈可能だが、勾配消失問題あり | 二値分類の出力層 |
| Tanh | tanh(x) | (-1, 1) | 零平均特性。Sigmoidより勾配伝播が優れる | RNNの中間層 |
| ReLU | f(x) = max(0, x) | [0, +∞) | 計算効率が良く勾配消失を軽減。ニューロン死亡の懸念あり | 中間層のデフォルト |
| Leaky ReLU | f(x) = max(0.01x, x) | (-∞, +∞) | 負領域に微小勾配を保持。ニューロン死亡を防止 | ReLUの改良 |
| Softmax | σ(x_i) = eˣⁱ/Σeˣʲ | (0,1)総和=1 | 複数出力を確率分布に変換 | 多クラス分類の出力層 |
4. PyTorchでの実装
PyTorchでは
torch.nnモジュールに多くの活性化関数が用意されています。
関数として利用(パラメータ保持不要):
import torch
import torch.nn.functional as F
input_tensor = torch.randn(2)
activated = torch.sigmoid(input_tensor) # Sigmoid
activated = F.relu(input_tensor) # ReLU
層として利用(モデル構築用):
import torch.nn as nn
model = nn.Sequential(
nn.Linear(5, 15),
nn.ReLU(), # 中間層
nn.Linear(15, 3),
nn.Softmax(dim=1) # 多クラス出力
)
5. 選択ガイドライン
- 中間層:ReLUを基本に、ニューロン死亡対策にLeaky ReLUやELUを検討
- 出力層:
- 二値分類: Sigmoid
- 多クラス分類: Softmax
- 回帰問題: 無変換(線形出力)
- 時系列処理: Tanhまたは勾配管理の必要なReLU