Re Reference AI

アーキテクチャ

活性化関数とは

Activation Function

ニューロンの重み付き入力和に非線形変換を適用し、ネットワークが複雑な関数を表現できるようにする関数

ニューラルネットワーク深層学習

ひとことで言うと

AIの各ニューロンの計算結果に変化を加え、複雑なパターンを表現できるようにする関数。

概要

活性化関数とは、ニューラルネットワークの各ノードが受け取った入力の重み付き和に対して適用する非線形変換関数。 線形変換のみを何層重ねても全体として1つの線形変換にしかならないため、活性化関数によって非線形性を導入することで、ネットワークは複雑な非線形関数を近似できるようになる。 代表的な関数にシグモイド関数・tanh・ReLU(Rectified Linear Unit)等があり、現在の深層学習ではReLUおよびその派生形が隠れ層で広く使われている。

背景

単純な線形結合だけを重ねたネットワークは、いくら層を深くしても表現力は線形モデルと変わらないという制約があった。 活性化関数は、各層に非線形性を持ち込み、多層構造を持つ意味を成立させるために導入された。

歴史

1943年: McCullochとPittsの人工ニューロンモデルで、入力の重み付き和を閾値関数によって0/1に変換する仕組みが導入される。 1986年前後: 誤差逆伝播法の普及とともに、微分可能なシグモイド関数・tanhが広く使われるようになる。 2010年: NairとHintonがReLUを提案し、勾配消失問題を緩和し深いネットワークの学習を実用化する上で重要な役割を果たす。

アーキテクチャ

代表的な活性化関数として、出力を0〜1に押し込めるシグモイド関数、-1〜1に押し込めるtanh、負の入力を0に、正の入力をそのまま通すReLU(Rectified Linear Unit)がある。 ReLUは負の領域で勾配が常に0になる「dying ReLU」を緩和するため、負の入力にわずかな傾きを持たせたLeaky ReLUや、より滑らかな形状のGELU・Swishといった派生形も使われる。 隠れ層にはReLU系、2値分類の出力層にはシグモイド、多クラス分類の出力層にはソフトマックスというように、層の役割に応じて使い分けられることが多い。

コード例

PyTorchで代表的な活性化関数を適用する

import torch
import torch.nn.functional as F

x = torch.tensor([-2.0, -0.5, 0.0, 0.5, 2.0])

print(F.sigmoid(x))
print(F.tanh(x))
print(F.relu(x))
print(F.gelu(x))

利点

  • 非線形性を導入することで、ネットワークが複雑な関数を近似できるようになる
  • ReLU等一部の関数は計算が単純で、大規模ネットワークでも高速に処理できる
  • 微分可能なため、誤差逆伝播法による勾配ベースの学習にそのまま組み込める

欠点

  • シグモイド・tanh等は入力が極端な値になると勾配がほぼ0になる勾配消失問題を起こしやすい
  • ReLUも負の入力に対して勾配が常に0になり、学習が進まなくなる「dying ReLU」という問題を起こすことがある
  • どの活性化関数が最適かはタスクや層によって異なり、選択自体が試行錯誤を要するハイパーパラメータになる

比較

関連用語

ニューラルネットワーク隠れ層深層学習

よくある質問

隠れ層でReLUがよく使われる理由は?

計算が単純で高速な上、シグモイドやtanhと比べて勾配消失が起きにくく、深いネットワークでも学習が進みやすいため。

出力層の活性化関数は隠れ層と同じでよいか?

多くの場合異なる。出力層はタスクに合わせて選び、2値分類にはシグモイド、多クラス分類にはソフトマックス、回帰では活性化関数を使わないことが多い。

参考文献

関連Zenn記事