ソフトマックス関数と交差エントロピー誤差の可視化

ニューラルネットワークの出力層でよく使われる交差エントロピー誤差が学習速度の観点から重宝される理由を直感的に理解するために、グラフにして可視化してみました。

関数の形をグラフにすることでよく理解できました。結論のグラフだけ見たい人は、この記事の最後から2番目と3番目のグラフを参照。

この記事では $x_1, x_2$ はソフトマックス関数の入力、 $y_1, y_2$ はソフトマックス関数の出力であり損失関数の入力、$E$は損失関数の出力を表すものとします。

グラフの作成にはJupyter Notebook上でmatplotlibを使いました。

# ソフトマックス関数のグラフ

まずは、2クラスのソフトマックス関数をグラフにします。クラス1と2があって、入力を $x_1, x_2$ とし、出力を $y_1, y_2$ としたときのグラフです。

```math
\begin{align}
y_1 =& \frac{e^{x_1}}{e^{x_1} + e^{x_2}} = 1 - y_2 \\
=& \frac{1}{1 + e^{x_2-x_1}} \\
y_2 =& \frac{e^{x_2}}{e^{x_1} + e^{x_2}} = 1 - y_1 \\
=& \frac{1}{1 + e^{x_1-x_2}} \\
\end{align}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/6d1e0b14-addf-f098-7801-e6b9242a0957.png)

横軸は$x_1$、奥方向の軸は$x_2$、縦軸は$y_1$です。

$y_2$は $y_2 = 1 - y_1$ ですので、$y_1$を縦方向に反転した形になります。

正解ラベルが1、つまりソフトマックス関数の出力 $y_1=1, y_2=0$ は右下のほうの $y_1$ が1に近いエリアです。$x_1$が大きく$x_2$が小さいほど正解に近づきます。

少しだけ反時計回りに回転させたグラフも載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/ed049efd-140d-321c-3071-67f8e965eef2.png)

右方向の軸は$x_1$、左方向の軸は$x_2$、縦軸は$y_1$です。

シグモイド関数を2次元に拡張したようなイメージです。

実際、数式を見れば、ソフトマックス関数のグラフの断面はシグモイド関数と一致することがあきらかです。

シグモイド関数は次のとおりです。

```math
y = \frac{1}{1+e^{-x}}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/7c79c0d3-6396-62d0-821a-6840dc6f9ec2.png)

# 2乗誤差のグラフ

次に交差エントロピー誤差との比較のために2乗誤差を見てみます。1次元で正解が1のときの2乗誤差は次のようになります。

```math
E = \frac{1}{2}(y - 1)^2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/322d3b8f-c23f-ec5f-2964-51f11b6b9f08.png)

これを2次元に拡張して、正解が $y_1=1, y_2=0$ のときの2乗誤差は次のようになります。

```math
E = \frac{1}{2}((y_1 - 1)^2 + {y_2}^2)
```

これにソフトマックス関数を組み合わせると次のようになります。

```math
E = {y_2}^2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/93c3c555-c1ba-7c1c-1580-6d3086d70c50.png)

横軸は$x_1$、奥方向の軸は$x_2$、縦軸は$E$です。

見づらいので少しだけ反時計回りに回転させたグラフも載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/65d879e2-6046-8505-37a4-3fd984f74376.png)

右方向の軸は$x_1$、左方向の軸は$x_2$、縦軸は$E$です。

右下のほうの正解エリアでは$E$はほぼ0です。

ニューラルネットワークの学習が進むにつれ、右のほうの正解エリアに移動していくことが期待されます。このグラフを見ると真ん中のエリアでは傾きが急なので速く転げ落ちそう（=学習が速く進みそう）ですが、それよりも左のエリアだと傾きが平坦に近く、学習がなかなか進まないです。学習開始時点で偶然大きく左のエリアに入ってしまうと、なかなか抜け出せなくて、ちっとも学習できないのです。2乗誤差の欠点です。

# 交差エントロピー誤差のグラフ

正解が $y_1=1, y_2=0$ のときの交差エントロピー誤差は$y_1$だけで表せます。

```math
E = -\log{y_1}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/e9a3de73-db69-9731-d529-7be71753d771.png)

横軸は$y_1$、縦軸は誤差$E$です。単に自然対数のグラフを上下反転しただけです。

ソフトマックス関数と交差エントロピー誤差を組み合わせると次のようになります。

```math
\begin{align}
E =& -\log{ \frac{e^{x_1}}{e^{x_1} + e^{x_2}} } \\
=& \log(1 + e^{x_2-x_1})\\
\end{align}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/bf32de41-fb7f-0ece-9aab-63e5f1f347fc.png)

横軸は$x_1$、奥方向の軸は$x_2$、縦軸は$E$です。

右下のほうの正解エリアでは$E$はほぼ0です。逆の左上のほうは正解から遠く、$E$が大きいのですが、2乗誤差と違って、平坦にはならずに傾きが維持されているので、ニューラルネットワークの学習は速いです。ニューラルネットワークの出力層で交差エントロピーがよく使われる理由のひとつはこの点だと思われます。このグラフを見たかったのがこの記事の目的でした。

少しだけ反時計回りに回転させたグラフも載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/598152e5-21f9-a7ea-bfca-b32446ac44ac.png)

右方向の軸は$x_1$、左方向の軸は$x_2$、縦軸は$E$です。

ここからはおまけです。グラフを見て気が付いたのですが、断面はReLU(rectified linear)に似てますね。実際、数式を見れば、ReLUを滑らかにしたSoftplusという活性化関数と一致することがあきらかです。

Softplus関数は次のとおりです。


```math
y = \log(1 + e^x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/6771d203-b137-8682-9267-655a80ad0dd0.png)

このことから、中間層では学習速度の問題でシグモイド関数の代わりにReLUやSoftplusなどが使われますが、同じ理由だということがわかりますね。

なお、ソフトマックス関数とクロスエントロピー誤差の組み合わせの偏微分は簡単な形になります。

```math
\begin{align}
E =& \log(1 + e^{x_2-x_1})\\
\frac{\partial E}{\partial x_1} =& \frac{-e^{x_2-x_1}}{1 + e^{x_2-x_1}} \\
=& -\frac{e^{x_2}}{e^{x_1}+e^{x_2}} \\
=& -y_2 \\
=& y_1 - 1 \\
\frac{\partial E}{\partial x_2} =& \frac{e^{x_2-x_1}}{1 + e^{x_2-x_1}} \\
=& \frac{e^{x_2}}{e^{x_1}+e^{x_2}} \\
=& y_2 \\
\end{align}
```

グラフと見比べてみても、確かになんとなくこうなりそうです。

以上。