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

2024/10/24に公開

活性化関数

活性化関数とは,ニューロンへ入力された信号の和をa,そのニューロンから出力される信号をyとしたときの,aからyへの変換のために用いられる関数です.

活性化関数の具体的な形の例と選択基準

ここでは,活性化関数の具体例を紹介します.実装例は記事の後半で紹介しています.

恒等関数

恒等関数とは,入力値をそのまま出力するシンプルな活性化関数です.

f(x)=x

主に回帰問題の出力層で使用され,「入力値をそのまま出力する」ことのメリットとしては,モデルが入力から直接的な数値予測を行うことができます.

ジグモイド関数

シグモイド関数とは、入力値を0から1の範囲にマッピングするS字型の滑らかな関数です.

\sigma (x) = \frac{1}{1 + e^{-x}}

主に二値分類問題におけるニューラルネットワークの出力層で使用されます.メリットとしては,
(1)出力が確率として解釈できるため,クラスに属する確率を予測する問題に適しています
(2)非線形性を導入するため,ニューラルネットワークが複雑なパターンや非線形な関係を学習するのに役立ちます
しかし,勾配消失問題が発生しやすいという欠点もあります.

ソフトマックス関数

ソフトマックス関数は,入力された実数値のベクトルを0から1の範囲の確率分布に変換する活性化関数です.

\sigma(\mathbf{x})_i = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}} \quad \text{for } i = 1, 2, \dots, K

入力x_iの指数関数を,指数関数の総和で割ることから0~1の範囲に収まることが想像できるかと思います.\mathbf{x}xのベクトル表記でここでは,x_1, x_2, \dots, x_Kの合計K個の情報を持つベクトルです.主に多クラス分類問題におけるニューラルネットワークの出力層で使用され,各クラスに属する確率を出力します.

ReLU関数

ReLU関数とは,ニューラルネットワークの隠れ層で広く使用されている活性化関数で,入力が0より大きい場合はそのままの値を出力し,0以下の場合は0を出力します.

f(x) = x \quad \text{for} \quad x > 0 \\ f(x) = 0 \quad \text{for} \quad x \leq 0

非線形性を導入しながらも計算コストが低いと言うメリットがありますが,まれに0ばっかり返すことになってしまうので注意が必要です.

具体的な式と実装の形

恒等関数

以下に,pythonで恒等関数を実装する例を示します.

# 恒等関数の定義
def identity(x):
    return x

# 入力値の例
input_values = [1.0, -2.0, 3.5, 0.0]

# 恒等関数の適用
output_values = [identity(x) for x in input_values]

# 結果の表示
print("入力値:", input_values)
print("出力値:", output_values)

実行結果

入力値: [1.0, -2.0, 3.5, 0.0]
出力値: [1.0, -2.0, 3.5, 0.0]

そのままですね,,,

ジグモイド関数

import math
import numpy as np
import matplotlib.pyplot as plt

# シグモイド関数の定義
def sigmoid(x):
    return 1 / (1 + math.exp(-x))

# 数値の代入例
# 入力値の例
input_values = [1.0, -2.0, 3.5, 0.0]

# シグモイド関数の適用
output_values = [sigmoid(x) for x in input_values]

# 結果の表示
print("入力値:", input_values)
print("出力値:", output_values)

実行結果

入力値: [1.0, -2.0, 3.5, 0.0]
出力値: [0.7310585786300049, 0.11920292202211755, 0.9706877692486436, 0.5]

確率!!

ソフトマックス関数

import math

# ソフトマックス関数の定義
def softmax(x):
    # 入力の指数関数を計算
    exp_x = [math.exp(i) for i in x]
    # 指数関数の合計を計算
    sum_exp_x = sum(exp_x)
    # 各要素を合計で割る
    return [i / sum_exp_x for i in exp_x]

# 入力ベクトルの例
input_vector = [1.0, 2.0, 3.0]

# ソフトマックス関数の適用
output_vector = softmax(input_vector)

# 結果の表示
print("入力ベクトル:", input_vector)
print("出力ベクトル:", output_vector)

実行結果

入力ベクトル: [1.0, 2.0, 3.0]
出力ベクトル: [0.09003057317038046, 0.24472847105479767, 0.6652409557748219]

これまた確率!!

ReLU関数

# ReLU関数の定義
def relu(x):
    return max(0, x)

# 入力値の例
input_values = [-2.0, -1.0, 0.0, 1.0, 2.0]

# ReLU関数の適用
output_values = [relu(x) for x in input_values]

# 結果の表示
print("入力値:", input_values)
print("出力値:", output_values)

出力結果

入力値: [-2.0, -1.0, 0.0, 1.0, 2.0]
出力値: [0, 0, 0, 1.0, 2.0]

maxのところで0か入力値を比較しています

自分の活性化関数は昼寝です,,,

Life IS liKe A BoAt

Discussion