エントロピー・クロスエントロピー・正規化エントロピー

[NE(Normalized Entropy)](https://quinonero.net/Publications/predicting-clicks-facebook.pdf)という言葉に仕事で出会い、今まで「クロスエントロピー」などで使っていた「エントロピー」ってそもそも何？と思い調べました。
[Wikipedia「情報量」](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E9%87%8F)には以下の記載があります。ちょっとわかりにくいですね。個人的には「**情報の価値の総和**」と覚えました。
> 情報量（じょうほうりょう）やエントロピー（英: entropy）は、情報理論の概念で、あるできごと（事象）が起きた際、それがどれほど起こりにくいかを表す尺度である。

※もともとは[熱力学や統計力学の言葉](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC)っぽいですが、今回は情報理論的な側面の焦点を当てています。

# 選択情報量(自己エントロピー)と平均情報量(エントロピー)
エントロピーに以下の2種類あるらしいです。**単純に「エントロピー」と言うと「平均情報量(エントロピー)」を指すよう**です(あまり深く確認していません)。平均情報量(エントロピー)」が少しわかりにくいですが、コイン裏表が同確率の場合に、どちらが起こるかという情報の価値が高い、と理解しています。

|種類|内容|　　　　計算式　　　　　|
|:-:|:--|:-:|
|選択情報量<br>(自己エントロピー)|事象単体の情報量<br>**確率が低い事象ほど高い**|$- \log P(E)$|
|平均情報量<br>(エントロピー)|事象の情報量の平均値<br>**同確率ほど高い**|$- \sum_{A \in \Omega} P(A) \log P(A) $|

logの底は計算しやすい2を使う場合が多いようですが、相対的な数値が重要なので何でもいいらしいです。いつもすぐに出てこないlog(対数関数)は以下を参照。

<details><summary>log(対数関数)のグラフ</summary><div>

画像は[Wikipedia](https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0)から拝借。x=1は必ず0を通り、log(底の値)=1です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/b79d0c8c-8504-7066-cb9d-5cbdf9a96dfa.png)
各色の曲線の底
- 緑: 10
- 赤: ネイピア数 e 
- 紫: 1.7 

</div></details>

以下は例です。

|例|選択情報量|平均情報量|
|:-:|:--|:--|
|太陽は東から昇る|**低**(ゼロ): 必ず起こる事象だから|**低**(ゼロ): 必ず起こる事象だから
|次に出るサイコロの目は1|**高**: 1/6の確率を言い当てているから|**中**: 1/6と5/6確率の平均だから|

先程の例で計算式にします(底は2で端数は雑に表現)。

|例|Entropy|計算式　　　　　　　　　　　　　|
|:-:|:-:|:--|
|選択情報量<br>100%<br>太陽は東から昇る|0|$- \log P(E) $ <br> $= -\log 1$|
|平均情報量<br>100%<br>太陽は東から昇る|0|$-p(0)\log p(0)-p(1)\log p(1)$ <br> $=0 \times \infty - 1 \times 0$|
|選択情報量<br>17%<br>次のサイコロの目は1|2.58|$- \log P(E) $ <br> $= -\log \frac{1}{6}$|
|平均情報量<br>17%<br>次のサイコロの目は1|0.65|$-p(0)\log p(0)-p(1)\log p(1)$ <br> $=- \frac{5}{6} \log \frac{5}{6} - \frac{1}{6} \log \frac{1}{6}$ <br> $ = -\frac{5}{6} \times -0.3 - \frac{1}{6} \times -2.6$ <br> $= 0.21+ 0.43 $|

## 二値分類時平均情報量(エントロピー)の一覧
Excelで二値分類のときのエントロピーを一覧化しました。五分五分のときにエントロピーが最も高くなります。
「**確率からどちらが起こるかわからない場合に、それがわかると価値が高い**」と理解しています。コインの裏か表か、わからない場合にそれがわかることが情報価値が高い、ということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/931f4add-f46a-73ff-72f2-0b7497318bfa.png)

# クロスエントロピー(交差エントロピー)
馴染み深い[「交差エントロピー」](https://ja.wikipedia.org/wiki/%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC)です。機械学習の分類問題で「クロスエントロピー誤差」としてよく出ます。真と予測の**2つの確率分布を交差**させてエントロピーを計算。[はじパタのロジスティック回帰](https://qiita.com/FukuharaYohei/items/f1933c0430704f86c60a#643-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E6%9C%80%E5%B0%A4%E6%8E%A8%E5%AE%9A)や[Courseraの機械学習入門コース](https://qiita.com/FukuharaYohei/items/270c629fd74a7da4b9da#12-logistic-regression-model)でやっていますね。**log loss やロジスティック損失とも呼ばれます**。
離散確率変数でも連続確率変数でも計算できますが、機械学習では離散確率変数目的で使うことも多いと思うので、離散確率変数だけを説明。
2つの離散確率変数p(x)とq(x)でのクロスエントロピーは以下の式。

```math
H(p, q) = -\sum_{x} p(x) \log(q(x))
```

2値分類だと以下の式にできます。

```math
H(p, q) = -y \log \hat{y} - (1-y) \log(1-\hat{y}) \\
p \in \{y, 1-y\}, q \in \{ \hat{y}, 1-\hat{y}\}
```

2値分類でのクロスエントロピー誤差の場合、真の確率は1/0なので、計算がわかりやすいです。
例えば有名な[Kaggleのタイタニック](https://www.kaggle.com/c/titanic)のように生死予測(生=1)だとして、以下の計算例です。
※対数関数の底は2で計算

|正解(y)|予測($\hat(y)$)|誤差|計算式　　　　　　　　　　　　　　　<br>$-y \log \hat{y} - (1-y) \log(1-\hat{y})$|
|:-:|:-:|:-:|:--|
|0|0|0|$-0 \log 0 - (1-0) log (1-0)$|
|0|1|$\infty$|$-0 \log 1 - (1-0) log (1-1)$|
|1|0|$\infty$|$-1 \log 0 - (1-1) log (1-0)$|
|1|0.25|2|$-1 \log 0.25 - (1-1) log (1-0.25)$|
|1|0.5|1|$-1 \log 0.5 - (1-1) log (1-0.5)$|
|1|0.75|0.42|$-1 \log 0.75 - (1-1) log (1-0.75)$|
|1|1|0|$-1 \log 1 - (1-1) log (1-1)$|

# 正規化クロスエントロピー
先程のクロスエントロピー誤差を正規化したものを正規化エントロピーと呼びます。Normalized Cross-Entropy, Normalized Log Loss, Normalized Entropy(NE) などとも呼ばれます。CTR予測をしているときに[Practical Lessons from Predicting Clicks on Ads at Facebook](https://quinonero.net/Publications/predicting-clicks-facebook.pdf)で学びました。
除算の線形変換をする点では、通常の正規化と変わりません。分母はエントロピー(平均情報量)です。すべての予測値を平均値にした場合に値が1です。
以下が計算式です。

```math
\frac{LogLoss}{- (p * log (p) + (1-p) * log (1-p) )} 
= \frac{- \frac{1}{N} \sum_{i=1}^{N}  y_i log (p_i) + (1 - y_i) log (1 - p_i)}{- (p * log (p) + (1-p) * log (1-p) )}
```

# 参考リンク

https://www.hellocybernetics.tech/entry/2016/04/20/194040

https://ichi.pro/kikai-gakushu-no-entoropi-85618734972549

https://deychak.github.io/normalized-cross-entropy