機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

ソフトマックス関数

2クラスの場合に確率的生成モデルを考えると、シグモイド関数で事後確率P(C_k|\mathbf{x})が表せました。今回は多クラスの場合を考えます。確率的生成モデル(1)と同様の計算(ベイズの定理)により、


\displaystyle P(C_k|\mathbf{x}) = \frac{P(\mathbf{x}|C_k)P(C_k)}{\sum_{j}P(\mathbf{x}|C_j)P(C_j)} \tag{1}

となります。ここで


a_k = \ln (P(\mathbf{x}|C_k)P(C_k)) \tag{2}

とすれば、


\exp(a_k) = P(\mathbf{x}|C_k)P(C_k) \tag{3}

だから、式(1)は


\displaystyle P(C_k|\mathbf{x}) = \frac{\exp(a_k)}{\sum_{j}\exp(a_j)} \tag{4}

となり、これをソフトマックス関数と呼びます。出力範囲が[0,1]であり、


\displaystyle \sum_k \frac{\exp(a_k)}{\sum_{j}\exp(a_j)} = 1 \tag{5}

ですから、シグモイド関数と同様にソフトマックス関数の出力は確率として解釈することができます。a_k\mathbf{x}の線形結合\mathbf{w}_k^{T}\mathbf{x}でモデル化します*1

2クラスのロジスティック回帰とは違い、求めるパラメータ\mathbf{w}_kはクラスごとにK種類ありますので、D次元の入力であればD\times K個のパラメータになります。

k=1,2,3a_1 = 0.1,a_2=0.2と固定したときに、a_3を変化させていくと各ソフトマックス関数の出力は以下のグラフのようになりました。

f:id:opabinia2:20190505093701p:plain

横軸がa_3で、縦軸がソフトマックス関数の出力です。式(4)のソフトマックス関数は、a_kが最大のときにP(C_k|\mathbf{x})が1に近い値を返し、それ以外の成分P(C_j|\mathbf{x})は0に近い値となります。最大が顕著であれば1により近く、他との差が小さければ1からは離れていきます。この性質を滑らかに(微分可能)に表現したものがソフトマックス関数であると考えることができると思います。

関連:ソフトマックス関数の微分

*1:今回実際に計算して線形で表せることを確認していません。いつか計算する