Neural networks and deep learningの3章、Improving the way neural networks learn で、ニューラルネットワークの学習を改善する手法がいろいろ述べられていて、 ソフトマックス で出力層の活性関数を別のものに変更した場合について述べられている。
ソフトマックス関数
出力層の活性関数をシグモイド関数ではなく、以下の様な形とする:
$$ a^L_j = \frac{e^{z^L_j}}{\sum_k e^{z^L_k}} \tag{78} $$
これをソフトマックス関数と呼ぶ。
シグモイド関数ではニューロン\(j\)の出力\(a^L_j\)は、\(j\)への入力の合計\(z^L_j\)のみに依存していたが、 ソフトマックス関数では出力層全てのニューロンに関係する。
\(a^L_j\)は0~1の値を取り、すべての\(j\)での合計値は1となる。
これはニューラルネットワークを多クラス分類に使う時に、 出力がそれぞれのクラスである確率であると考えるときに便利。
ソフトマックス関数に対するコスト関数
出力層の活性関数にソフトマックス関数を適用するニューラルネットワークのコスト関数を、 正解パターンである\(a^L_y\)だけを用いた
$$ C \equiv -\ln a^L_y $$
と置く。
\(a^L_y\) が0~1に限られているので、その対数の値は負となり、そのためコストは必ず0以上となる。 分類が正しく行われて\(a^L_y\)が1に近づくとコスト関数の値は0に近づき、 そうでない場合には正の値になる。
コスト関数の微分
上記のコスト関数のウェイトやバイアスによる偏微分は、誤差逆伝播法と同様に、 ニューロンへの入力\(z^L_j\)でチェインルールを適用する:
$$ \begin{align*} \delta^L_j = \frac{\partial C}{\partial z^L_j} &= \frac{\partial}{\partial z^L_j} \left\lbrace -\ln a^L_y \right\rbrace \\ &= - \frac{\partial}{\partial z^L_j} \left\lbrace \ln \frac{e^{z^L_y}}{\sum_k e^{z^L_k}} \right\rbrace \\ &= - \frac{\partial}{\partial z^L_j} \left\lbrace \ln e^{z^L_y} - \ln \sum_k e^{z^L_k} \right\rbrace \\ &= - \frac{\partial}{\partial z^L_j} \left\lbrace z^L_y - \ln \sum_k e^{z^L_k} \right\rbrace \\ &= - \frac{\partial}{\partial z^L_j} z^L_y + \frac{\partial}{\partial z^L_j} \left\lbrace \ln \sum_k e^{z^L_k} \right\rbrace \\ &= - \frac{\partial}{\partial z^L_j} z^L_y + \frac{e^{z^L_j}}{\sum_k e^{z^L_k}} \\ &= - \frac{\partial}{\partial z^L_j} z^L_y + a^L_j \\ \end{align*} $$
\(j = y\)の場合、\(\frac{\partial z^L_y}{\partial z^L_j}=1\) より \(\delta^L_j = a^L_j - 1\) となる。
\(j \ne y\)の場合、\(\frac{\partial z^L_y}{\partial z^L_j}=0\) より \(\delta^L_j = a^L_j\) となる。
「ソフトマックス」という名前の由来
べき乗の項に正の定数\(c\)を掛けた
$$ a^L_j = \frac{e^{cz^L_j}}{\sum_k e^{cz^L_k}} \tag{83} $$
で\(c\)の極限を考えると、\(z^L_j\)の中で一番大きな値だけが1に、それ以外の値は0となり、最大値のみを有効にする関数と考えられる。
それに比べれば、\(c=1\)の状態は緩い最大化と考えられる。