What is KL Divergence?

If you've worked with Variational Autoencoders (VAEs) or t-SNE, you've likely encountered the term Kullback-Leibler (KL) Divergence. It's often described as a way to measure the "distance" between two probability distributions.

But calling it a "distance" is slightly misleading because it's not symmetric (going from A to B isn't the same as B to A). Instead, think of it as a measure of surprise or inefficiency.

Definition: KL Divergence measures how much information is lost (or how many extra bits are needed) when we use a distribution \( Q \) to approximate a true distribution \( P \).

The Intuition: Wasted Bits

The best way to understand KL Divergence is through Information Theory. Imagine you want to send messages to a friend using binary code (0s and 1s). You want to be efficient: use short codes for common words and long codes for rare words.

Scenario A: Perfect Knowledge

If you know the true distribution \( P \) of words perfectly, you can design an optimal code. For example, if "the" appears 50% of the time, you give it a 1-bit code (e.g., "0").

Scenario B: The Approximation

Now imagine you don't know \( P \). Instead, you use an estimated distribution \( Q \). You design your code based on \( Q \).

If \( Q \) is different from \( P \), your code will be inefficient. You might assign a long code (e.g., "11001") to a word that actually appears very frequently. That inefficiency—the average number of extra bits you need per message—is exactly the KL Divergence!

Information Cost Comparison
✓ Perfect Knowledge (P)
3 bits (Entropy)

Using optimal code based on true distribution P

→
✗ Approximation (Q)
5 bits (Cross-Entropy)

Using suboptimal code based on approximation Q

KL Divergence = Cross-Entropy - Entropy
DKL(P || Q) = 5 - 3 = 2 wasted bits

Figure 1: KL Divergence represents the "wasted bits" when using an approximation Q instead of the true P.

The Mathematical Formula

Let's translate that intuition into math. For discrete distributions \( P \) and \( Q \):

\[ D_{KL}(P || Q) = \sum_{x} P(x) \log \left( \frac{P(x)}{Q(x)} \right) \]

Let's break this down:

  • \( P(x) \): The weight of the event (we care more about frequent events).
  • \( \log(P(x) / Q(x)) \): The "surprise" or difference in log-probabilities.
  • If \( P(x) \approx Q(x) \), the ratio is ~1, and \( \log(1) = 0 \). No divergence!
  • If \( P(x) \) is high but \( Q(x) \) is low, the ratio is huge, creating a large penalty.
Note: \( D_{KL}(P || Q) \geq 0 \). It is zero if and only if \( P = Q \).

The Asymmetry: Forward vs Reverse KL

One of the most important properties of KL Divergence is that it is not symmetric:

\[ D_{KL}(P || Q) \neq D_{KL}(Q || P) \]

This has huge implications for machine learning, especially when we are trying to fit a simple distribution \( Q \) (like a Gaussian) to a complex distribution \( P \).

Forward KL: \( D_{KL}(P || Q) \)

"Mean Seeking"

We weight by \( P(x) \). If \( P(x) > 0 \), then \( Q(x) \) MUST be \( > 0 \). This forces \( Q \) to stretch out and cover the entire support of \( P \).

Result: A blurry, wide approximation.

Reverse KL: \( D_{KL}(Q || P) \)

"Mode Seeking"

We weight by \( Q(x) \). We only pay a penalty where \( Q(x) > 0 \). \( Q \) can ignore parts of \( P \) as long as it fits one part really well.

Result: A sharp fit on one mode, ignoring others.

Forward KL vs Reverse KL: The Asymmetry
Forward KL: DKL(P || Q)
"Mean Seeking"
P (True) Q (Wide fit)

✓ Covers all of P

✗ Blurry, unfocused

✗ High variance

Reverse KL: DKL(Q || P)
"Mode Seeking"
P (True) Q (Sharp)

✓ Sharp, focused fit

✓ Low variance

✗ Ignores other modes

Figure 2: Forward KL (left) tries to cover everything, resulting in a wide mean. Reverse KL (right) focuses on fitting one mode perfectly.

Real-World Applications

1. Variational Autoencoders (VAEs)

VAEs use KL Divergence in their loss function. They try to compress images into a "latent space" that follows a standard Normal distribution. The loss function is:

\[ \text{Loss} = \text{Reconstruction Loss} + D_{KL}(Q(z|x) || \mathcal{N}(0,1)) \]

The KL term forces the learned encodings to stay close to a standard Gaussian, preventing the model from cheating by memorizing data points in far-away corners of the space.

2. t-SNE (Visualization)

t-SNE minimizes the KL divergence between the high-dimensional probability distribution of neighbors and the low-dimensional distribution. It effectively preserves local structure by ensuring that points close in high-D remain close in low-D.

Python Implementation

import numpy as np from scipy.special import rel_entr # Define two probability distributions p = np.array([0.1, 0.5, 0.4]) # True distribution q = np.array([0.2, 0.4, 0.4]) # Approximation # Calculate KL(P || Q) manually def kl_divergence(p, q): return np.sum(p * np.log(p / q)) print(f"KL(P || Q): {kl_divergence(p, q):.4f} nats") # Using Scipy (rel_entr calculates P * log(P/Q) element-wise) kl_scipy = sum(rel_entr(p, q)) print(f"Scipy Result: {kl_scipy:.4f} nats")

Conclusion

KL Divergence is more than just a formula; it's a fundamental measure of information loss. Whether you're training a generative model or visualizing complex data, understanding that KL measures "wasted bits" and knowing the difference between forward (mean-seeking) and reverse (mode-seeking) KL is a powerful tool in your ML toolkit.

← Back to Blog