ひとことで言うと
シグモイド活性化は、実数の入力を0から1の範囲へ写す関数です。二値分類では出力を確率として解釈しやすい一方、隠れ層で何段も重ねると勾配を保ちにくい、という性質が判断の中心になります。
入力を「通過させる量」に変換する蛇口です。大きく開いても1、小さく閉じても0に近づくだけで、端に寄るほど蛇口の調整が効きにくくなります。
なぜ必要か
線形変換だけを重ねても全体は線形のままなので、分類境界を曲げられません。シグモイドは滑らかな非線形性を加え、さらに出力を0〜1へ制限します。そのため、二値変数の「1である確率」を1個の出力で表す二値分類に自然に対応します。
ただし、便利な値域には代償があります。入力が正でも負でもない中間値を返すため、出力の平均が0になりにくく、次の層への入力が正側へ偏ります。隠れ層ではこの偏りに加え、深くなるほど導関数の積が小さくなります。現在の中間層ではReLU系が選ばれることが多く、シグモイドは二値分類の出力層や、値を0〜1の開閉度として扱うゲート機構に役割を残しています。
| 欲しい性質 | シグモイドが与えるもの | 支払う代償 |
|---|---|---|
| 二値の確率出力 | 0〜1に収まる滑らかな値 | 極端な入力で飽和する |
| 深い中間層の学習 | 非線形な表現 | 非ゼロ中心と小さい勾配 |
仕組み
入力を とし、出力を とします。指数関数 は自然対数の底です。
が大きいと1に、負方向へ大きいと0に近づくため、出力は厳密には0と1を取らず、その間に収まります。導関数は出力自身で書けます。
出力を と置くと は で最大になり、最大値は です。端の飽和領域では導関数がほぼ0になるので、逆伝播で各層に掛かる値が縮みます。層を重ねるほどこの縮小が積み重なり、入力に近い層まで誤差が届きにくくなります。なお「最大が0.25」は、どの入力でも勾配が0.25という意味ではありません。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 値域と用途 | 値域は0〜1、二値分類の確率出力 | 多クラス出力を1個のシグモイドで表す |
| 導関数の性質 | 、最大0.25 | 最大値を1、または全域で0.25とする |
| 深い層での問題 | 導関数の積が小さくなり勾配消失 | 学習率だけを原因にする |
| 隠れ層の選択 | 非ゼロ中心と飽和を踏まえReLU系も比較する | 出力層でも常にReLUを使う |
実装で確かめる
値域と導関数の最大をNumPyで確認します。s * (1 - s) を使うと、逆伝播で実際に掛かる局所勾配をそのまま計算できます。
import numpy as np
z = np.array([-10.0, 0.0, 10.0])
s = 1.0 / (1.0 + np.exp(-z))
ds = s * (1.0 - s)
print("出力:", s)
print("導関数:", ds)
print("最大値:", ds.max())
取り違えやすいもの
| 観点 | シグモイド | 切り分け |
|---|---|---|
| 値域 | 0〜1 | 確率や開閉度に向く |
| 中心 | 0中心ではない | 中間層では次層の入力が偏りやすい |
| 勾配 | 最大でも0.25、飽和すると0に近い | 深い隠れ層では勾配消失に注意 |
| 使い所 | 二値分類の出力、ゲート | 一般的な中間層の第一候補とは限らない |
想起チェック
シグモイドの値域と、二値分類での意味は
0から1の間で、二値変数が1である確率として解釈できます。
導関数の最大値はいくつか
で、最大値は0.25です。出力が0.5のときに達します。
深い隠れ層で勾配が消えやすい理由は
各層で0.25以下の導関数が掛け合わされ、入力側へ戻る勾配が小さくなるためです。