😡

エントロピー、交差エントロピー、KLダイバージェンス ってなに

2024/06/20に公開

機械学習で何かと出てくる香具師
丁寧に説明してないから足りないとこは自分で勉強汁

エントロピー

確率分布p(x)の乱雑さを表す値
値が大きいほど予測しにくいらしい。知らんけど。

H(p) = -\sum_{x} p(x) \log p(x)
import numpy as np
# 確率分布pを定義
p = np.array([0.4, 0.3, 0.1, 0.1, 0.05, 0.05])
# エントロピーの計算 1.487798380001651
ent = -np.sum(p * np.log(p))
print("エントロピー:", ent)

交差エントロピー

2つの確率分布間の差異を測定するために使用される尺度
具体的には、近似した分布q(x)が真の分布p(x)をどれだけうまく表現できているのかを示している

H(p, q) = -\sum_{x} p(x) \log q(x)
import numpy as np
# 真の確率分布p
p = np.array([0.4, 0.3, 0.1, 0.1, 0.05, 0.05])
# 近似した確率分布q
q = np.array([0.3, 0.3, 0.2, 0.1, 0.05, 0.05])
# 交差エントロピーの計算 1.5335564909263688
cross_entropy = -np.sum(p * np.log(q))
print("交差エントロピー:", cross_entropy)

KLダイバージェンス(Kullback-Leibler divergence)

交差エントロピーからエントロピーを引いた値
近似した分布q(x)と真の分布p(x)の差(ずれ)がわかる

D_{KL}(p \parallel q) = \sum_{x} p(x) \log \left( \frac{p(x)}{q(x)} \right)

最初に書いてるように「交差エントロピーからエントロピーを引いて」計算できるンゴ

D_{KL}(p \parallel q) = H(p, q) - H(p)

交差エントロピーからエントロピーを引いているので、予測された分布q(x)が真の分布p(x)と全く同じになれば、KLダイバージェンスは0になる。
逆にずれが大きければ大きいほど、KLダイバージェンスは大きくなる。
負の値を取ることはない。

import numpy as np
# 真の確率分布p
P = np.array([0.4, 0.3, 0.1, 0.1, 0.05, 0.05])
# 近似した確率分布q
Q = np.array([0.3, 0.3, 0.2, 0.1, 0.05, 0.05])
# KLダイバージェンスの計算 0.04575811092471789
kl_divergence = np.sum(P * np.log(P / Q))
print("KLダイバージェンス:", kl_divergence)

#交差エントロピーからエントロピーを引いても結果は同じ
# 交差エントロピーの計算
cross_entropy = -np.sum(P * np.log(Q))
# エントロピーの計算 0.04575811092471782
ent = -np.sum(P * np.log(P))
print("KLダイバージェンス:",cross_entropy - ent)

いかがでしたか

離散化した確率分布でコード書いたけど、暇なときに連続確率分布で実装して追記するかもー!
(なんかグラフで見れたほうがわかりやすそうな希ガス)

Discussion