Monte Carlo por Cadeias de Markov (MCMC)

O que é MCMC e por que isso importa?

Monte Carlo via Cadeias de Markov (Markov Chain Monte Carlo, MCMC) é uma família de algoritmos para gerar amostras dependentes de uma distribuição de probabilidade quando a amostragem direta é difícil. A ideia central é construir uma cadeia de Markov (Markov chain) cujo comportamento de longo prazo (sua distribuição estacionária (stationary distribution)) seja a distribuição desejada — na maioria das vezes, um posterior bayesiano (Bayesian posterior).

MCMC fica na interseção de:

  • estimação de Monte Carlo (Monte Carlo estimation): aproximar expectativas usando amostras (veja Métodos de Monte Carlo).
  • cadeias de Markov: usar transições de estado para estado que eventualmente “esquecem” onde começaram.
  • inferência bayesiana (Bayesian inference): aproximar integrais sobre parâmetros (veja Probabilidade e Estatística).

MCMC é frequentemente considerado um “padrão-ouro” para inferência bayesiana porque — quando funciona bem e é executado por tempo suficiente — pode aproximar o posterior com alta fidelidade, sem restringi-lo a uma forma paramétrica conveniente.

Onde o MCMC se encaixa na modelagem bayesiana

Na modelagem bayesiana, especificamos:

  • Um a priori (prior) sobre parâmetros: (p(\theta))
  • Uma verossimilhança (likelihood): (p(y \mid \theta))
  • O posterior (pela regra de Bayes): [ p(\theta \mid y) = \frac{p(y \mid \theta),p(\theta)}{p(y)} ] onde (p(y) = \int p(y \mid \theta)p(\theta),d\theta) é a evidência (evidence) (uma constante de normalização).

Na prática, o posterior raramente está disponível em forma fechada. Mas muitas tarefas exigem apenas expectativas sob o posterior, como:

  • Médias a posteriori: (\mathbb{E}[\theta \mid y])
  • Intervalos de credibilidade
  • Quantidades preditivas a posteriori: [ p(\tilde y \mid y) = \int p(\tilde y \mid \theta),p(\theta \mid y),d\theta ]

MCMC mira essas integrais produzindo amostras (\theta^{(1)},\dots,\theta^{(S)} \sim p(\theta\mid y)) (aproximadamente) e, em seguida, usando estimativas de Monte Carlo: [ \mathbb{E}[f(\theta)\mid y] \approx \frac{1}{S}\sum_{s=1}^S f(\theta^{(s)}) ]

Por que não calcular o posterior diretamente?

Porque a evidência (p(y)) muitas vezes é uma integral intratável em alta dimensão. MCMC evita de forma engenhosa calcular (p(y)) ao usar métodos que exigem apenas avaliar o posterior até uma constante, isto é: [ \tilde p(\theta \mid y) \propto p(y \mid \theta)p(\theta) ]

Essa propriedade de “até a normalização” é uma das razões pelas quais MCMC é tão amplamente aplicável.

Fundamentos de cadeias de Markov (o mínimo que você precisa)

Uma cadeia de Markov é um processo estocástico (\theta_0, \theta_1, \theta_2,\dots) em que o próximo estado depende apenas do estado atual: [ \theta_{t+1} \sim K(\theta_t, \cdot) ] Aqui, (K) é um núcleo de transição (transition kernel).

Conceitos-chave:

  • Distribuição estacionária (\pi(\theta)): se (\theta_t \sim \pi), então (\theta_{t+1} \sim \pi) após uma transição. Formalmente: [ \pi(\theta') = \int \pi(\theta) K(\theta, \theta'), d\theta ]
  • Ergodicidade (ergodicity): grosso modo, a cadeia eventualmente explora todo o espaço relevante e “esquece” a inicialização. Sob condições adequadas, [ \frac{1}{T}\sum_{t=1}^T f(\theta_t) \to \mathbb{E}_{\pi}[f(\theta)] ] (uma lei dos grandes números para cadeias de Markov).

MCMC constrói (K) de modo que a distribuição estacionária (\pi) seja a sua distribuição-alvo (por exemplo, o posterior).

O truque central do MCMC

Métodos de MCMC projetam um operador de transição (K) de forma que:

  1. (\pi) seja estacionária para (K), e
  2. a cadeia seja ergódica, de modo que amostras de longo prazo se aproximem de amostras de (\pi).

Uma condição suficiente comum é o balanço detalhado (detailed balance) (reversibilidade (reversibility)): [ \pi(\theta)K(\theta,\theta') = \pi(\theta')K(\theta',\theta) ] Muitos algoritmos populares de MCMC (incluindo Metropolis–Hastings e Monte Carlo Hamiltoniano) satisfazem balanço detalhado.

Metropolis–Hastings (MH): o clássico “cavalo de batalha”

Intuição

Metropolis–Hastings constrói uma cadeia de Markov repetindo:

  1. Propor um novo estado (\theta') a partir de uma distribuição de proposta (q(\theta' \mid \theta)).
  2. Aceitar ou rejeitar a proposta para corrigir o fato de que (q) pode não coincidir com a distribuição-alvo (\pi).

Se aceita, defina (\theta_{t+1}=\theta'); caso contrário, mantenha (\theta_{t+1}=\theta_t).

Probabilidade de aceitação

Dada uma densidade-alvo (\pi(\theta)) conhecida até uma constante, MH aceita com probabilidade: [ \alpha(\theta,\theta') = \min\left(1, \frac{\pi(\theta'),q(\theta \mid \theta')}{\pi(\theta),q(\theta' \mid \theta)}\right) ]

Caso especial importante: se a proposta for simétrica (symmetric) (por exemplo, uma caminhada aleatória gaussiana (q(\theta' \mid \theta)=\mathcal N(\theta, \sigma^2 I))), então (q(\theta \mid \theta')=q(\theta' \mid \theta)) e: [ \alpha = \min\left(1, \frac{\pi(\theta')}{\pi(\theta)}\right) ]

Por que o MH funciona

  • Se a proposta se move para uma região de maior probabilidade sob (\pi), é provável que seja aceita.
  • Se ela se move para uma região de menor probabilidade, às vezes é aceita, evitando que a cadeia fique presa e garantindo frequências corretas no longo prazo.

Comportamento prático: ineficiência de caminhada aleatória

Em alta dimensão, MH com caminhada aleatória frequentemente mistura mal:

  • Passo pequeno demais (\Rightarrow) alta aceitação, mas exploração lenta (alta autocorrelação).
  • Passo grande demais (\Rightarrow) baixa aceitação e muitas repetições.

Isso motiva métodos informados por gradiente, como o Monte Carlo Hamiltoniano.

Monte Carlo Hamiltoniano (Hamiltonian Monte Carlo, HMC): usando física para vencer caminhadas aleatórias

O problema que o HMC resolve

Em posteriores complexos — especialmente em dimensões moderadas a altas — propostas do tipo caminhada aleatória exploram de forma ineficiente. Você desperdiça computação propondo movimentos que são rejeitados ou que andam muito pouco.

HMC reduz o comportamento de caminhada aleatória ao propor movimentos mais longos e direcionados que ainda assim aterrissam em regiões de alta probabilidade, usando gradientes do log do posterior.

Isso se conecta a ideias em Cálculo e Otimização: gradientes contêm informação geométrica local sobre a densidade.

A ideia-chave: adicionar momento

HMC amplia os parâmetros (\theta) com uma variável auxiliar de momento (momentum) (p), geralmente: [ p \sim \mathcal{N}(0, M) ] onde (M) é uma matriz de massa (frequentemente diagonal ou densa).

Defina o Hamiltoniano (Hamiltonian): [ H(\theta,p) = U(\theta) + K(p) ] com:

  • Energia potencial: (U(\theta) = -\log \pi(\theta)) (log negativo do posterior até constante)
  • Energia cinética: (K(p) = \frac{1}{2}p^\top M^{-1}p)

Assim, o alvo conjunto é: [ \pi(\theta,p) \propto \exp(-H(\theta,p)) ] e, ao marginalizar (p), retornamos ao alvo (\pi(\theta)).

Propostas via dinâmica Hamiltoniana

HMC simula (aproximadamente) a dinâmica Hamiltoniana, que preserva volume e (idealmente) energia; assim, trajetórias se movem ao longo de contornos de alta probabilidade em vez de difundir aleatoriamente.

Como a simulação exata geralmente é impossível, HMC usa o integrador leapfrog (leapfrog integrator), controlado por:

  • tamanho de passo (\varepsilon)
  • número de passos (L) (comprimento da trajetória (\approx L\varepsilon))

A proposta resultante é então aceita/rejeitada com um passo de Metropolis para corrigir o erro de discretização.

NUTS: HMC sem ajuste manual de \(L\)

Ferramentas bayesianas modernas frequentemente usam o Amostrador No-U-Turn (No-U-Turn Sampler, NUTS), uma variante adaptativa do HMC que escolhe automaticamente comprimentos de trajetória para evitar “dobrar para trás”. NUTS é amplamente usado no Stan e no PyMC e costuma ser o padrão para modelos com parâmetros contínuos.

Quando o HMC brilha (e quando não)

HMC é excelente quando:

  • os parâmetros são contínuos
  • os gradientes de (\log \pi(\theta)) estão disponíveis e são razoavelmente suaves
  • a geometria do posterior não é excessivamente patológica

HMC tem dificuldades quando:

  • há muitos parâmetros discretos (HMC clássico não é definido em espaços discretos)
  • o posterior tem forte multimodalidade com modos separados
  • o modelo tem geometria desafiadora (formatos de “funil”) sem reparametrização

Um exemplo de brinquedo: viés de moeda bayesiano com Metropolis–Hastings

Este exemplo é intencionalmente simples para mostrar a mecânica do MH. Suponha que observamos (h) caras em (n) lançamentos e queremos o posterior sobre o viés da moeda (\theta \in (0,1)).

Modelo:

  • A priori: (\theta \sim \text{Beta}(a,b))
  • Verossimilhança: (h \sim \text{Binomial}(n,\theta))

O posterior é conjugado (também Beta), mas vamos amostrá-lo com MH mesmo assim.

Um truque conveniente é amostrar uma variável não restrita (z \in \mathbb{R}) com (\theta = \sigma(z)=1/(1+e^{-z})). Em seguida, contabilize o Jacobiano.

import numpy as np

def log_posterior_z(z, h, n, a=1.0, b=1.0):
    # theta in (0,1)
    theta = 1 / (1 + np.exp(-z))
    # log prior Beta(a,b) up to constant
    log_prior = (a - 1) * np.log(theta) + (b - 1) * np.log(1 - theta)
    # log likelihood Binomial(n, theta) up to constant
    log_lik = h * np.log(theta) + (n - h) * np.log(1 - theta)
    # Jacobian for theta = sigmoid(z): dtheta/dz = theta(1-theta)
    log_jac = np.log(theta) + np.log(1 - theta)
    return log_prior + log_lik + log_jac

def metropolis_hastings(logp, z0, n_steps, prop_sd, rng):
    z = z0
    lp = logp(z)
    samples = np.empty(n_steps)
    accepts = 0
    for t in range(n_steps):
        z_prop = z + rng.normal(0, prop_sd)
        lp_prop = logp(z_prop)
        if np.log(rng.random()) < (lp_prop - lp):
            z, lp = z_prop, lp_prop
            accepts += 1
        samples[t] = z
    return samples, accepts / n_steps

# Data: 70 heads out of 100
h, n = 70, 100
rng = np.random.default_rng(0)

logp = lambda z: log_posterior_z(z, h, n, a=1.0, b=1.0)
z_samps, acc_rate = metropolis_hastings(logp, z0=0.0, n_steps=50_000, prop_sd=0.6, rng=rng)

# Convert to theta and discard burn-in
theta_samps = 1 / (1 + np.exp(-z_samps))
theta_samps = theta_samps[5_000:]

print("Acceptance rate:", acc_rate)
print("Posterior mean estimate:", theta_samps.mean())
print("95% credible interval:", np.quantile(theta_samps, [0.025, 0.975]))

O que observar:

  • Taxa de aceitação (acceptance rate): se for extremamente baixa ou extremamente alta, ajuste prop_sd.
  • Autocorrelação: amostras de MH são dependentes; o tamanho efetivo da amostra pode ser muito menor do que a contagem bruta.
  • Queima inicial/aquecimento (burn-in/warmup): a parte inicial pode não representar a distribuição estacionária.

Em fluxos de trabalho bayesianos reais, você raramente implementaria MH à mão, a menos que seja para modelos especializados ou para ensino; você usaria bibliotecas estabelecidas e focaria na modelagem e nos diagnósticos.

Um exemplo prático: regressão logística bayesiana com HMC/NUTS

Uma tarefa comum de AM bayesiano é regressão logística com incerteza sobre os pesos:

  • Verossimilhança: [ y_i \sim \text{Bernoulli}(\sigma(x_i^\top w)) ]
  • A priori: [ w \sim \mathcal{N}(0, \tau^2 I) ]

O posterior (p(w \mid X,y)) não é conjugado; MCMC é uma abordagem padrão.

Em frameworks de programação probabilística (probabilistic programming) (por exemplo, PyMC, Stan), você normalmente escreve o modelo e deixa o NUTS lidar com a amostragem. Esboço (estilo PyMC):

import pymc as pm
import numpy as np

X = np.random.randn(200, 5)
true_w = np.array([1.2, -0.7, 0.0, 0.5, -1.0])
p = 1 / (1 + np.exp(-X @ true_w))
y = np.random.binomial(1, p)

with pm.Model() as model:
    tau = 2.0
    w = pm.Normal("w", mu=0, sigma=tau, shape=X.shape[1])
    logits = pm.math.dot(X, w)
    y_obs = pm.Bernoulli("y_obs", logit_p=logits, observed=y)

    trace = pm.sample(draws=2000, tune=2000, chains=4, target_accept=0.9)

Saídas típicas que você usaria:

  • resumos a posteriori dos pesos (médias, intervalos)
  • verificações preditivas a posteriori (amostrando (\tilde y) do modelo)
  • diagnósticos como (\hat R) e tamanho efetivo da amostra

É aqui que MCMC se encaixa naturalmente na modelagem bayesiana: você especifica um modelo e, então, amostra para quantificar incerteza e propagá-la para previsões e decisões (veja Teoria da Decisão Bayesiana).

O que você pode fazer com amostras de MCMC na prática

Quando você tem amostras a posteriori ({\theta^{(s)}}), você pode:

  • Estimar médias/medianas a posteriori e intervalos de credibilidade
  • Calcular probabilidades a posteriori, por exemplo (P(\theta_j > 0 \mid y))
  • Calcular distribuições preditivas a posteriori: [ \tilde y^{(s)} \sim p(\tilde y \mid \theta^{(s)}) ]
  • Comparar modelos com cautela (verificações preditivas, LOO-CV; verossimilhança marginal é mais difícil)

Uma nota sobre verossimilhança marginal (evidência do modelo)

Embora MCMC evite calcular (p(y)) para amostrar do posterior, estimar o próprio (p(y)) é não trivial. Existem métodos (amostragem por ponte, integração termodinâmica), mas abordagens ingênuas como o estimador da média harmônica são instáveis. Na prática moderna de AM, critérios preditivos costumam ser preferidos.

Diagnósticos e modos de falha comuns

MCMC é poderoso, mas não é “apertar um botão e obter a verdade”. Você precisa verificar se a amostragem funcionou.

Conceitos-chave de diagnóstico

  • Gráficos de traço (trace plots): valores dos parâmetros vs iteração devem parecer “lagartas peludas” estáveis, não tendências.
  • Autocorrelação: autocorrelação alta significa mistura lenta e pouca informação efetiva.
  • Tamanho Efetivo da Amostra (Effective Sample Size, ESS): número de amostras equivalentes independentes.
  • (\hat R) (R-hat): compara variância entre cadeias e dentro de cadeias; valores próximos de 1 indicam convergência entre cadeias.

Fluxo de trabalho típico em MCMC bayesiano aplicado

  1. Execute múltiplas cadeias (por exemplo, 4)
  2. Use aquecimento/ajuste (especialmente para HMC/NUTS)
  3. Verifique (\hat R), ESS, gráficos de traço
  4. Valide com verificações preditivas a posteriori
  5. Se houver problemas: reparametrize, ajuste priors, melhore o escalonamento ou mude configurações do amostrador

Problemas comuns e correções

  • Escalonamento ruim / correlações fortes: HMC pode precisar de uma matriz de massa melhor; reescale variáveis.
  • Geometria de “funil” hierárquico: tente parametrizações não centradas.
  • Multimodalidade: cadeias podem ficar presas em um modo; use melhor inicialização, métodos de tempering ou estratégias alternativas.
  • Divergências em HMC: frequentemente sinalizam geometria problemática; aumente target_accept, reparametrize ou restrinja os priors.

MCMC vs outras abordagens de inferência

MCMC é uma opção entre várias ferramentas de inferência aproximada:

  • Inferência variacional (variational inference) (veja Inferência Variacional): mais rápida, escalável, mas introduz viés de otimização ao restringir a família aproximada.
  • Aproximação de Laplace (Laplace approximation): aproxima o posterior como gaussiano perto de um modo; pode funcionar bem para posteriores quase gaussianos.
  • Propagação de expectativas (expectation propagation): aproximações via casamento de momentos; menos comum hoje em ferramentas de uso geral.

Um modelo mental útil:

  • MCMC: baseado em amostragem, assintoticamente exato (dado tempo suficiente e diagnósticos corretos)
  • IV: baseado em otimização, rápido, aproximado
  • Laplace: aproximação gaussiana local

Em aprendizado profundo em larga escala, MCMC clássico muitas vezes é caro demais, motivando variantes aproximadas como MCMC com gradiente estocástico (stochastic gradient MCMC). Ainda assim, para muitos modelos científicos e de AM de pequeno a médio porte, HMC/NUTS continua sendo extremamente prático.

Aplicações em IA/AM

MCMC é amplamente usado em:

  • Programação probabilística: modelagem bayesiana geral com inferência automatizada
  • Modelos lineares generalizados bayesianos (Bayesian generalized linear models): regressão logística/Poisson com incerteza
  • Modelos hierárquicos (hierarchical models): efeitos multinível (comuns em dados do mundo real)
  • Não paramétricos bayesianos (Bayesian nonparametrics) e modelos de mistura (mixture models): por exemplo, misturas de processo de Dirichlet (Dirichlet process mixtures) (frequentemente com variantes de Gibbs/MH)
  • Inferência de hiperparâmetros em processo gaussiano (Gaussian process hyperparameter inference): amostrar parâmetros do kernel
  • Inferência causal (causal inference): modelos estruturais bayesianos (Bayesian structural models) em que a propagação de incerteza importa

Em pipelines modernos de IA, MCMC frequentemente aparece quando você precisa de incerteza bem calibrada (well-calibrated uncertainty), e não apenas de estimativas pontuais (point estimates).

Resumo: MCMC em um parágrafo

MCMC é uma forma principiada de aproximar distribuições de probabilidade difíceis — especialmente posteriores bayesianos — construindo uma cadeia de Markov cuja distribuição estacionária é o alvo. Metropolis–Hastings fornece um mecanismo geral de aceitar/rejeitar que funciona com densidades não normalizadas, mas pode misturar lentamente em alta dimensão. Monte Carlo Hamiltoniano (e NUTS) usa gradientes para fazer propostas de longa distância com alta aceitação, o que frequentemente o torna a escolha padrão para modelos bayesianos contínuos hoje. Na prática, MCMC é tanto sobre diagnósticos, geometria e escolhas de modelagem quanto sobre o próprio amostrador.