深層学習

シグモイド活性化

実数を0〜1へ押し込む活性化関数です。導関数の上限0.25と出力の非ゼロ中心性を、隠れ層・二値分類・ゲート機構の使い分けに結び付けます。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

シグモイド活性化は、実数の入力を0から1の範囲へ写す関数です。二値分類では出力を確率として解釈しやすい一方、隠れ層で何段も重ねると勾配を保ちにくい、という性質が判断の中心になります。

入力を「通過させる量」に変換する蛇口です。大きく開いても1、小さく閉じても0に近づくだけで、端に寄るほど蛇口の調整が効きにくくなります。

なぜ必要か

線形変換だけを重ねても全体は線形のままなので、分類境界を曲げられません。シグモイドは滑らかな非線形性を加え、さらに出力を0〜1へ制限します。そのため、二値変数の「1である確率」を1個の出力で表す二値分類に自然に対応します。

ただし、便利な値域には代償があります。入力が正でも負でもない中間値を返すため、出力の平均が0になりにくく、次の層への入力が正側へ偏ります。隠れ層ではこの偏りに加え、深くなるほど導関数の積が小さくなります。現在の中間層ではReLU系が選ばれることが多く、シグモイドは二値分類の出力層や、値を0〜1の開閉度として扱うゲート機構に役割を残しています。

欲しい性質シグモイドが与えるもの支払う代償
二値の確率出力0〜1に収まる滑らかな値極端な入力で飽和する
深い中間層の学習非線形な表現非ゼロ中心と小さい勾配

仕組み

入力を zz とし、出力を σ(z)\sigma(z) とします。指数関数 ee は自然対数の底です。

σ(z)=11+e−z\sigma(z)=\frac{1}{1+e^{-z}}

zz が大きいと1に、負方向へ大きいと0に近づくため、出力は厳密には0と1を取らず、その間に収まります。導関数は出力自身で書けます。

σ′(z)=σ(z){1−σ(z)}\sigma'(z)=\sigma(z)\{1-\sigma(z)\}

出力を s=σ(z)s=\sigma(z) と置くと s(1−s)s(1-s) は s=0.5s=0.5 で最大になり、最大値は 0.250.25 です。端の飽和領域では導関数がほぼ0になるので、逆伝播で各層に掛かる値が縮みます。層を重ねるほどこの縮小が積み重なり、入力に近い層まで誤差が届きにくくなります。なお「最大が0.25」は、どの入力でも勾配が0.25という意味ではありません。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
値域と用途値域は0〜1、二値分類の確率出力多クラス出力を1個のシグモイドで表す
導関数の性質σ′(z)=σ(z)(1−σ(z))\sigma'(z)=\sigma(z)(1-\sigma(z))、最大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である確率として解釈できます。

導関数の最大値はいくつか

σ′(z)=σ(z)(1−σ(z))\sigma'(z)=\sigma(z)(1-\sigma(z)) で、最大値は0.25です。出力が0.5のときに達します。

深い隠れ層で勾配が消えやすい理由は

各層で0.25以下の導関数が掛け合わされ、入力側へ戻る勾配が小さくなるためです。

出典