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:

  1. Propriedade de Markov (nos estados ocultos)
    [ P(Z_t \mid Z_{1:t-1}) = P(Z_t \mid Z_{t-1}) ]

  2. 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:

  1. Avaliação (verossimilhança (likelihood)): computar (P(\mathbf{X}\mid\theta))
  2. Decodificação: encontrar a sequência de estados ocultos mais provável (\arg\max_{\mathbf{Z}} P(\mathbf{Z}\mid \mathbf{X}, \theta))
  3. 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:

  1. Extrair representações vetoriais (embeddings) por segmento/quadro (por exemplo, i-vectors ou x-vectors)
  2. Agrupar representações vetoriais (ver Agrupamento)
  3. 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.