Divergência KL (Divergência de Kullback–Leibler)

Visão geral

A divergência KL (KL divergence), também conhecida como divergência de Kullback–Leibler (Kullback–Leibler divergence) e frequentemente escrita como (D_{\mathrm{KL}}(P|Q)), mede o quão diferente uma distribuição de probabilidade (P) é de outra distribuição (Q). Em aprendizado de máquina (machine learning), a divergência KL aparece em toda parte: como uma forma de entender a perda logarítmica (log-loss), de conectar entropia cruzada (cross-entropy) à máxima verossimilhança (maximum likelihood), de derivar o limite inferior da evidência (Evidence Lower Bound, ELBO) em Inferência Variacional, e de restringir atualizações de política em objetivos no estilo RLHF/PPO (RLHF/PPO-style).

A divergência KL não é uma “distância” no sentido matemático estrito (ela é assimétrica e não satisfaz a desigualdade triangular), mas é uma discrepância da teoria da informação (information-theoretic discrepancy) fundamental.

Para um contexto mais amplo junto de entropia e informação mútua, veja: Entropia, KL, Informação Mútua.

Definição

Distribuições discretas

Sejam (P) e (Q) distribuições sobre um conjunto discreto (\mathcal{X}), com probabilidades (p(x)) e (q(x)). A divergência KL de (Q) para (P) é:

[ D_{\mathrm{KL}}(P|Q) ;=; \sum_{x \in \mathcal{X}} p(x),\log\frac{p(x)}{q(x)}. ]

O log geralmente é o log natural em aprendizado de máquina (unidades: nats). Usar (\log_2) dá unidades de bits.

Requisito de suporte: se existe algum (x) com (p(x)>0) mas (q(x)=0), então (D_{\mathrm{KL}}(P|Q)=\infty). Intuitivamente, (Q) atribui probabilidade zero a algo que de fato acontece sob (P), o que é “infinitamente surpreendente” sob perda logarítmica.

Distribuições contínuas

Para densidades (p(x)) e (q(x)) sobre (\mathbb{R}^d):

[ D_{\mathrm{KL}}(P|Q) ;=; \int p(x),\log\frac{p(x)}{q(x)},dx, ]

assumindo que (P) é absolutamente contínua em relação a (Q) (mesma ideia: não há massa sob (P) onde (q(x)=0)).

Forma equivalente como esperança

Uma forma muito comum em aprendizado de máquina:

[ D_{\mathrm{KL}}(P|Q) = \mathbb{E}_{x\sim P}\left[\log p(x) - \log q(x)\right]. ]

Isso deixa claro que a divergência KL é uma razão de log-verossimilhança esperada (expected log-likelihood ratio) sob (P).

Propriedades centrais

Não negatividade (desigualdade de Gibbs (Gibbs’ inequality))

[ D_{\mathrm{KL}}(P|Q) \ge 0, ] com igualdade sse (P=Q) quase em toda parte.

Este é um fato profundo e útil: você não consegue fazer melhor (em esperança) do que a distribuição verdadeira ao usar perda logarítmica.

Assimetria

Em geral,

[ D_{\mathrm{KL}}(P|Q) \ne D_{\mathrm{KL}}(Q|P). ]

Isso importa na prática: o KL direto (forward KL) (D_{\mathrm{KL}}(P|Q)) e o KL reverso (reverse KL) (D_{\mathrm{KL}}(Q|P)) incentivam comportamentos diferentes ao aproximar distribuições (frequentemente descritos como cobertura de massa (mass-covering) vs busca por modos (mode-seeking); veja abaixo).

Não é uma métrica

A divergência KL não satisfaz:

  • simetria
  • desigualdade triangular

Então é melhor chamá-la de divergência ou discrepância, não de distância.

Interpretações que importam em aprendizado de máquina

1) “Surpresa” extra esperada / arrependimento sob perda logarítmica

Como (D_{\mathrm{KL}}(P|Q)=\mathbb{E}_P[\log p(x)-\log q(x)]), ela mede o quanto (Q) é pior do que (P) ao pontuar resultados com log-probabilidade negativa (negative log probability).

Se você codifica amostras de (P) usando um código otimizado para (Q), a divergência KL mede o comprimento de código extra (extra codelength) esperado. Isso leva à interpretação de codificação.

2) Interpretação de codificação (compressão)

A entropia (H(P)) é o comprimento de código esperado ótimo para codificar dados gerados por (P). Se, em vez disso, você usa uma codificação ajustada a (Q), o comprimento de código esperado se torna a entropia cruzada (H(P,Q)). Então:

[ H(P,Q) = H(P) + D_{\mathrm{KL}}(P|Q). ]

Assim, a divergência KL é o excesso esperado de bits/nats que você paga por usar a distribuição errada.

3) Interpretação de verossimilhança

A divergência KL é fortemente conectada à máxima verossimilhança: minimizar a divergência KL entre a distribuição verdadeira dos dados e um modelo é equivalente a maximizar a log-verossimilhança esperada (até constantes). Esta é a base do porquê o treinamento com perda logarítmica é tão comum.

Divergência KL e entropia cruzada

Defina:

  • Entropia: (H(P) = -\mathbb{E}_P[\log p(x)])
  • Entropia cruzada: (H(P,Q) = -\mathbb{E}_P[\log q(x)])

Então:

[ D_{\mathrm{KL}}(P|Q) = H(P,Q) - H(P). ]

Ideia-chave: se você está treinando um modelo (Q_\theta) minimizando entropia cruzada em dados de (P), você também está minimizando (D_{\mathrm{KL}}(P|Q_\theta)), já que (H(P)) não depende de (\theta).

É por isso que a perda de entropia cruzada é o objetivo “certo” para classificação probabilística e modelagem de linguagem (veja também: Estimativa de Máxima Verossimilhança).

Divergência KL e treinamento por máxima verossimilhança

Assuma que os dados (x) são amostrados de uma distribuição verdadeira desconhecida (P_{\text{data}}). Você ajusta um modelo paramétrico (Q_\theta) por máxima verossimilhança:

[ \theta^* = \arg\max_\theta ; \mathbb{E}{x\sim P{\text{data}}}[\log q_\theta(x)]. ]

Equivalentemente:

[ \theta^* = \arg\min_\theta ; -\mathbb{E}{P{\text{data}}}[\log q_\theta(x)] = \arg\min_\theta ; H(P_{\text{data}}, Q_\theta). ]

E como (H(P_{\text{data}})) é constante em (\theta):

[ \arg\min_\theta H(P_{\text{data}},Q_\theta) ;\equiv; \arg\min_\theta D_{\mathrm{KL}}(P_{\text{data}}|Q_\theta). ]

Logo, máxima verossimilhança = minimizar KL direto dos dados para o modelo.

Implicação prática: comportamento de KL direto vs KL reverso

Ao aproximar uma distribuição complexa:

  • Minimizar KL direto (D_{\mathrm{KL}}(P|Q)) (dados→modelo) penaliza fortemente (Q) por atribuir baixa probabilidade onde (P) tem massa → tende a ser de cobertura de massa.
  • Minimizar KL reverso (D_{\mathrm{KL}}(Q|P)) penaliza fortemente (Q) por colocar massa onde (P) é pequeno → tende a ser de busca por modos (pode colapsar para um subconjunto de modos).

Essa diferença é central em inferência aproximada e modelagem generativa.

Exemplos concretos

Exemplo 1: distribuições de Bernoulli (lançamentos de moeda)

Seja (P=\mathrm{Bern}(p)), (Q=\mathrm{Bern}(q)). Então:

[ D_{\mathrm{KL}}(P|Q) = p\log\frac{p}{q} + (1-p)\log\frac{1-p}{1-q}. ]

Se a moeda verdadeira tem (p=0.8), mas você assume (q=0.5), a divergência KL quantifica o quão subótimas são suas probabilidades assumidas sob perda logarítmica.

Exemplo 2: KL entre gaussianas (comum em VAEs)

Para gaussianas multivariadas (P=\mathcal{N}(\mu_0,\Sigma_0)) e (Q=\mathcal{N}(\mu_1,\Sigma_1)) em (k) dimensões:

[ D_{\mathrm{KL}}(P|Q)=\frac{1}{2}\left( \mathrm{tr}(\Sigma_1^{-1}\Sigma_0) +(\mu_1-\mu_0)^\top \Sigma_1^{-1}(\mu_1-\mu_0) -k+\log\frac{\det\Sigma_1}{\det\Sigma_0} \right). ]

Essa forma fechada é o motivo de a divergência KL ser tão conveniente em métodos variacionais.

Exemplo de código: computar KL para Bernoulli

import numpy as np

def kl_bernoulli(p, q, eps=1e-12):
    p = np.clip(p, eps, 1 - eps)
    q = np.clip(q, eps, 1 - eps)
    return p*np.log(p/q) + (1-p)*np.log((1-p)/(1-q))

print(kl_bernoulli(0.8, 0.5))  # nats

Divergência KL em inferência variacional (ELBO)

Em modelagem bayesiana, você frequentemente quer o posterior:

[ p(z\mid x) = \frac{p(x,z)}{p(x)} ]

mas (p(x)=\int p(x,z),dz) pode ser intratável.

Em Inferência Variacional, você escolhe uma família aproximadora (q_\phi(z\mid x)) e tenta torná-la próxima do posterior verdadeiro minimizando:

[ D_{\mathrm{KL}}(q_\phi(z\mid x),|,p(z\mid x)). ]

Derivando o ELBO

Comece de:

[ D_{\mathrm{KL}}(q_\phi(z\mid x),|,p(z\mid x)) = \mathbb{E}{q\phi}\left[\log \frac{q_\phi(z\mid x)}{p(z\mid x)}\right]. ]

Substitua (p(z\mid x)=\frac{p(x,z)}{p(x)}):

[ D_{\mathrm{KL}} = \mathbb{E}{q\phi}\left[\log q_\phi(z\mid x)-\log p(x,z)\right] + \log p(x). ]

Reorganize:

[ \log p(x) = \underbrace{\mathbb{E}{q\phi}[\log p(x,z)-\log q_\phi(z\mid x)]}{\text{ELBO}} ;+; D{\mathrm{KL}}(q_\phi(z\mid x),|,p(z\mid x)). ]

Como (D_{\mathrm{KL}}\ge 0), o ELBO é um limite inferior para (\log p(x)). Maximizar o ELBO simultaneamente:

  • aumenta um limite inferior para a log-verossimilhança dos dados
  • diminui a divergência KL entre o posterior aproximado e o posterior verdadeiro

Essa decomposição é a razão matemática central pela qual o treinamento baseado em ELBO funciona (veja: Limite Inferior da Evidência (ELBO)).

Termos de KL em VAEs

Em um Autoencoder Variacional (Variational Autoencoder, VAE), o ELBO frequentemente se torna:

[ \mathbb{E}{q\phi(z\mid x)}[\log p_\theta(x\mid z)] ;-; D_{\mathrm{KL}}(q_\phi(z\mid x),|,p(z)). ]

  • O primeiro termo é um termo de reconstrução / verossimilhança.
  • O segundo termo regulariza o posterior latente em direção ao prior (p(z)), normalmente (\mathcal{N}(0,I)).

Divergência KL em objetivos de RLHF e no estilo PPO

A divergência KL também é um botão de controle (control knob) prático no ajuste fino moderno por aprendizado por reforço de modelos de linguagem, especialmente em Aprendizado por Reforço a partir de Feedback Humano (RLHF) e Otimização Proximal de Políticas (PPO).

Por que a KL aparece em RLHF

Em RLHF, você tipicamente começa com uma política “de referência” pré-treinada (\pi_{\text{ref}}) (por exemplo, o modelo SFT), e então otimiza uma nova política (\pi_\theta) para aumentar a recompensa (de um modelo de recompensa ou preferências). Se você otimiza a recompensa de forma agressiva demais, a política pode derivar, produzindo:

  • mudança de distribuição para longe da linguagem natural
  • reward hacking / exploração
  • diversidade ou coerência degradadas

Um método comum de estabilização é adicionar uma penalidade de KL (KL penalty) que desencoraja (\pi_\theta) de se desviar demais de (\pi_{\text{ref}}):

[ \max_\theta ; \mathbb{E}\left[ r(x) \right] ;-; \beta , D_{\mathrm{KL}}(\pi_\theta(\cdot\mid s),|,\pi_{\text{ref}}(\cdot\mid s)), ]

onde:

  • (s) é o estado (prompt + contexto),
  • ações são tokens,
  • (\beta>0) controla a força da restrição.

Isso é uma instância de aprendizado por reforço regularizado (regularized RL): o termo de KL atua como uma região de confiança (trust region) que limita atualizações de política.

Conexão com PPO (KL como proxy de região de confiança)

PPO otimiza um objetivo substituto com recorte (clipped surrogate objective) para evitar atualizações de política excessivamente grandes em relação à política anterior (\pi_{\text{old}}). Na prática, implementações de PPO frequentemente também monitoram ou penalizam uma KL empírica:

  • KL aproximado (approx KL) em um estado (s): [ \mathrm{KL}(\pi_{\text{old}}|\pi_\theta) \approx \mathbb{E}{a\sim \pi{\text{old}}}\left[\log \pi_{\text{old}}(a\mid s)-\log \pi_\theta(a\mid s)\right]. ]

Se a KL cresce demais, pode-se:

  • interromper cedo (early-stop) uma época,
  • reduzir tamanhos de passo,
  • aumentar o coeficiente da penalidade de KL.

Em RLHF para modelos de linguagem, a penalidade do “modelo de referência” é frequentemente implementada como um termo de shaping por token (per-token shaping term):

[ r_{\text{total}} = r_{\text{RM}} ;-; \beta \sum_t \left(\log \pi_\theta(a_t\mid s_t)-\log \pi_{\text{ref}}(a_t\mid s_t)\right), ]

o que corresponde a desencorajar a divergência em relação à distribuição da política de referência.

KL direto vs KL reverso na prática de RL

Penalidades em RLHF/PPO tipicamente usam algo próximo de (D_{\mathrm{KL}}(\pi_\theta|\pi_{\text{ref}})) ou uma aproximação computada em amostras. A assimetria importa:

  • Penalizar (D_{\mathrm{KL}}(\pi_\theta|\pi_{\text{ref}})) desencoraja fortemente colocar probabilidade em tokens que a referência considera muito improváveis (ajuda a evitar saídas estranhas).
  • Penalizar na direção oposta teria um comportamento diferente e é menos comum em implementações padrão no estilo PPO.

(A direção exata da KL no código depende do estimador e da distribuição de amostragem; muitos calculam uma estimativa on-policy (on-policy estimate) que se alinha com a política amostrada.)

Estimando KL na prática

Estimação de Monte Carlo (Monte Carlo estimation)

Se você consegue amostrar (x \sim P):

[ D_{\mathrm{KL}}(P|Q) = \mathbb{E}P[\log p(x)-\log q(x)] \approx \frac{1}{N}\sum{i=1}^N \left(\log p(x_i)-\log q(x_i)\right). ]

Em aprendizado de máquina, você frequentemente não consegue avaliar (\log p(x)) para a distribuição verdadeira dos dados (P_{\text{data}}), mas ainda assim consegue otimizar entropia cruzada porque ela só precisa de (\log q_\theta(x)).

Estabilidade numérica e “KL infinita”

Armadilhas comuns:

  • Se (q(x)=0) em algum lugar onde (p(x)>0), a KL é infinita. Em implementações, você frequentemente adiciona pequenos epsilons ou garante que as distribuições sejam estritamente positivas (por exemplo, saídas softmax (softmax outputs)).
  • Em alta dimensionalidade, a KL pode ser grande e dominada por regiões de baixa probabilidade; corte (clipping) ou o uso de divergências alternativas pode ajudar dependendo da aplicação.

Alternativas simétricas (nota breve)

Às vezes você quer uma medida simétrica e limitada, por exemplo a divergência de Jensen–Shannon (Jensen–Shannon divergence) (usada em algumas formulações de GAN (Generative Adversarial Network, GAN)). Dito isso, a divergência KL continua sendo o cavalo de batalha porque se alinha com log-verossimilhança e tem decomposições úteis.

Resumo: por que a divergência KL importa

A divergência KL é uma ponte central entre probabilidade, teoria da informação, e objetivos de aprendizado:

  • Ela mede discrepância esperada sob perda logarítmica: [ D_{\mathrm{KL}}(P|Q)=\mathbb{E}_P[\log p-\log q]. ]
  • Ela é não negativa e assimétrica, o que tem consequências reais de modelagem (cobertura de massa vs busca por modos).
  • Ela se conecta diretamente a entropia cruzada e ao treinamento por máxima verossimilhança: [ H(P,Q)=H(P)+D_{\mathrm{KL}}(P|Q). ]
  • Ela sustenta a inferência variacional ao produzir a decomposição do ELBO: [ \log p(x)=\mathrm{ELBO} + D_{\mathrm{KL}}(q|p). ]
  • Ela estabiliza a otimização de políticas em RLHF/PPO por meio de penalidades de KL ou monitoramento de KL, restringindo a política a não derivar demais em relação a uma distribuição de referência.

Como resultado, uma vez que você reconhece a divergência KL, você começa a vê-la como um conceito unificador por trás de muitas perdas e regularizadores “com aparências diferentes” em IA moderna.