ニューラルネットワークにおける活性化関数

活性化関数はニューラルネットワークにおいて不可欠な要素であり、ニューロンの出力値を決定する非線形変換を実装します。この関数により、ネットワークは複雑な非線形パターンを学習可能になります。

1. 活性化関数の必要性

活性化関数が存在しない場合、ニューラルネットワークの各層は線形変換(重み付き和)のみを実行します。複数層を重ねても全体は単一の線形モデルと等価であり、線形分離可能な問題(例: 2次元平面上の直線による二分類)しか解けません。画像認識や音声認識といった非線形データを扱うには、非線形性の導入が必須です。活性化関数により、万能近似定理に基づき任意の複雑な関数を近似可能になります。

2. 主な機能

  • 非線形性の導入:曲線や境界の学習を可能にする
  • 中間層の出力値を制御:線形計算結果を非線形出力に変換
  • 情報流の調整:Sigmoid関数のように出力範囲が制限される場合、ゲート作用を発揮

3. 代表的な活性化関数

関数名数式出力範囲特徴適用例
Sigmoidσ(x) = 1/(1+e⁻ˣ)(0, 1)滑らかな関数。確率解釈可能だが、勾配消失問題あり二値分類の出力層
Tanhtanh(x)(-1, 1)零平均特性。Sigmoidより勾配伝播が優れるRNNの中間層
ReLUf(x) = max(0, x)[0, +∞)計算効率が良く勾配消失を軽減。ニューロン死亡の懸念あり中間層のデフォルト
Leaky ReLUf(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

タグ: ニューラルネットワーク 活性化関数 PyTorch 機械学習

7月4日 21:14 投稿