本記事では、特に機械学習の分類問題の観点から、シグモイド関数とソフトマックス関数の性質について概説します。
#シグモイド関数
##シグモイド関数の概要
シグモイド関数(sigmoid function)は、機械学習において多く用いられる関数です。
$S(x)=\dfrac{1}{1+ \rm{exp}(\it{-x}\rm{)}}$
のような関数で表現されます。下図のとおりの単調増加関数です。
##ロジスティック関数との関係
シグモイド関数を一般化した関数は、ロジスティック関数(logistic function)
$f(x)=\dfrac{L}{1+\rm{exp}(\it{-k\ \rm{(} \it{x-x_0}}\rm{))}}$
であり、シグモイド関数はロジスティック関数の特殊形といえます。
各パラメタの意味は下記のとおりです。
- $L$: 関数値が取りうる最大値。 $\rm{exp}(\it{-k\ \rm{(} \it{x-x_0}}\rm{))}\geqq0$ (極限の厳密な定義は捨象)のため、$f(x)\leqq\dfrac{L}{1}$ が成り立つ。
- $x_0$: $S$ 字カーブをしている曲線の真ん中の変曲点における$x$ の値。$x$ の値の増加/減少に伴う$f(x)$ の増加/減少をコントロールする基点となる。真ん中にあるので、$f(x_0)=\dfrac{L}{2}$ となる。
- $k$: 最小値から最大値に至る増加の緩急をコントロールするパラメタ。
ロジスティック関数のパラメタのうち、$L=1, x_0=0, k=1$ と設定したものがシグモイド関数です。
##シグモイド関数の性質
数学的には似た性質を持つ関数も多く、非常に興味深いのですが、機械学習への応用に限定して重要な性質を挙げます。
シグモイド関数は、$(-\infty, \infty) \rightarrow (0, 1)$ となるよう、$y=0$ 及び $y=1$を持つ単調増加関数です。これが意味するのは、$x$ がどのような値を取ろうとも$S(x)$ の関数値は$0$ から$1$ の間に押し込められることを意味します。確率論に出てくる累積分布関数(cumulative distribution function)の性質と同様であることから、当該関数はニューラルネットワークにおいて入力値$x$を確率値に相当する出力値$S(x)$に変換する活性化関数(activation function)としてよく用いられます。
#ソフトマックス関数
シグモイド関数がある一つの値(実数値)の入力に対して出力を行った関数であるのに対し、ソフトマックス関数は複数値からなるベクトルを入力し、それを正規化したベクトルを出力します。
これの意味するところを具体例も用いて説明します。
##ソフトマックス関数の概要
入力値が$n$値からなるベクトルについて、
入力値ベクトル $(x_1,x_2,\dots ,x_n)$
出力値ベクトル $(y_1,y_2,\dots ,y_n)$
とした場合、
$y_1 = \dfrac{exp(x_1)}{exp(x_1)+exp(x_2)+\dots+exp(x_n)}$
$y_2 = \dfrac{exp(x_2)}{exp(x_1)+exp(x_2)+\dots+exp(x_n)}$
$\dots$
$y_n = \dfrac{exp(x_n)}{exp(x_1)+exp(x_2)+\dots+exp(x_n)}$
このとき、$y_1+y_2+\dots+y_n=1$になることが分かります。
例えば、
入力値ベクトル $(1,2,3)$
に対しては、関数値は以下を返します。
出力値ベクトル $(0.09003057, 0.24472847, 0.66524096)$
合計値が$1$になるのが分かるかと思います。
なお、Pythonでは下記のとおり実装できます。
import numpy as np
def softmax_func(x):
exp_x = np.exp(x)
return exp_x/np.sum(exp_x)
x = np.array([1, 2, 3])
print(softmax_func(x))
##ソフトマックス関数の性質
ソフトマックス関数は、複数値からなる入力値ベクトル$x$ がどのような値を取ろうとも、出力値ベクトルの各要素を$0$ から$1$ の間に押し込め、全要素の合計が$1$となるように正規化する性質を持ちます。当該関数はニューラルネットワークにおいて入力値ベクトルの各要素を確率値に相当する出力値ベクトルに変換する活性化関数(activation function)としてよく用いられます。
#機械学習における使い分け
以上のことから、シグモイド関数とソフトマックス関数には、共通する性質が読み取れます。
$n=2$の場合のソフトマックス関数は、以下のとおり表現されます。
$y_1=\dfrac{exp(x_1)}{exp(x_1)+exp(x_2)}=\dfrac{1}{1+\frac{exp(x_2)}{exp(x_1)}}=\dfrac{1}{1+exp(-(x_1-x_2))}$
このように、$n=2$のソフトマックス関数はシグモイド関数であり、シグモイド関数を一般化したものがソフトマックス関数です。
こうした両者の関数の関係性と、共に確率値を出力する関数であるという性質から、機械学習の分類問題においては2値分類ではシグモイド関数、多値分類(3値以上)ではソフトマックス関数が、出力層の活性化関数として用いられます。
(なお、回帰問題では出力層の活性化関数として恒等関数(identity function)を用います。)