Modelos Ocultos de Markov
Visão geral
Um Modelo Oculto de Markov (Hidden Markov Model, HMM) é um modelo probabilístico para dados sequenciais (sequential data) no qual o sistema evolui ao longo do tempo por uma sequência de estados latentes (ocultos) (latent (hidden) states), e cada estado gera uma saída observável (observable). O modelo é “Markoviano” porque o estado latente no tempo (t) depende apenas do estado no tempo (t-1) (uma suposição de Markov de primeira ordem (first-order Markov assumption)).
HMMs são uma ferramenta fundamental no processamento clássico de fala e linguagem, na bioinformática e na modelagem de séries temporais (time-series modeling). Embora muitos sistemas modernos usem Redes Neurais (Neural Networks) e a Arquitetura Transformer (Transformer Architecture), HMMs continuam importantes por:
- estrutura sequencial interpretável (estados, transições)
- inferência exata eficiente com programação dinâmica (dynamic programming)
- pipelines tradicionais de fala (especialmente híbridos GMM-HMM e DNN-HMM)
- tarefas que exigem modelagem explícita de duração/segmentos (frequentemente via extensões)
Formulação de HMM
Variáveis e parâmetros
Um HMM define duas sequências:
- Estados ocultos: (\mathbf{Z} = (Z_1, Z_2, \dots, Z_T)), onde cada (Z_t \in {1, \dots, K})
- Observações: (\mathbf{X} = (X_1, X_2, \dots, X_T)), onde cada (X_t) pode ser discreto (símbolos) ou contínuo (vetores)
Os parâmetros padrão do HMM são:
- Distribuição inicial de estados:
[ \pi_i = P(Z_1 = i) ] - Probabilidades de transição:
[ A_{ij} = P(Z_t = j \mid Z_{t-1} = i) ] - Modelo de emissão (observação):
[ B_j(x) = P(X_t = x \mid Z_t = j) ] Para observações contínuas, (B_j(x)) tipicamente é uma densidade de probabilidade (por exemplo, Gaussiana).
Em conjunto, (\theta = (\pi, A, B)).
Suposições de independência
O HMM se apoia em duas suposições-chave de independência condicional:
Propriedade de Markov (nos estados ocultos)
[ P(Z_t \mid Z_{1:t-1}) = P(Z_t \mid Z_{t-1}) ]Independência da saída dado o estado atual
[ P(X_t \mid Z_{1:T}, X_{1:t-1}) = P(X_t \mid Z_t) ]
Essas suposições viabilizam inferência eficiente via programação dinâmica.
Distribuição conjunta
A probabilidade conjunta de estados e observações fatoriza como:
[ P(\mathbf{Z}, \mathbf{X}) = P(Z_1)\prod_{t=2}^{T} P(Z_t \mid Z_{t-1}) \prod_{t=1}^{T} P(X_t \mid Z_t) ]
De forma equivalente:
[ P(\mathbf{Z}, \mathbf{X}) = \pi_{Z_1}\left(\prod_{t=2}^{T} A_{Z_{t-1}, Z_t}\right)\left(\prod_{t=1}^{T} B_{Z_t}(X_t)\right) ]
Modelos de emissão: HMMs discretos e contínuos
Emissões discretas
Se as observações são símbolos (por exemplo, letras, rótulos), cada estado tem uma distribuição categórica: [ B_j(x) = P(X_t=x \mid Z_t=j) ]
Isso é comum em exemplos de livros-texto (por exemplo, “o clima é oculto, avistamentos de guarda-chuva são observados”).
Emissões contínuas (comum em fala)
Em fala, (X_t) frequentemente é um vetor de características (por exemplo, MFCCs, filterbanks). Uma escolha clássica é uma emissão Gaussiana: [ p(X_t \mid Z_t=j) = \mathcal{N}(X_t; \mu_j, \Sigma_j) ]
Um modelo mais forte é um Modelo de Mistura Gaussiana (Gaussian Mixture Model) por estado: [ p(X_t \mid Z_t=j) = \sum_{m=1}^M w_{jm},\mathcal{N}(X_t; \mu_{jm}, \Sigma_{jm}) ] Esta é a abordagem clássica GMM-HMM usada amplamente no reconhecimento automático de fala tradicional (ver também Agrupamento e Modelos Bayesianos para ideias probabilísticas relacionadas).
Os três problemas canônicos de HMM
Algoritmos de HMM frequentemente são apresentados em torno de três tarefas centrais:
- Avaliação (verossimilhança (likelihood)): computar (P(\mathbf{X}\mid\theta))
- Decodificação: encontrar a sequência de estados ocultos mais provável (\arg\max_{\mathbf{Z}} P(\mathbf{Z}\mid \mathbf{X}, \theta))
- Aprendizado (learning): estimar parâmetros (\theta) a partir de dados (com ou sem estados rotulados)
Os principais algoritmos — para frente-para-trás (forward-backward), Viterbi (Viterbi) e Baum–Welch (EM) — resolvem isso de forma eficiente.
Inferência com o algoritmo para frente-para-trás
Probabilidades para frente
Defina a variável para frente: [ \alpha_t(i) = P(X_{1:t}, Z_t=i \mid \theta) ]
Recorrência:
- Inicialização: [ \alpha_1(i) = \pi_i,B_i(X_1) ]
- Indução: [ \alpha_t(j) = B_j(X_t)\sum_{i=1}^K \alpha_{t-1}(i)A_{ij} ]
- Terminação: [ P(\mathbf{X}\mid\theta) = \sum_{i=1}^K \alpha_T(i) ]
Probabilidades para trás
Defina a variável para trás: [ \beta_t(i) = P(X_{t+1:T}\mid Z_t=i, \theta) ]
Recorrência:
- Inicialização: [ \beta_T(i) = 1 ]
- Indução: [ \beta_t(i) = \sum_{j=1}^K A_{ij} B_j(X_{t+1}) \beta_{t+1}(j) ]
Marginais a posteriori
Uma vez que você tenha (\alpha) e (\beta), você pode computar posteriores úteis:
Posterior de estado (“gamma”): [ \gamma_t(i) = P(Z_t=i \mid \mathbf{X}, \theta) = \frac{\alpha_t(i)\beta_t(i)}{P(\mathbf{X}\mid\theta)} ]
Posterior de transição (“xi”): [ \xi_t(i,j) = P(Z_t=i, Z_{t+1}=j \mid \mathbf{X}, \theta) = \frac{\alpha_t(i)A_{ij}B_j(X_{t+1})\beta_{t+1}(j)}{P(\mathbf{X}\mid\theta)} ]
Essas quantidades são centrais para aprendizado via EM e para analisar sequências (alinhamentos suaves (soft alignments)).
Nota prática: estabilidade numérica
Probabilidades para frente encolhem exponencialmente com (T). Soluções comuns:
- computar no espaço logarítmico (log space) usando
logsumexp - ou usar fatores de escala (scaling factors) (c_t) por passo de tempo para manter valores normalizados
Decodificação com o algoritmo de Viterbi
O algoritmo para frente-para-trás computa posteriores marginais, mas frequentemente você quer um único melhor caminho de estados: [ \mathbf{Z}^* = \arg\max_{\mathbf{Z}} P(\mathbf{Z}, \mathbf{X}\mid\theta) ] Isso é resolvido por Viterbi, um programa dinâmico de max-produto.
Defina: [ \delta_t(j) = \max_{Z_{1:t-1}} P(Z_{1:t-1}, Z_t=j, X_{1:t}\mid\theta) ]
Recorrência:
- Inicialização: [ \delta_1(j)=\pi_jB_j(X_1) ]
- Indução: [ \delta_t(j)=B_j(X_t)\max_i \delta_{t-1}(i)A_{ij} ]
- Acompanhe ponteiros de retrocesso para reconstruir (\mathbf{Z}^*)
Viterbi é muito usado em fala para alinhamento (alignment) (por exemplo, mapear quadros para estados fonéticos) e para decodificar sequências de palavras em ASR baseado em HMM.
Aprendizado dos parâmetros do HMM
Aprendizado supervisionado (estados conhecidos)
Se você tem sequências de estados rotuladas (raro em muitos domínios, mas possível em tarefas sintéticas), estimativas de máxima verossimilhança (maximum likelihood) são contagens simples:
- (\pi_i): frequência de iniciar no estado (i)
- (A_{ij}): contagens de transição normalizadas de (i) para (j)
- (B_j): parâmetros de emissão ajustados nas observações atribuídas ao estado (j)
Aprendizado não supervisionado / fracamente supervisionado: Baum–Welch (EM)
Quando os estados estão ocultos, tipicamente usamos Maximização da Expectativa (Expectation-Maximization, EM), conhecida no contexto de HMM como Baum–Welch.
Dados os parâmetros atuais (\theta^{(old)}):
Etapa E: computar estatísticas suficientes esperadas sob o posterior (P(\mathbf{Z}\mid \mathbf{X}, \theta^{(old)})) usando o algoritmo para frente-para-trás:
- ocupação esperada de estados: (\sum_t \gamma_t(i))
- transições esperadas: (\sum_t \xi_t(i,j))
Etapa M: reestimar parâmetros maximizando a log-verossimilhança esperada dos dados completos.
Para um HMM discreto:
- [ \pi_i \leftarrow \gamma_1(i) ]
- [ A_{ij} \leftarrow \frac{\sum_{t=1}^{T-1} \xi_t(i,j)}{\sum_{t=1}^{T-1} \gamma_t(i)} ]
- [ B_j(x) \leftarrow \frac{\sum_{t: X_t=x} \gamma_t(j)}{\sum_{t=1}^{T} \gamma_t(j)} ]
Para emissões Gaussianas, a etapa M atualiza médias/covariâncias ponderadas usando (\gamma_t(j)) como “atribuições suaves (soft assignments)” (muito semelhante em espírito ao EM para Modelos de Mistura Gaussiana).
Ótimos locais e inicialização
O EM não é garantido de encontrar o ótimo global. Dicas práticas:
- inicialize emissões com k-means ou um GMM (para observações contínuas)
- use múltiplas reinicializações aleatórias
- aplique regularização (regularization) (por exemplo, piso de covariância (covariance flooring) em fala)
- restrinja transições se você conhece a estrutura (por exemplo, HMMs da esquerda para a direita para fonemas)
Um pequeno exemplo prático (HMM discreto)
Considere um modelo “de atividade” de brinquedo:
- Estados ocultos: (Z_t \in {\text{Rainy}, \text{Sunny}})
- Observações: (X_t \in {\text{Umbrella}, \text{NoUmbrella}})
Você especifica:
- (\pi): quão provável é que o primeiro dia seja chuvoso/ensolarado
- (A): como o clima transiciona dia a dia
- (B): probabilidade de ver um guarda-chuva dado o clima
Dadas observações como: [ \mathbf{X} = (\text{Umbrella}, \text{Umbrella}, \text{NoUmbrella}) ] você pode computar:
- (P(\mathbf{X}\mid \theta)) via forward
- (P(Z_t=\text{Rainy}\mid \mathbf{X})) para cada (t) via para frente-para-trás
- a sequência de clima mais provável via Viterbi
Esse padrão de “causa latente (\rightarrow) observações ruidosas” é exatamente o que torna HMMs intuitivos e úteis.
Implementação de referência mínima (pseudocódigo)
Abaixo há um pseudocódigo simplificado, estilo Python, para o passe para frente com escalonamento (emissões discretas). Isso não é otimizado, mas ilustra a mecânica.
import numpy as np
def forward_scaled(pi, A, B, obs):
"""
pi: (K,)
A: (K, K)
B: (K, V) where B[k, x] = P(obs=x | state=k)
obs: list/array of length T with integer symbols in [0, V)
"""
K = len(pi)
T = len(obs)
alpha = np.zeros((T, K))
c = np.zeros(T)
# init
alpha[0] = pi * B[:, obs[0]]
c[0] = alpha[0].sum()
alpha[0] /= c[0]
# recursion
for t in range(1, T):
alpha[t] = (alpha[t-1] @ A) * B[:, obs[t]]
c[t] = alpha[t].sum()
alpha[t] /= c[t]
# log-likelihood from scaling coefficients
loglik = np.sum(np.log(c))
return alpha, c, loglik
Na prática, muitas implementações usam espaço logarítmico (logsumexp) em vez de escalonamento explícito.
HMMs em fala: ASR e diarização de locutor
Modelagem acústica no ASR clássico (GMM-HMM e DNN-HMM)
Por décadas, o reconhecimento automático de fala (automatic speech recognition, ASR) predominante usou HMMs para modelar a estrutura temporal:
- Estados ocultos correspondem a unidades subfonéticas (por exemplo, “senones” dependentes de contexto)
- Observações são características acústicas em nível de quadro (MFCCs, filterbanks)
- O HMM lida com alinhamento temporal e persistência de estado (auto-laços)
- Um modelo de linguagem fornece restrições de sequência de palavras (frequentemente composto com grafos de HMM)
Historicamente:
- GMM-HMM: emissões são GMMs por estado.
- Híbrido DNN-HMM: uma rede neural profunda (deep neural network) prevê (P(Z_t \mid X_t)) (posteriors de estado). Isso é convertido em escores semelhantes a verossimilhanças para decodificação usando a regra de Bayes: [ P(X_t\mid Z_t) \propto \frac{P(Z_t\mid X_t)}{P(Z_t)} ] Isso preserva a decodificação por HMM enquanto melhora a discriminação acústica.
Mesmo com abordagens ponta a ponta (end-to-end) (CTC/atenção/transformers), ideias de alinhamento e decodificação no estilo HMM ainda aparecem em alinhamento forçado (forced alignment), restrições de léxico (lexicon) e ferramentas de segmentação (segmentation).
Diarização de locutor (“quem falou quando”)
A diarização de locutor frequentemente envolve segmentar um fluxo de áudio em regiões homogêneas por locutor e atribuir rótulos de locutor. HMMs são úteis porque eles:
- modelam explicitamente trocas de locutor como transições entre estados discretos
- permitem suavização temporal e restrições nas taxas de troca
- suportam inferência probabilística sobre quadros ambíguos
Pipelines comuns de diarização:
- Extrair representações vetoriais (embeddings) por segmento/quadro (por exemplo, i-vectors ou x-vectors)
- Agrupar representações vetoriais (ver Agrupamento)
- Opcionalmente refinar com um HMM que modela:
- cada locutor como um estado oculto
- verossimilhança de emissão baseada em similaridade de representações vetoriais ou um escore do tipo PLDA (Probabilistic Linear Discriminant Analysis, PLDA)
- estrutura de transição que desencoraja trocas rápidas (alta auto-transição)
Uma família bem conhecida de métodos é a diarização HMM Bayesiana (variacional) ((variational) Bayesian HMM diarization), em que as atribuições de locutor são inferidas com distribuições a priori que ajudam a evitar overfitting e melhoram a robustez em segmentos ruidosos ou curtos.
Por que HMMs se encaixam particularmente bem em fala
Fala é naturalmente sequencial, e muitas tarefas precisam de:
- alinhamento entre um sinal contínuo e unidades discretas (fonemas/palavras/locutores)
- suavização contra ruído em nível de quadro
- restrições estruturadas (por exemplo, modelos de fonema da esquerda para a direita, durações mínimas)
HMMs fornecem uma maneira matematicamente limpa de combinar essas restrições com pontuação probabilística.
Escolhas de projeto e dicas práticas
Escolhendo o número de estados e a topologia
- HMM ergódico (Ergodic HMM): qualquer estado pode transicionar para qualquer outro (bom para regimes genéricos)
- HMM da esquerda para a direita (Left-to-right HMM): os estados progridem para frente (comum para modelagem de fonemas)
- Use conhecimento do domínio para restringir transições (reduz necessidade de dados e melhora estabilidade)
Limitação da modelagem de duração
Um HMM padrão implica uma distribuição geométrica (geometric distribution) sobre durações de estado devido ao mecanismo de auto-laço. Se você precisa de distribuições de duração mais realistas:
- modelos semi-Markov ocultos (Hidden semi-Markov models, HSMMs) modelam explicitamente a duração
- modelos segmentais alternativos também podem ajudar
Regularização e distribuições a priori
Quando os dados são limitados, a máxima verossimilhança pode superajustar. Variantes Bayesianas (prioris de Dirichlet (Dirichlet priors) sobre linhas de (A), prioris conjugadas (conjugate priors) para emissões) se conectam naturalmente a Modelos Bayesianos e podem melhorar a estabilidade.
Complexidade computacional
Para (K) estados e comprimento (T):
- para frente/para trás: (O(TK^2))
- Viterbi: (O(TK^2))
Se (K) é grande, explore transições esparsas (comum em grafos de decodificação de fala) para reduzir custo.
Quando usar HMMs (e quando não usar)
Bons encaixes
- Você acredita que o processo alterna entre um pequeno número de regimes/estados.
- Você precisa de estrutura latente interpretável e transições explícitas.
- Você quer inferência exata com programação dinâmica.
- Você tem restrições estruturadas (da esquerda para a direita, transições limitadas).
- Problemas de alinhamento/segmentação em fala em que a decodificação por HMM é uma ferramenta natural.
Menos adequado
- Dependências de longo alcance que violam a suposição de Markov (a menos que você aumente o estado).
- Observações altamente complexas em que emissões simples (Gaussianas/GMMs) são inadequadas — frequentemente melhor tratadas por Redes Neurais.
- Tarefas em que modelos de sequência ponta a ponta dominam e interpretabilidade/estrutura explícita de estados não é necessária.
Relação com outros modelos
- Um HMM é um modelo de espaço de estados (state-space model) de estados discretos. Análogos de estado contínuo incluem filtros de Kalman (Kalman filters) (dinâmica linear-Gaussiana).
- Emissões de HMM podem ser vistas como um modelo de mistura condicionado ao estado latente, relacionado a Agrupamento e modelagem de misturas.
- EM em HMMs (Baum–Welch) é um caso específico do arcabouço geral de Maximização da Expectativa.
Resumo
Modelos Ocultos de Markov são modelos probabilísticos de sequência que combinam:
- uma cadeia de Markov (Markov chain) discreta de estados ocultos ((\pi, A))
- um modelo de observação por estado ((B))
- inferência eficiente via para frente-para-trás (verossimilhança e posteriores)
- decodificação eficiente via Viterbi (melhor caminho de estados)
- estimação de parâmetros via Baum–Welch/EM quando os estados não são observados
Em fala, HMMs foram historicamente centrais para ASR (híbridos GMM-HMM e DNN-HMM) e continuam úteis para tarefas como diarização de locutor e alinhamento, especialmente quando você quer estrutura temporal explícita e comportamento de transição controlável.