Hidden Markov Model (HMM)
Um modelo oculto de Markov (HMM) infere uma sequência de estados ocultos a partir de observações ruidosas. Os seus parâmetros, o algoritmo de Viterbi e as aplicações.
Um modelo oculto de Markov (HMM) é um modelo probabilístico de uma sequência em que um sistema transita entre estados que não podem ser observados diretamente, e cada estado oculto produz uma observação que pode ser observada. Dada uma sequência de observações, como quadros de áudio ou letras de DNA, um HMM calcula a probabilidade de cada sequência de estados ocultos, por exemplo, os fonemas por trás do áudio ou as regiões gênicas por trás das letras. “Markov” refere-se à suposição central do modelo: o próximo estado depende apenas do estado atual. Leonard Baum e seus colegas desenvolveram a teoria no fim da década de 1960, e os HMMs passaram a impulsionar o reconhecimento de fala por décadas. Construídos inteiramente com probabilidades explícitas, eles continuam sendo uma ferramenta padrão na análise de séries temporais e na bioinformática, além de um exemplo clássico de IA estatística.
Componentes de um HMM#
Um HMM com N estados ocultos é definido por três conjuntos de probabilidades:
- Probabilidades iniciais (π): A probabilidade de começar em cada estado oculto.
- Probabilidades de transição (A): Uma matriz N × N cuja entrada
A[i, j]é a probabilidade de passar do estado i para o estado j em uma etapa, o que faz dos estados ocultos uma cadeia de Markov. - Probabilidades de emissão (B): A probabilidade de cada observação dado o estado atual. Observações discretas usam uma tabela, enquanto observações contínuas, como características acústicas, usam distribuições como misturas gaussianas.
Duas suposições mantêm o modelo tratável: cada estado depende apenas do estado anterior, e cada observação depende apenas do estado atual. Desenrolado ao longo do tempo, o modelo é uma cadeia de estados ocultos, cada um emitindo uma observação:
Três problemas clássicos de HMM#
O tutorial de 1989, amplamente citado, de Lawrence Rabiner organizou o uso de HMMs em torno de três perguntas. Cada uma tem uma solução de programação dinâmica cujo custo cresce com N² × T para T observações, em vez de crescer com as Nᵀ sequências de estados possíveis:
- Avaliação: Qual é a probabilidade de uma sequência de observações sob um determinado modelo? O algoritmo forward soma todas as trajetórias ocultas, permitindo que um reconhecedor escolha o modelo de palavras que melhor explica um enunciado.
- Decodificação: Qual sequência de estados ocultos melhor explica as observações? O algoritmo de Viterbi, publicado por Andrew Viterbi em 1967 para decodificar códigos convolucionais, encontra a trajetória mais provável, e o algoritmo forward-backward fornece a probabilidade de cada estado em cada etapa temporal.
- Aprendizado: Quais parâmetros melhor se ajustam a um conjunto de sequências de observações? O algoritmo de Baum-Welch, uma instância de maximização da expectativa, estima π, A e B a partir de sequências não rotuladas. Quando as sequências de estados são rotuladas, basta contar as transições e emissões.
A decodificação de Viterbi pode ser escrita em poucas linhas de NumPy. Neste modelo, a atividade de uma pessoa, caminhar ou correr, é oculta; um rastreador informa uma leitura de velocidade por quadro, e as atividades tendem a persistir de um quadro para o seguinte:
import numpy as np
states = ["walk", "run"]
start = np.array([0.8, 0.2]) # probabilidades do estado inicial
trans = np.array([[0.9, 0.1], [0.1, 0.9]]) # as atividades tendem a persistir entre os quadros
emit = np.array([[0.7, 0.25, 0.05], [0.1, 0.3, 0.6]]) # P(velocidade | estado) para lento, médio, rápido
obs = [0, 0, 2, 0, 0, 1, 2, 2, 1, 2] # leituras de velocidade por quadro
# Viterbi: melhor log-probabilidade de chegar a cada estado, mais ponteiros de retrocesso
logp = np.log(start) + np.log(emit[:, obs[0]])
back = []
for o in obs[1:]:
scores = logp[:, None] + np.log(trans) # linhas: estado anterior; colunas: próximo estado
back.append(scores.argmax(axis=0))
logp = scores.max(axis=0) + np.log(emit[:, o])
# Rastreia a sequência de estados mais provável, de trás para frente, a partir do melhor estado final
path = [int(logp.argmax())]
for pointers in reversed(back):
path.insert(0, int(pointers[path[0]]))
print("Speeds: ", " ".join(["slow", "medium", "fast"][o] for o in obs))
print("Decoded:", " ".join(states[s] for s in path))Ele decodifica walk walk walk walk walk run run run run run. A leitura rápida no quadro 3 continua sendo “caminhar”, pois mudar para correr e voltar exigiria duas transições improváveis; as leituras médias nos quadros 6 e 9 passam a ser “correr” por causa dos quadros rápidos ao redor. Um classificador por quadro que ignorasse as transições teria classificado o quadro 3 como corrida.
HMMs e modelos relacionados#
- Filtro de Kalman: Executa a mesma recursão de predição e atualização para estados contínuos com dinâmica linear e ruído gaussiano. O algoritmo forward do HMM é seu equivalente para estados discretos.
- Redes bayesianas: Um HMM é a rede bayesiana dinâmica mais simples, com uma variável oculta e uma observada por etapa temporal.
- Processo de decisão de Markov (MDP): Acrescenta ações e recompensas a uma cadeia de Markov com estados observados, estrutura por trás do aprendizado por reforço.
- Redes neurais recorrentes e transformers: Aprendem dependências não lineares de longo alcance a partir de grandes conjuntos de dados e substituíram os HMMs na maioria das tarefas de fala e linguagem. Os HMMs precisam de muito menos dados, e todas as suas probabilidades podem ser consultadas diretamente.
- Modelos de espaço de estados (SSMs): Camadas de aprendizado profundo, como Mamba, compartilham a ideia de espaço de estados da teoria de controle e atualizam um vetor oculto contínuo com dinâmica determinística aprendida.
Aplicações no mundo real#
- Reconhecimento de fala: Da década de 1980 até o início da década de 2010, a maioria dos reconhecedores modelava cada fonema como um pequeno HMM com emissões de misturas gaussianas. Depois, redes neurais profundas assumiram o modelo de emissão em sistemas híbridos, e modelos ponta a ponta substituíram posteriormente o HMM por completo.
- Bioinformática: HMMs de perfil descrevem famílias de sequências relacionadas de proteínas ou DNA. O HMMER os utiliza para pesquisar parentes distantes em bancos de dados de sequências e serve de base para o banco de dados de famílias de proteínas Pfam; ferramentas de identificação de genes também usam HMMs para classificar trechos de um genoma como codificantes ou não codificantes.
- Etiquetagem de classes gramaticais: Os primeiros sistemas estatísticos de processamento de linguagem natural classificavam palavras como substantivos, verbos e outras classes gramaticais, usando a decodificação de Viterbi sobre sequências de etiquetas.
- Reconhecimento de atividades: Sequências de poses corporais ou leituras de sensores vestíveis são decodificadas em atividades como ficar em pé, caminhar ou cair. A solução de monitoramento de exercícios da Ultralytics rastreia uma sequência desse tipo com dois estados: ela classifica cada pessoa como “para cima” ou “para baixo” com base em um ângulo articular dos pontos-chave de estimativa de pose do YOLO26 — por padrão, o cotovelo —, alternando acima de 145° e abaixo de 90°, e conta uma repetição a cada mudança de “para cima” para “para baixo”.










