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

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]

# 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

SzeneWie verwendet man die KL-Divergenz?
VAEDie Kodierungsverteilung nahe an die Standardnormalverteilung bringen — Verlust = Rekonstruktionsfehler + KL(Kodierung || N(0,1))
WissensdestillationDie vorhergesagte Verteilung des Studentenmodells an das Lehrermodell angleichen — minimiere KL(teacher||student).
PPO-VerstärkungslernenVerwende die KL-Divergenz, um den Unterschied zwischen alten und neuen Policies zu begrenzen und zu verhindern, dass Updates zu groß werden.
Weitere Erweiterungen