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.