Qual é a diferença entre os algoritmos forward-backward e Viterbi?

44

Quero saber quais são as diferenças entre o algoritmo forward-backward e o algoritmo Viterbi para inferência em modelos ocultos de Markov (HMM).

user34790
fonte
2
As descrições dos algortihms ( aqui e aqui ) responderiam à sua pergunta ou você está procurando outra coisa? Você está querendo saber quando usar qual algoritmo? Procurando uma discussão sobre seus respectivos méritos?
MånsT

Respostas:

65

Um pouco de fundo primeiro talvez esclareça um pouco as coisas.

Quando se fala de HMMs (Hidden Markov Models), geralmente existem 3 problemas a serem considerados:

  1. Problema de avaliação

    • O problema de avaliação responde à pergunta: qual é a probabilidade de uma determinada sequência de símbolos ser produzida por um modelo específico?
    • Para avaliação, usamos dois algoritmos: o algoritmo forward ou backward (NÃO os confunda com o algoritmo forward-backward).
  2. Problema de decodificação

    • O problema de decodificação responde à pergunta: Dada uma sequência de símbolos (suas observações) e um modelo, qual é a sequência mais provável de estados que produziram a sequência.
    • Para decodificação, usamos o algoritmo Viterbi .
  3. Problema de treinamento

    • O problema de treinamento responde à pergunta: Dada uma estrutura de modelo e um conjunto de seqüências, encontre o modelo que melhor se ajusta aos dados.
    • Para esse problema, podemos usar os três algoritmos a seguir:
      1. MLE (estimativa de máxima verossimilhança)
      2. Treinamento Viterbi (NÃO confunda com decodificação Viterbi)
      3. Baum Welch = algoritmo de retrocesso

Para resumir, você usa o algoritmo Viterbi para o problema de decodificação e Baum Welch / Forward-backward quando treina seu modelo em um conjunto de seqüências.


Baum Welch funciona da seguinte maneira.

Para cada sequência no conjunto de sequências de treinamento.

  1. Calcular probabilidades de encaminhamento com o algoritmo de encaminhamento
  2. Calcular probabilidades atrasadas com o algoritmo reverso
  3. Calcule as contribuições da sequência atual para as transições do modelo, calcule as contribuições da sequência atual para as probabilidades de emissão do modelo.
  4. Calcular os novos parâmetros do modelo (probabilidades de início, probabilidades de transição, probabilidades de emissão)
  5. Calcular a nova probabilidade de log do modelo
  6. Pare quando a mudança na probabilidade do log for menor que um determinado limite ou quando um número máximo de iterações for passado.

Se você precisar de uma descrição completa das equações para a decodificação de Viterbi e o algoritmo de treinamento, deixe-me saber e eu posso apontá-lo na direção certa.

Morat
fonte
24

Para frente e para trás fornece probabilidade marginal para cada estado individual , Viterbi fornece probabilidade para a sequência mais provável de estados . Por exemplo, se sua tarefa do HMM é prever o tempo ensolarado versus chuvoso para cada dia, o Forward Backward diria a probabilidade de estar "ensolarado" para cada dia, Viterbi daria a sequência mais provável de dias ensolarados / chuvosos e os probabilidade desta sequência.

Yaroslav Bulatov
fonte
15

Eu acho esses dois slides a seguir de {2} realmente bons para situar os algoritmos forward-backward e Viterbi entre todos os outros algoritmos típicos usados ​​com o HMM:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Notas:

  • xπ
  • caminho = uma sequência de emissões
  • decodificação = inferência
  • aprendizagem = treinamento = estimativa de parâmetros
  • Alguns trabalhos (por exemplo, {1}) afirmam que Baum-Welch é o mesmo que algoritmo forward-backward, mas eu concordo com o Masterfool e a Wikipedia: Baum-Welch é um algoritmo de maximização de expectativa que usa o algoritmo forward-backward. As duas ilustrações também distinguem Baum-Welch do algoritmo de avanço para trás.

Referências:

Franck Dernoncourt
fonte
12

A resposta de Morat é falsa em um ponto: Baum-Welch é um algoritmo de Expectativa-Maximização, usado para treinar os parâmetros de um HMM. Ele usa o algoritmo de retroceder durante cada iteração. O algoritmo forward-backward é na verdade apenas uma combinação dos algoritmos forward e backward: uma passagem para frente, uma para trás. Por si só, o algoritmo de avanço / retrocesso não é usado para treinar os parâmetros de um HMM, mas apenas para suavizar: calcular as probabilidades marginais de uma sequência de estados.

https://en.wikipedia.org/wiki/Forward%E2%80%93backward_algorithm

https://en.wikipedia.org/wiki/Baum%E2%80%93Welch_algorithm

Masterfool
fonte
2

@Yaroslav Bulatov teve uma resposta precisa. Eu adicionaria um exemplo disso para dizer as diferenças entre os algoritmos forward-backward e Viterbi.

Suponha que tenhamos este HMM (da página Wikipedia HMM). Observe que o modelo já foi fornecido, portanto, não há aprendizado com a tarefa de dados aqui.

insira a descrição da imagem aqui


Suponha que nossos dados sejam uma sequência de comprimento 4. (Walk, Shop, Walk, Clean). Dois algoritmos fornecerão coisas diferentes.

  • 1

insira a descrição da imagem aqui

  • 24=16SunnyRainy

insira a descrição da imagem aqui


Aqui está um Rcódigo para a demonstração

library(HMM)
# in education setting,
# hidden state: Rainy and Sunny
# observation: Walk, Shop, Clean

# state transition
P <- as.matrix(rbind(c(0.7,0.3),
                     c(0.4,0.6)))

# emission prob
R <- as.matrix(rbind(c(0.1, 0.4, 0.5),
                     c(0.6,0.3, 0.1)))


hmm = initHMM(States=c("Rainy","Sunny"),
              Symbols=c("Walk","Shop", "Clean"),
              startProbs=c(0.6,0.4),
              transProbs=P,
              emissionProbs=R)
hmm


obs=c("Walk","Shop","Walk", "Clean")
print(posterior(hmm,obs))
print(viterbi(hmm, obs))
Haitao Du
fonte