KL-Divergenz visualisieren -- Wie stark sich zwei Verteilungen unterscheiden
Passe die Parameter zweier Gauß-Verteilungen an, berechne und vergleiche KL(P||Q) und KL(Q||P) und erlebe intuitiv die Asymmetrie der KL-Divergenz.
Nach Abschluss dieses Beispiels wirst du verstehen:Die KL-Divergenz ist keine 'Distanz' — Q von P aus zu betrachten und P von Q aus zu betrachten, der Informationsverlust ist unterschiedlich.
Alltägliche Einführung
Mit einer Peking-Karte in New York den Weg finden
Du hast zwei Karten: die echte New-York-Karte (P) und die Peking-Karte (Q). Wenn du mit der Peking-Karte in New York läufst, musst du zusätzlichen Aufwand betreiben, um die falschen Informationen auf der Karte zu 'korrigieren' — dieser zusätzliche Aufwand ist KL(P||Q). Umgekehrt, wenn du mit der New-York-Karte in Peking läufst — der zusätzliche Aufwand ist KL(Q||P). Diese beiden Arten von zusätzlichem Aufwand sind deutlich unterschiedlich, weil die beiden Karten auf unterschiedliche Weise 'falsch liegen'.
Intuitive Vorstellung
Szenario A: P~N(0,1), Q~N(2,1) — unterschiedliche Mittelwerte, aber gleiche Form; KL ist nahezu symmetrisch.
Szenario B: P~N(0,1), Q~N(0,3) — gleiches Zentrum, aber unterschiedliche Varianzen. KL(P||Q) = 1.10 (schmal → breit, einfach), KL(Q||P) = 1.55 (breit → schmal, schwierig). Deutlich asymmetrisch — 'eine schmale Verteilung mit einer breiten abdecken' ist viel einfacher als 'eine breite Verteilung mit einer schmalen abdecken'.
Mathematische Definition
\[ 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) \]Die Entropie von P selbst ist konstant, also ist Minimierung der Kreuzentropie = Minimierung der KL-Divergenz.
Praktische Python-Übung
Beispiel
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]
# Szenario A: unterschiedliche Mittelwerte
P_A = gaussian_pdf(x, mu=0, sigma=1) * dx
Q_A = gaussian_pdf(x, mu=2, sigma=1) * dx
# Szenario B: unterschiedliche Varianzen
P_B = gaussian_pdf(x, mu=0, sigma=1) * dx
Q_B = gaussian_pdf(x, mu=0, sigma=3) * dx
print("BEISPIEL Überprüfung der KL-Divergenz-Asymmetrie:\n")
print("Szenario 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"\nSzenario B: P~N(0,1) vs Q~N(0,3)")
print(f" KL(P||Q) = {kl_divergence(P_B, Q_B):.4f} (schmal -> breit, einfach)")
print(f" KL(Q||P) = {kl_divergence(Q_B, P_B):.4f} (breit -> schmal, schwierig)")
print(f"\nBEISPIEL Intuition: 'eine schmale Verteilung mit einer breiten abdecken' ist einfach (kleine KL), 'eine breite Verteilung mit einer schmalen abdecken' ist schwierig (große KL)")
EXAMPLE 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 (宽->窄,困难) EXAMPLE 直觉:'用宽覆盖窄'容易(KL小),'用窄覆盖宽'困难(KL大)
Anwendungsszenarien in der KI
| Szene | Wie verwendet man die KL-Divergenz? |
|---|---|
| VAE | Die Kodierungsverteilung nahe an die Standardnormalverteilung bringen — Verlust = Rekonstruktionsfehler + KL(Kodierung || N(0,1)) |
| Wissensdestillation | Die vorhergesagte Verteilung des Studentenmodells an das Lehrermodell angleichen — minimiere KL(teacher||student). |
| PPO-Verstärkungslernen | Verwende die KL-Divergenz, um den Unterschied zwischen alten und neuen Policies zu begrenzen und zu verhindern, dass Updates zu groß werden. |