【E資格対策】活性化関数
シグモイド(Sigmoid)関数
微分式の導出 (クリックで展開)

ニューラルネットワークの隠れ層や出力層で広く用いられる.
入力値をからの範囲に変換して出力することによって, 出力を確率として解釈できるようにする. 入力値の絶対値が大きい場合, 勾配が非常に小さくなり, 勾配消失問題が発生する可能性がある.
ReLU(Rectified Linear Unit)関数

DNNにおける隠れ層の活性化関数として広く用いられている. 非線形性の導入によって, 勾配消失問題を緩和することができる.
ReLU関数は, 順伝播時に負の入力を にすることができ, 逆伝播時に勾配消失問題を緩和できる. しかし, 負の入力に対する勾配が になることで, 学習速度が低下する可能性がある.
Leaky ReLU関数

Leaky ReLU関数は, 負の入力に対しても小さな勾配を持つことで, 勾配消失問題を効果的に抑制し, ReLU関数の欠点であった学習速度の低下を改善することができる.
(双曲線正接)関数
微分式の導出 (クリックで展開)

DNNにおける隠れ層の活性化関数として広く用いられる. 関数は微分の最大値が とシグモイド関数より大きいため, 勾配消失が起きにくい.
GELU (Gaussian Error Linear Unit)関数
ただし,
- は標準正規分布の確率密度関数
- は標準正規分布の累積分布関数

入力値に沿った確率値を取るゲート係数をReLU関数に乗算した形の活性化関数である. ガウス関数に基づいた滑らかな非線形性があり, 勾配が焼失しにくいという特性を持つ.
また, ネットワークが大規模であるほど効率的に正則化を行うことができるため, Transformerのような大規模モデルでよく用いられている.
勾配消失問題
勾配消失問題とは, 誤差逆伝播法を利用してニューラルネットワークを学習する際に, ネットワークの総数が増加すると, 誤差の勾配が徐々に小さくなり, 学習が進まなくなってしまう問題のことである. 特にシグモイド関数や関数などの活性化関数を用いる際に起こりやすい.
また, パラメータの初期値が適切でない場合, 勾配消失や勾配爆発が発生しやすくなる.
解決策として, 適切な活性化関数や初期化方法, バッチ正規化などが挙げられる.
温度パラメータ
温度パラメータとは, 確率分布や活性化関数の挙動がどれだけ変化しやすいかを制御するためのパラメータである.
例えば, 温度付きシグモイド関数は以下のように定義される. ただし, は温度パラメータである.
- の場合 : 曲線の から への変化が緩やかになる, つまり入力に対する出力の変化が緩やかになる.
- の場合 : 通常のシグモイド関数と同じ挙動を示す.
- の場合 : 曲線の から への変化が急激になる, つまり入力に対する出力の変化が急激になる.
グラフの描画に用いたコードを以下に示す.
コード (クリックで展開)
1.import numpy as np2.from scipy.stats import norm3.import numpy as np4.import matplotlib.pyplot as plt5. 6.# 1. Sigmoid function and its derivative7.def sigmoid(x):8. return 1 / (1 + np.exp(-x))9. 10.def sigmoid_derivative(x):11. s = sigmoid(x)12. return s * (1 - s)13. 14.# 2. ReLU function and its derivative15.def relu(x):16. return np.maximum(0, x)17. 18.def relu_derivative(x):19. return np.where(x > 0, 1, 0)20. 21.# 3. Leaky ReLU function and its derivative22.def leaky_relu(x, alpha=0.01):23. return np.where(x > 0, x, alpha * x)24. 25.def leaky_relu_derivative(x, alpha=0.01):26. return np.where(x > 0, 1, alpha)27. 28.# 4. Tanh function and its derivative29.def tanh_function(x):30. return np.tanh(x)31. 32.def tanh_derivative(x):33. return 1 - np.tanh(x)**234. 35.# 5. GELU function and its derivative36.def gelu(x):37. return x * norm.cdf(x)38. 39.def gelu_derivative(x):40. return norm.cdf(x) + x * norm.pdf(x)41. 42. 43.# Define the x-axis range44.x_values = np.linspace(-5, 5, 400)45. 46.# Calculate y-values for each activation function and its derivative47. 48.# Sigmoid49.sigmoid_y = sigmoid(x_values)50.sigmoid_derivative_y = sigmoid_derivative(x_values)51. 52.# ReLU53.relu_y = relu(x_values)54.relu_derivative_y = relu_derivative(x_values)55. 56.# Leaky ReLU57.leaky_relu_y = leaky_relu(x_values)58.leaky_relu_derivative_y = leaky_relu_derivative(x_values)59. 60.# Tanh61.tanh_y = tanh_function(x_values)62.tanh_derivative_y = tanh_derivative(x_values)63. 64.# GELU65.gelu_y = gelu(x_values)66.gelu_derivative_y = gelu_derivative(x_values)67. 68. 69.# List of activation functions and their derivatives, along with labels and data70.activation_functions = [71. {72. 'name': 'Sigmoid',73. 'function_y': sigmoid_y,74. 'derivative_y': sigmoid_derivative_y75. },76. {77. 'name': 'ReLU',78. 'function_y': relu_y,79. 'derivative_y': relu_derivative_y80. },81. {82. 'name': 'Leaky ReLU',83. 'function_y': leaky_relu_y,84. 'derivative_y': leaky_relu_derivative_y85. },86. {87. 'name': 'Tanh',88. 'function_y': tanh_y,89. 'derivative_y': tanh_derivative_y90. },91. {92. 'name': 'GELU',93. 'function_y': gelu_y,94. 'derivative_y': gelu_derivative_y95. }96.]97. 98.# Iterate through each function and create a separate plot99.for func_data in activation_functions:100. name = func_data['name']101. function_y = func_data['function_y']102. derivative_y = func_data['derivative_y']103. 104. plt.figure(figsize=(10, 6)) # Create a new figure for each function105. plt.plot(x_values, function_y, label=f'{name} Function', color='blue')106. plt.plot(x_values, derivative_y, label=f'{name} Derivative', color='red', linestyle='--')107. plt.title(f'{name} Function and its Derivative')108. plt.xlabel('x')109. plt.ylabel('y')110. plt.legend()111. plt.grid(True)112. plt.show()




