ディープラーニングの基礎!シグモイド関数を分かりやすく徹底解説

1. シグモイド関数とは?

シグモイド関数は、ディープラーニング、特にニューラルネットワークの分野で古くから利用されている「活性化関数」の一つです。その名前は、グラフにしたときの形がギリシャ文字のシグマ(S)に似ていることに由来します。

この関数の最も大きな特徴は、どのような実数の値(マイナスの大きな値からプラスの大きな値まで)を入力しても、出力は必ず0から1の間の値になるという点です。この性質により、出力値を「確率」として解釈できるため、特定のタスクで非常に役立ちます。

2. シグモイド関数の数式

一般的に「シグモイド関数」と言う場合、多くは「ロジスティック関数」を指します。その数式は以下の通りです。

f(x) = 1 / (1 + ex)

ここで、xが入力値、eはネイピア数(約2.718)です。

  • xが非常に大きな正の値になると、ex はほぼ0に近づき、関数全体としては1に近づきます。
  • xが非常に大きな負の値になると、ex は非常に大きな値となり、関数全体としては0に近づきます。
  • xが0のとき、e0は1となり、関数は 1 / (1 + 1) = 0.5 となります。

このように、入力値xを0から1の範囲に滑らかに変換する役割を持っています。

3. ディープラーニングにおける役割 – 活性化関数

シグモイド関数は、ニューラルネットワークにおいて「活性化関数」として利用されます。

人間の脳の神経細胞(ニューロン)が、一定の強さの信号を受け取ると「発火」して次のニューロンに情報を伝える仕組みを、数式で模倣したものが活性化関数です。入力された信号の合計値が、次の層へどれくらいの強さの信号を伝えるべきかを決定する「スイッチ」のような役割を担います。

もし活性化関数がなければ、ネットワークは単なる線形計算の繰り返しとなり、複雑なパターンを学習することができません。シグモイド関数のような非線形な関数を挟むことで、ニューラルネットワークはより高度で複雑な表現力を獲得できるのです。

4. メリットとデメリット

シグモイド関数には、その特性からくるメリットと、現代のディープラーニングにおいて課題とされるデメリットが存在します。

項目内容
メリット
  • 確率的な出力: 出力が常に0から1の範囲に収まるため、結果を確率として解釈できます。例えば、ある画像が「猫である確率」を算出するような二値分類問題の出力層に適しています。
  • 微分が容易: 微分(傾きを求める計算)が簡単で、自分自身の出力値だけを使って計算できます。これにより、学習時の計算コストを抑えることができます。
デメリット
  • 勾配消失問題: 入力値が0から大きく離れる(絶対値が大きくなる)と、関数の傾き(微分値)がほぼ0になります。ディープラーニングの学習(誤差逆伝播法)では、この傾きを後ろの層から前の層へと伝えていくため、傾きが0に近付くと、深い層(入力層に近い層)に情報がうまく伝わらず、学習が停滞してしまう「勾配消失問題」を引き起こす主な原因とされてきました。
  • 出力の中心が0でない: 出力の中心は0.5です。出力が常に正の値を取るため、学習の収束が遅くなる可能性があると指摘されています。

5. 現在の使われ方 – ReLUの台頭

前述の「勾配消失問題」のため、近年のディープラーニング、特に層が深いネットワークの中間層(隠れ層)では、シグモイド関数が使われることは少なくなりました。

現在、中間層の活性化関数としてはReLU(Rectified Linear Unit)やその派生関数が主流となっています。ReLUは、入力が0以下なら出力を0、0より大きければ入力をそのまま出力するという非常にシンプルな関数で、勾配消失問題を起こしにくいという大きな利点があります。

しかし、シグモイド関数が全く使われなくなったわけではありません。出力を確率として扱いたい二値分類問題の出力層や、ロジスティック回帰モデルなど、その特性が活きる場面では今でも現役で利用されています。

6. Pythonでの実装例

シグモイド関数は、PythonのライブラリであるNumPyを使うと簡単に実装できます。

import numpy as np
def sigmoid(x): """ シグモイド関数を計算する Args: x (numpy.ndarray or float): 入力値 Returns: numpy.ndarray or float: 0から1の範囲に変換された出力値 """ return 1 / (1 + np.exp(-x))
# 関数の使用例
x_value = np.array([-5.0, -1.0, 0.0, 1.0, 5.0])
y_value = sigmoid(x_value)
print(f"入力値: {x_value}")
print(f"シグモイド関数の出力値: {y_value}")
# 出力結果:
# 入力値: [-5. -1. 0. 1. 5.]
# シグモイド関数の出力値: [0.00669285 0.26894142 0.5 0.73105858 0.99330715] 

まとめ

シグモイド関数は、ディープラーニングの歴史と基礎を理解する上で非常に重要な関数です。

  • S字カーブを描き、入力を0から1の間の値(確率)に変換する活性化関数。
  • かつては広く使われたが、深いネットワークでは勾配消失問題を引き起こすことがある。
  • 現在では、中間層ではReLUが主流だが、二値分類などの出力層では依然として有効。

新しい技術が次々と登場するディープラーニングの世界ですが、シグモイド関数のような基礎的な要素の役割と限界を理解しておくことは、より複雑なモデルを学ぶ上での確かな土台となります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です