1. kenta1984

    No comment

    kenta1984
Changes in body
Source | HTML | Preview
@@ -1,82 +1,84 @@
+_※コメントで間違いを指摘頂いたので記事を修正しました(2020/3/30)_
+
教師あり機械学習では必須の損失関数。
教師あり機械学習の場合、学習するというのは損失関数の値を小さくする事とほぼ同義になります。
損失関数について詳しく知りたい方は、[最適化から見たディープラーニングの考え方](http://www.orsj.or.jp/archive2/or60-4/or60_4_191.pdf)という論文をご覧下さい。
損失関数に限らず、損失関数の最適化手法や活性化関数などについてもわかりやすく説明されています。
そして、損失関数には幾つもの種類がありますが、交差エントロピー誤差は有名な損失関数の一つです。
本記事では、交差エントロピー誤差をわかりやすく説明してみます。
なお、英語では交差エントロピー誤差のことを`Cross-entropy Loss`と言います。`Cross-entropy Error`と英訳している記事もありますが、英語の文献では`Cross-entropy Loss`と呼んでいる記事の方が多いです[^1]。
# 式
交差エントロピー誤差を式で表現すると次のようになります。なお、この$log$は自然対数(底が$e$)です。
``` math
H(p, q) = -\sum_{x} p(x) log(q(x))
```
$p$は真の確率分布、$q$は推定した確率分布です。
$p$と$q$の確率分布が似ていると交差エントロピー誤差は小さくなり、似ていないと交差エントロピー誤差は大きくなります。
ただ、式だけだといまいちイメージが付きませんよね…。
# 例
式だけだとわかりにくいので、わかりやすいように例をあげます。
今、写真に映っている果物が、
- バナナ
- りんご
- みかん
のどれかを予測するとします。
写真に映っている果物がバナナの場合、真の確率分布$p$は`(1, 0, 0)`となります。
そして、推定した確率分布$q$が`(0.8, 0.1, 0.1)`だったとします。
この場合、交差エントロピー誤差は次のようになります。
``` math
\begin{align}
H(p, q)& = -(1*log0.8 + 0*log0.1 + 0*log0.1) \\
& = -(log0.8) \\
& = -(-0.09) \\
& = 0.09
\end{align}
```
一方、推定した確率分布$q(x)$が`(0.3, 0.4, 0.3)`だったとします。
この場合、交差エントロピー誤差は次のようになります。
``` math
\begin{align}
H(p, q)& = -(1*log0.3 + 0*log0.4 + 0*log0.3) \\
& = -(log0.3) \\
& = -(-0.52) \\
& = 0.52
\end{align}
```
交差エントロピー誤差は後者よりも前者の方が小さくなっており、真の確率分布$p$に近いのは前者の確率分布$q$であることが分かります。
直感とも一致するので、交差エントロピー誤差が損失関数として適していることが分かります。
# 2乗和誤差との違い
2乗和誤差を式で表現すると次のようになります。
交差エントロピー誤差と異なり、シンプルで直感的にも分かりやすい式となります。
``` math
L = -\frac{1}{2}\sum_{x=1}^{N} (p(x) - q(x))^2
```
計算式が異なるので両者は違う誤差関数ですが、どちらの誤差関数を使えば良いのでしょうか?
結論としては、交差エントロピー誤差の方が使われることが多いです。
理由は、交差エントロピー誤差は確率的勾配降下法との相性が良いからです。
確率的勾配降下法という手法は、大雑把に言えば、微分から傾きを求めて損失関数が小さくなる方向に進んでいくことで最適化を図る手法です。
その際に、
- 自然対数$log(x)$を微分すると$1/x$
- $e^x$を微分しても積分しても$e^x$
という性質が計算式が複雑になるのを防ぎます。
損失関数の最適化手法としては確率的勾配降下法が使われることが多く、そのため交差エントロピー誤差が使われる場面も多くなります。
[^1]: 「"Cross-entropy loss"」のGoogleの検索結果は約187,000件に対し、「"Cross-entropy error"」のGoogleの検索結果は約28,800件(2019年12月23日時点)
[^2]: 出力値の合計が1になる関数。ディープラーニングなどのニューラルネットワークの出力層の活性化関数として使われることが多い。