研究室スライドの練習がてら
#softmax関数とは?
$n$ 次元のベクトル $ \boldsymbol{x}=(x_1 ,x_2 ,\dots x_n), \boldsymbol{y}=(y_1 ,y_2 ,\dots y_n)$
に対して
$$ f(x_i)= softmax(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_i}} (i=1,2,\dots,n)$$
である。
基本的にはニューラルネットワークでの多クラス分類によく使われるため、避けて通れない関数である。
ニューラルネットワークを学んでいてこの記事に行き着いたと思うのでそのつもりで説明していこうと思う。
まず簡単な例について考えましょう。
ソフトマックス関数とはニューラルネットワークで出力が$x_1,x_2$で出てきてそれをソフトマックス関数によって確率におきかえることによって各ラベルの可能性として出力するものなのです。
今上の図で $\boldsymbol{x}=(1,2)$ であるときの $\boldsymbol{y}$ について考えていきましょう。
分母の $\sum_{j=1}^{n} e^{x_i} $ は共通であるため先に計算します。
以降簡略化のため $Z=\sum_{j=1}^{n} e^{x_i} $ とします
$$Z=\sum_{j=1}^{2} e^{x_i}=e^{x_1}+e^{x_2}=e^1+e^2=10.107...$$
$$y_1=\frac{e^{x_1}}{Z}=\frac{e}{10.107..}\approx 0.269$$
$$y_2=\frac{e^{x_2}}{Z}=\frac{e^2}{10.107..}\approx 0.731$$
となるので $\boldsymbol{y}=(0.269,0.731)$ となります。
このことからソフトマックス関数の性質 $$\sum_{j=1}^{n} y_j=1$$ も確認できます。
要するにニューラルネットワークの出力が $\boldsymbol{x}$ だったときソフトマックス関数に通すことで $y_1$ のラベルである確率は26.9%, $y_2$ のラベルである確率は73.1%であると大雑把に言いかえることもできます。
#softmax関数の微分
本題です。
なお
$$Z=\sum_{j=1}^{n} e^{x_i} $$
としています
ソフトマックス関数の微分は任意の$y_i$に対してどの$x_k$で微分するかいろんなパターンがありますので偏微分です。いきなり $k$ がでてきましが $k,i\in [1,n]$ です。
ソフトマックス関数
$$y_i=softmax(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}$$
$k=i$の時の微分は商の微分を使い、次のようになるはずです。
$$\frac{\partial y_i}{\partial x_i}=\frac{e^{{x_i}^\prime}Z-e^{x_i}Z^{\prime}}{Z^2}$$
この中の微分について以下にくわしく
$$e^{{x_i}^\prime}=e^{x_i}$$
$$Z=\sum_{j=1}^{n} e^{x_j}=\dots e^{x_{i-1}}+e^{x_i}+e^{i+1}+\dots$$
$$Z^{\prime}=(\sum_{j=1}^{n} e^{x_j})^{\prime}=e^{x_i}$$
これらを代入すれば
$$\frac{\partial y_i}{\partial x_i}=\frac{e^{x_i}Z-e^{x_i}e^{x_i}}{Z^2}=\frac{e^{x_i}}{Z}(1-\frac{e^{x_i}}{Z})=y_i(1-y_i)$$
$i\neq k$では
$$\frac{\partial y_i}{\partial x_j}=\frac{-e^{x_i}e^{x_j}}{Z^2}=-y_i y_j$$
これらをまとめると
$$\frac{\partial y_i}{\partial x_j}=\begin{cases}
\ y_i(1-y_i) (i=k)\
-y_i y_j (i\neq k)
\end{cases}$$
となる。
一応これで微分結果は表せましたが、
$$\delta_{ij}=\begin{cases}
\ 1 (i=k)\
\ 0 (i\neq k)
\end{cases}$$
を用いることで、ニューラルネットでは以下の様に表されている場合が多い
$$\frac{\partial y_i}{\partial x_j}=y_i(\delta_{ij}-y_j)$$