Métodos de Monte Carlo
O que são Métodos de Monte Carlo?
Os métodos de Monte Carlo (Monte Carlo methods, MC) são uma família de algoritmos que usam amostragem aleatória (random sampling) para aproximar quantidades que são difíceis de calcular exatamente. Em inteligência artificial (AI) e aprendizado de máquina (machine learning), eles aparecem sempre que precisamos raciocinar sob incerteza — estimando expectativas (expectations), probabilidades, integrais (integrals) ou gradientes (gradients) de objetivos estocásticos (stochastic objectives) — especialmente em espaços de alta dimensionalidade (high-dimensional spaces), onde a integração numérica determinística (deterministic numerical integration) se torna impraticável.
A ideia central é simples:
Se você consegue amostrar de uma distribuição, você consegue aproximar expectativas sob essa distribuição fazendo a média das amostras.
Este artigo foca em:
- Estimação baseada em amostragem (sampling-based estimation) (o estimador básico e por que ele funciona)
- Erro e incerteza (variância (variance), intervalos de confiança (confidence intervals), taxas de convergência (convergence rates))
- Redução de variância (variance reduction) (como obter estimativas melhores com o mesmo custo computacional)
- Intuição para computação probabilística (probabilistic computation) (por que amostrar é uma ferramenta tão geral)
- Aplicações práticas em IA/ML (inferência, AR, modelagem generativa, incerteza)
Os métodos de Monte Carlo dependem fortemente de conceitos de Probabilidade e Estatística, e frequentemente são combinados com ideias de otimização de Otimização e Cálculo. Quando a amostragem é feita via uma cadeia de Markov (Markov chain), o tema se sobrepõe a Monte Carlo via Cadeias de Markov (Markov Chain Monte Carlo, MCMC).
O estimador básico de Monte Carlo
Suponha que queremos uma expectativa
[ \mu = \mathbb{E}_{X \sim p}[f(X)] ]
Se conseguimos obter amostras i.i.d. (X_1, \dots, X_N \sim p), o estimador de Monte Carlo é:
[ \hat{\mu}N = \frac{1}{N}\sum{i=1}^N f(X_i) ]
Por que funciona (intuição de LGN e TCL)
Dois resultados fundamentais explicam por que esse estimador é útil:
Lei dos Grandes Números (Law of Large Numbers, LLN): quando (N \to \infty), (\hat{\mu}_N \to \mu) (sob condições fracas).
Intuição: fazer média cancela a aleatoriedade.Teorema Central do Limite (Central Limit Theorem, CLT): para (N) grande,
[ \sqrt{N}(\hat{\mu}_N - \mu) \Rightarrow \mathcal{N}(0, \sigma^2) ]
onde (\sigma^2 = \mathrm{Var}[f(X)]).
Isso produz o erro padrão (standard error):
[ \mathrm{SE}(\hat{\mu}_N) \approx \frac{\sigma}{\sqrt{N}} ]
Principal conclusão: o erro do MC “puro” tipicamente decresce como (O(1/\sqrt{N})), em grande parte independente da dimensão. Essa insensibilidade à dimensionalidade (dimension insensitivity) é um dos motivos pelos quais MC é tão amplamente usado em IA probabilística.
Um primeiro exemplo prático: estimando \(\pi\)
Uma demonstração clássica: amostrar pontos uniformemente no quadrado unitário e contar quantos caem dentro do quarto de círculo.
import numpy as np
def estimate_pi(N=1_000_000, seed=0):
rng = np.random.default_rng(seed)
x = rng.uniform(0, 1, size=N)
y = rng.uniform(0, 1, size=N)
inside = (x*x + y*y) <= 1.0
return 4.0 * inside.mean()
print(estimate_pi(200_000))
Isso é integração de Monte Carlo (Monte Carlo integration) disfarçada: a área do quarto de círculo é (\pi/4), e a média amostral estima essa área.
Monte Carlo como integração numérica
Muitos problemas de AM envolvem integrais da forma:
[ I = \int f(x), p(x), dx = \mathbb{E}_{x \sim p}[f(x)] ]
Em contextos bayesianos, (p(x)) pode ser uma distribuição a posteriori (posterior distribution), e (f(x)) pode representar uma predição, utilidade ou estatística suficiente. Em modelos generativos profundos (deep generative models), (p(x)) pode ser um prior latente (latent prior) e (f) uma função complexa computada por uma rede neural (neural network).
Monte Carlo transforma integração em:
- Amostragem de (p(x))
- Média de (f(x)) sobre as amostras
Essa visão é central em computação probabilística: amostragem é um “motor de computação (compute engine)” de uso geral para expectativas quando formas fechadas não estão disponíveis.
Quantificando incerteza: intervalos de confiança
Como (\hat{\mu}_N) é aleatório, frequentemente queremos uma medida de incerteza. Usando o TCL, um intervalo de confiança aproximado de 95% é:
[ \hat{\mu}_N \pm 1.96 \cdot \frac{\hat{\sigma}}{\sqrt{N}} ]
onde (\hat{\sigma}^2) é a variância amostral (sample variance) de (f(X)).
import numpy as np
def mc_mean_ci(fx, alpha=0.05):
N = len(fx)
mean = fx.mean()
s = fx.std(ddof=1)
z = 1.96 # approx for 95%
half_width = z * s / np.sqrt(N)
return mean, (mean - half_width, mean + half_width)
rng = np.random.default_rng(0)
x = rng.normal(size=50_000)
fx = np.exp(x) # estimate E[exp(X)] where X~N(0,1) (true value = exp(1/2))
mean, ci = mc_mean_ci(fx)
print(mean, ci)
Na prática de AM, esses intervalos também são úteis para depurar estimadores estocásticos (stochastic estimators) (por exemplo, verificar se uma estimativa de gradiente por Monte Carlo é estável).
O desafio central: variância
Os estimadores de Monte Carlo são não enviesados (unbiased) (no cenário i.i.d.), mas podem ter variância alta, tornando a convergência lenta.
Como o erro escala como (\sigma/\sqrt{N}), melhorar Monte Carlo frequentemente significa:
- reduzir (\sigma^2 = \mathrm{Var}[f(X)]), ou
- usar amostragem mais inteligente para que o mesmo (N) produza menor variância.
Essa é a motivação para a redução de variância.
Técnicas de redução de variância
1) Variáveis antitéticas (antithetic variates) (correlação negativa (negative correlation))
Se você consegue gerar pares de amostras que sejam negativamente correlacionadas preservando a distribuição marginal correta, fazer a média delas reduz a variância.
Ideia de exemplo: para (U \sim \mathrm{Uniform}(0,1)), use tanto (U) quanto (1-U). Se (f) for monótona, (f(U)) e (f(1-U)) tendem a se mover em direções opostas, estabilizando a média.
Uso prático: comum em simulação e em alguns estimadores probabilísticos quando o mecanismo de amostragem permite extrações “espelhadas”.
2) Variáveis de controle (control variates) (a técnica coringa)
Variáveis de controle reduzem variância subtraindo uma função correlacionada com expectativa conhecida.
Seja:
- alvo: (\mu = \mathbb{E}[f(X)])
- controle: (g(X)) com (\mathbb{E}[g(X)]) conhecido
Defina: [ \hat{\mu}{cv} = \frac{1}{N}\sum{i=1}^N \left(f(X_i) - c,(g(X_i) - \mathbb{E}[g(X)])\right) ]
Isso permanece não enviesado para qualquer (c). O (c) ótimo (em termos de variância) é: [ c^* = \frac{\mathrm{Cov}(f,g)}{\mathrm{Var}(g)} ]
Intuição: se (g) acompanha as flutuações aleatórias de (f), subtraí-lo cancela ruído.
Exemplo prático pequeno: estimar (\mathbb{E}[\exp(X)]) para (X \sim \mathcal{N}(0,1)), usando (g(X)=X) (cuja expectativa é 0) como um controle simples.
import numpy as np
rng = np.random.default_rng(0)
N = 50_000
x = rng.normal(size=N)
f = np.exp(x)
g = x
Eg = 0.0
# estimate c* from samples
cov_fg = np.cov(f, g, ddof=1)[0, 1]
var_g = np.var(g, ddof=1)
c_star = cov_fg / var_g
mu_plain = f.mean()
mu_cv = (f - c_star * (g - Eg)).mean()
print("plain:", mu_plain)
print("control variate:", mu_cv)
print("true:", np.exp(0.5))
Variáveis de controle estão profundamente conectadas à prática de AM:
- a subtração de linha de base (baseline) em gradientes de política (policy gradients) (REINFORCE) é uma variável de controle
- alguns estimadores de inferência variacional usam variáveis de controle aprendidas para reduzir a variância do gradiente
3) Amostragem estratificada (stratified sampling) (reduzir ruído de amostragem por construção)
Em vez de amostrar da distribuição inteira “às cegas”, a amostragem estratificada divide o domínio em regiões (“estratos”) e amostra dentro de cada uma, garantindo cobertura.
Para uma variável uniforme (U \in [0,1]), uma estratificação simples é:
- dividir ([0,1]) em (K) bins iguais
- amostrar um ponto por bin
Isso reduz a variância para muitos integrandos (integrands) suaves porque evita a “aglomeração” de amostras.
Analogia prática: o treinamento em mini-batches (mini-batch training) em AM não é amostragem estratificada da distribuição de dados em sentido estrito, mas a motivação é similar — reduzir ruído do estimador por melhor cobertura da distribuição subjacente.
4) Amostragem por importância (importance sampling) (amostrar onde importa)
Se (p(x)) é difícil de amostrar — ou se (f(x)p(x)) coloca a maior parte da sua massa em uma região pequena — a amostragem simples pode ser desperdício.
A amostragem por importância reescreve:
[ \mathbb{E}_{p}[f(X)] = \int f(x),p(x),dx = \int f(x),\frac{p(x)}{q(x)}, q(x),dx ]
onde (q(x)) é uma distribuição proposta (proposal distribution) da qual você consegue amostrar. O estimador se torna:
[ \hat{\mu}{IS} = \frac{1}{N}\sum{i=1}^N f(X_i), w(X_i), \quad X_i \sim q ] [ w(x) = \frac{p(x)}{q(x)} ]
Intuição: amostrar com mais frequência em regiões que mais contribuem para a integral e então reponderar para corrigir o viés.
Armadilha: a amostragem por importância pode ter variância infinita ou enorme se (q) tiver caudas mais leves do que (p) em regiões importantes (os pesos explodem).
Um exemplo mínimo: estimar uma probabilidade de evento raro sob uma normal padrão amostrando de uma normal deslocada.
import numpy as np
from math import exp, sqrt, pi
def normal_pdf(x, mu=0.0, sigma=1.0):
z = (x - mu) / sigma
return (1.0 / (sigma * sqrt(2*pi))) * np.exp(-0.5 * z*z)
rng = np.random.default_rng(0)
N = 200_000
# target: P(Z > 5) for Z~N(0,1)
# naive MC is very inefficient; use proposal q = N(5,1)
x = rng.normal(loc=5.0, scale=1.0, size=N)
p = normal_pdf(x, mu=0.0, sigma=1.0)
q = normal_pdf(x, mu=5.0, sigma=1.0)
w = p / q
estimate = np.mean((x > 5.0) * w)
print("IS estimate:", estimate)
A amostragem por importância aparece por toda a IA:
- avaliação off-policy (off-policy evaluation) em aprendizado por reforço (razões de importância entre a política de comportamento e a política-alvo)
- estimar expectativas sob um modelo usando amostras de outro
- alguns objetivos de treinamento para modelos generativos e métodos variacionais
5) Quase–Monte Carlo (Quasi–Monte Carlo, QMC) ( “amostragem determinística” de baixa discrepância)
Quase–Monte Carlo (Quasi–Monte Carlo, QMC) substitui amostras pseudoaleatórias por sequências de baixa discrepância (low-discrepancy sequences) (por exemplo, Sobol, Halton) que cobrem o espaço de forma mais uniforme.
- Frequentemente melhora a convergência em integrais suaves
- Comum em finanças computacionais e, às vezes, em AM probabilístico
- Em alta dimensionalidade, a efetividade depende da dimensão efetiva do integrando (muitos problemas têm estrutura que faz QMC continuar útil)
QMC não é “aleatório”, mas existem variantes de QMC randomizado para permitir estimativas de erro.
Monte Carlo em IA/ML: onde aparece
Inferência bayesiana (Bayesian inference) e expectativas a posteriori
Em modelagem bayesiana, frequentemente queremos:
[ \mathbb{E}_{\theta \sim p(\theta \mid D)}[f(\theta)] ]
Exemplos:
- média preditiva a posteriori (posterior predictive mean) e incerteza
- perda esperada para Teoria da Decisão Bayesiana
- aproximações da verossimilhança marginal (marginal likelihood) (mais especializado)
Se conseguimos amostrar (\theta) da a posteriori (frequentemente usando Monte Carlo via Cadeias de Markov (Markov Chain Monte Carlo, MCMC)), então médias de Monte Carlo aproximam essas expectativas.
Monte Carlo em inferência variacional (variational inference) e modelos com variáveis latentes (latent-variable models)
Muitos modelos modernos contêm variáveis latentes (z) e exigem expectativas como:
[ \mathbb{E}{z \sim q\phi(z \mid x)}[\log p_\theta(x, z) - \log q_\phi(z \mid x)] ]
Isso é o núcleo do objetivo do autoencoder variacional (Variational Autoencoder, VAE). Na prática, ele é calculado com um pequeno número de amostras por datapoint (frequentemente apenas 1) mais otimização baseada em gradientes (gradient-based optimization) — conectando a estimação por Monte Carlo diretamente a Otimização.
A variância importa muito aqui: estimadores de alta variância tornam o treinamento lento ou o desestabilizam.
Estimadores de gradiente de Monte Carlo (Monte Carlo gradient estimators) (por que redução de variância é crítica)
Em AM, frequentemente precisamos de gradientes de expectativas:
[ \nabla_\phi , \mathbb{E}{X \sim p\phi}[f(X)] ]
Duas famílias comuns de estimadores:
Estimador por função de escore / REINFORCE (score-function / REINFORCE estimator): [ \nabla_\phi \mathbb{E}[f(X)] = \mathbb{E}[f(X)\nabla_\phi \log p_\phi(X)] ] Não enviesado, mas frequentemente com alta variância; linhas de base/variáveis de controle são cruciais.
Estimador por caminho (pathwise) (de reparametrização (reparameterization)): Se (X = g_\phi(\epsilon)) com (\epsilon \sim p(\epsilon)), então: [ \nabla_\phi \mathbb{E}[f(X)] = \mathbb{E}[\nabla_\phi f(g_\phi(\epsilon))] ] Frequentemente com variância muito menor quando aplicável (comum em VAEs).
Essas ideias conectam Monte Carlo à programação diferenciável (differentiable programming) e ao aprendizado baseado em gradientes.
Aprendizado por reforço (reinforcement learning) (retornos são estimativas de Monte Carlo)
Em aprendizado por reforço, o retorno esperado (expected return) é uma expectativa sobre trajetórias (trajectories):
[ J(\pi) = \mathbb{E}{\tau \sim \pi}\left[\sum{t=0}^\infty \gamma^t r_t\right] ]
- Avaliação de política por Monte Carlo (Monte Carlo policy evaluation) estima valor fazendo a média dos retornos observados em episódios.
- Métodos de gradiente de política dependem de amostras de trajetórias por Monte Carlo, com redução de variância via linhas de base (variáveis de controle), funções de vantagem (advantage functions) e estimação generalizada de vantagem (generalized advantage estimation, GAE).
Métodos off-policy (off-policy methods) frequentemente incorporam amostragem por importância para corrigir a discrepância entre a política de coleta de dados e a política-alvo.
Estimação de incerteza (uncertainty estimation) e ensembles
Muitas técnicas de incerteza são implicitamente Monte Carlo:
- Ensembles profundos (deep ensembles) aproximam distribuições preditivas ao amostrar parâmetros do modelo a partir de múltiplas execuções de treinamento.
- Dropout de Monte Carlo (MC Dropout) trata máscaras de dropout como amostras de uma a posteriori aproximada e então faz a média das predições ao longo de passagens forward estocásticas.
Filtros de partículas (particle filters) e Monte Carlo sequencial (Sequential Monte Carlo, SMC) (brevemente)
Para séries temporais e modelos de espaço de estados, Monte Carlo Sequencial (Sequential Monte Carlo, SMC) representa distribuições com partículas ponderadas (weighted particles) que são propagadas e reamostradas ao longo do tempo. SMC é essencialmente estimação por Monte Carlo mais ponderação por importância e reamostragem (resampling), adaptadas para dados sequenciais.
(Se você mais tarde estender o wiki, SMC é um tópico descendente natural próximo de MCMC.)
Orientação prática: fazendo Monte Carlo funcionar bem
Escolha o estimador certo para o problema
- Se você consegue amostrar diretamente: MC simples é fácil e robusto.
- Se eventos são raros ou a massa está concentrada: considere amostragem por importância.
- Se você tem sinais auxiliares correlacionados: use variáveis de controle (frequentemente aprendidas).
- Se gradientes são necessários: prefira reparametrização quando possível.
Fique atento à “degenerescência de pesos (weight degeneracy)” em amostragem por importância
Se poucas amostras dominam os pesos, as estimativas ficam instáveis. Diagnósticos incluem:
- tamanho efetivo de amostra (effective sample size, ESS)
- histogramas de pesos / fração máxima de peso
Amostras correlacionadas mudam a história
A teoria de MC simples assume amostras i.i.d. Com amostras correlacionadas (por exemplo, de MCMC), o estimador ainda frequentemente funciona, mas a variância depende da autocorrelação (autocorrelation) e do tamanho efetivo de amostra. Essa é a ponte para Monte Carlo via Cadeias de Markov (Markov Chain Monte Carlo, MCMC).
Separe “viés (bias)” de “variância” conscientemente
- Muitos estimadores de MC são não enviesados, porém ruidosos.
- Algumas variantes práticas introduzem pequeno viés para grande redução de variância (por exemplo, pesos de importância truncados, alguns esquemas de inferência aproximada). Em sistemas de AM, o melhor trade-off frequentemente é sobre estabilidade da otimização e tempo de relógio (wall-clock time), não sobre não enviesamento isoladamente.
Intuição: Monte Carlo como computação probabilística
Os métodos de Monte Carlo são poderosos porque permitem computar com distribuições do mesmo jeito que se computa com números:
- Quer uma expectativa? Amostre e faça a média.
- Quer uma probabilidade? Amostre e conte.
- Quer incerteza? Repita e meça a variabilidade.
- Quer uma integral complicada? Transforme em amostragem mais pesos.
Isso está especialmente alinhado com como sistemas modernos de IA operam: modelos definem processos estocásticos complexos (latentes, trajetórias, redes randomizadas), e Monte Carlo fornece uma ferramenta de aproximação universal quando a álgebra falha.
Resumo
- Os métodos de Monte Carlo aproximam expectativas e integrais via amostragem e média.
- O estimador básico converge em torno de (O(1/\sqrt{N})), com incerteza quantificada via variância e intervalos de confiança (aproximados).
- Redução de variância é essencial na prática:
- variáveis de controle (incluindo linhas de base em gradientes de política)
- variáveis antitéticas
- estratificação
- amostragem por importância (poderosa, mas pode ser instável)
- quase–Monte Carlo para integrais mais suaves
- Monte Carlo é central em fluxos de trabalho de IA: inferência bayesiana, métodos variacionais, aprendizado por reforço, estimação de incerteza e inferência sequencial.
Se você já entende Probabilidade e Estatística, os métodos de Monte Carlo são o próximo passo rumo a “computar com probabilidade” — um tema recorrente ao longo do aprendizado de máquina moderno.