KLダイバージェンスの可視化 -- 2つの分布はどれだけ違うか
2つのガウス分布のパラメータを調整し、KL(P||Q) と KL(Q||P) を計算して比較し、KLダイバージェンスの非対称性を直感的に感じ取ります。
このケースを学び終えると、以下のことが理解できます:KLダイバージェンスは「距離」ではない——P から Q を見るのと Q から P を見るのでは、情報損失が異なります。
生活からの導入
北京の地図を使ってニューヨークで道を探す
あなたは2冊の地図を持っています:本物のニューヨークの地図(P)と北京の地図(Q)です。北京の地図を使ってニューヨークを歩く場合、地図の誤った情報を「修正」するために多くの余分な労力を費やす必要があります——この余分な消費が KL(P||Q) です。逆に、ニューヨークの地図を使って北京を歩く場合——余分な消費が KL(Q||P) です。この2つの余分な消費は明らかに異なります。なぜなら、2冊の地図の「誤り方」が異なるからです。
直感的理解
シーン A:P~N(0,1), Q~N(2,1)——平均は異なるが形状は同じで、KL はほぼ対称です。
シーン B:P~N(0,1), Q~N(0,3)——中心は同じだが分散が異なります。KL(P||Q) = 1.10(狭→広、容易)、KL(Q||P) = 1.55(広→狭、困難)。明らかに非対称です——「広いもので狭いものを覆う」方が「狭いもので広いものを覆う」よりはるかに容易です。
数学的定義
\[ D_{KL}(P \parallel Q) = \sum_{x} P(x) \cdot \log\frac{P(x)}{Q(x)} \] \[ D_{KL}(P \parallel Q) = H(P, Q) - H(P) \]P 自身のエントロピーは定数なので、交差エントロピーの最小化 = KLダイバージェンスの最小化です。
Python で実践
実例
import numpy as np
def gaussian_pdf(x, mu, sigma):
return (1 / (sigma * np.sqrt(2 * np.pi))) * \
np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))
def kl_divergence(p, q, eps=1e-12):
p = np.clip(p, eps, None)
q = np.clip(q, eps, None)
return np.sum(p * np.log(p / q))
x = np.linspace(-10, 10, 2000)
dx = x[1] - x[0]
# シーン A:平均が異なる
P_A = gaussian_pdf(x, mu=0, sigma=1) * dx
Q_A = gaussian_pdf(x, mu=2, sigma=1) * dx
# シーン B:分散が異なる
P_B = gaussian_pdf(x, mu=0, sigma=1) * dx
Q_B = gaussian_pdf(x, mu=0, sigma=3) * dx
print("サンプル KLダイバージェンス非対称性の検証:\n")
print("シーン A:P~N(0,1) vs Q~N(2,1)")
print(f" KL(P||Q) = {kl_divergence(P_A, Q_A):.4f}")
print(f" KL(Q||P) = {kl_divergence(Q_A, P_A):.4f}")
print(f"\nシーン B:P~N(0,1) vs Q~N(0,3)")
print(f" KL(P||Q) = {kl_divergence(P_B, Q_B):.4f} (狭->広、容易)")
print(f" KL(Q||P) = {kl_divergence(Q_B, P_B):.4f} (広->狭、困難)")
print(f"\nサンプル 直感:'広いもので狭いものを覆う'は容易(KL小)、'狭いもので広いものを覆う'は困難(KL大))
def gaussian_pdf(x, mu, sigma):
return (1 / (sigma * np.sqrt(2 * np.pi))) * \
np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))
def kl_divergence(p, q, eps=1e-12):
p = np.clip(p, eps, None)
q = np.clip(q, eps, None)
return np.sum(p * np.log(p / q))
x = np.linspace(-10, 10, 2000)
dx = x[1] - x[0]
# シーン A:平均が異なる
P_A = gaussian_pdf(x, mu=0, sigma=1) * dx
Q_A = gaussian_pdf(x, mu=2, sigma=1) * dx
# シーン B:分散が異なる
P_B = gaussian_pdf(x, mu=0, sigma=1) * dx
Q_B = gaussian_pdf(x, mu=0, sigma=3) * dx
print("サンプル KLダイバージェンス非対称性の検証:\n")
print("シーン A:P~N(0,1) vs Q~N(2,1)")
print(f" KL(P||Q) = {kl_divergence(P_A, Q_A):.4f}")
print(f" KL(Q||P) = {kl_divergence(Q_A, P_A):.4f}")
print(f"\nシーン B:P~N(0,1) vs Q~N(0,3)")
print(f" KL(P||Q) = {kl_divergence(P_B, Q_B):.4f} (狭->広、容易)")
print(f" KL(Q||P) = {kl_divergence(Q_B, P_B):.4f} (広->狭、困難)")
print(f"\nサンプル 直感:'広いもので狭いものを覆う'は容易(KL小)、'狭いもので広いものを覆う'は困難(KL大))
サンプル KL 散度不对称性验证: 场景 A:P~N(0,1) vs Q~N(2,1) KL(P||Q) = 2.0000 KL(Q||P) = 1.9960 场景 B:P~N(0,1) vs Q~N(0,3) KL(P||Q) = 1.0990 (窄->宽,容易) KL(Q||P) = 1.5490 (宽->窄,困难) サンプル 直觉:'用宽覆盖窄'容易(KL小),'用窄覆盖宽'困难(KL大)
AI での応用シーン
| シーン | KLダイバージェンスの使用方法 |
|---|---|
| VAE | エンコーディング分布を標準正規分布に近づける——損失 = 再構成誤差 + KL(エンコーディング||N(0,1)) |
| 知識蒸留 | 学生モデルの予測分布を教師モデルに近づける——KL(教師||学生) を最小化する |
| PPO 強化学習 | KLダイバージェンスを使用して新旧ポリシーの差異を制約し、更新が大きくなりすぎるのを防ぐ |