Qual è la differenza tra gli algoritmi forward-backward e Viterbi?


44

Voglio sapere quali sono le differenze tra l' algoritmo avanti-indietro e l' algoritmo di Viterbi per l'inferenza nei modelli nascosti di Markov (HMM).


2
Le descrizioni degli algortihms ( qui e qui ) rispondono alla tua domanda o stai cercando qualcos'altro? Ti stai chiedendo quando utilizzare quale algoritmo? Alla ricerca di una discussione dei rispettivi meriti?
Martedì

Risposte:


65

Prima un po 'di sfondo forse chiarisce un po' le cose.

Quando si parla di HMM (Hidden Markov Models) ci sono generalmente 3 problemi da considerare:

  1. Problema di valutazione

    • Il problema di valutazione risponde alla domanda: qual è la probabilità che una particolare sequenza di simboli sia prodotta da un particolare modello?
    • Per la valutazione utilizziamo due algoritmi: l' algoritmo forward o l' algoritmo backward (NON confonderli con l'algoritmo forward-backward).
  2. Problema di decodifica

    • Il problema di decodifica risponde alla domanda: data una sequenza di simboli (le tue osservazioni) e un modello, qual è la sequenza di stati più probabile che ha prodotto la sequenza.
    • Per la decodifica utilizziamo l' algoritmo di Viterbi .
  3. Problema di allenamento

    • Il problema di addestramento risponde alla domanda: data una struttura del modello e una serie di sequenze, trova il modello che si adatta meglio ai dati.
    • Per questo problema possiamo usare i seguenti 3 algoritmi:
      1. MLE (stima della massima verosimiglianza)
      2. Allenamento di Viterbi (NON confondere con la decodifica di Viterbi)
      3. Baum Welch = algoritmo avanti-indietro

Per riassumere, si utilizza l'algoritmo di Viterbi per il problema di decodifica e Baum Welch / Forward-backward quando si allena il modello su una serie di sequenze.


Baum Welch funziona nel modo seguente.

Per ogni sequenza nel set di sequenze di allenamento.

  1. Calcola le probabilità forward con l'algoritmo forward
  2. Calcola le probabilità all'indietro con l'algoritmo all'indietro
  3. Calcola i contributi della sequenza corrente alle transizioni del modello, calcola i contributi della sequenza corrente alle probabilità di emissione del modello.
  4. Calcola i nuovi parametri del modello (probabilità di avvio, probabilità di transizione, probabilità di emissione)
  5. Calcola la nuova probabilità di log del modello
  6. Arresta quando la modifica della probabilità del log è inferiore a una determinata soglia o quando viene superato un numero massimo di iterazioni.

Se hai bisogno di una descrizione completa delle equazioni per la decodifica di Viterbi e l'algoritmo di allenamento fammelo sapere e posso indicarti la giusta direzione.


24

Avanti-Indietro offre probabilità marginali per ogni singolo stato , Viterbi fornisce probabilità della sequenza di stati più probabile . Ad esempio, se il tuo compito HMM è di prevedere il tempo soleggiato o piovoso per ogni giorno, Forward Backward ti dirà la probabilità che sia "soleggiato" per ogni giorno, Viterbi darebbe la sequenza più probabile di giorni di sole / pioggia e probabilità di questa sequenza.


15

Trovo che queste due diapositive seguenti da {2} siano davvero buone per collocare gli algoritmi avanti-indietro e Viterbi tra tutti gli altri algoritmi tipici usati con HMM:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Gli appunti:

  • xπ
  • percorso = una sequenza di emissioni
  • decodifica = inferenza
  • learning = training = stima dei parametri
  • Alcuni articoli (ad es. {1}) affermano che Baum – Welch è lo stesso dell'algoritmo avanti-indietro, ma sono d'accordo con Masterfool e Wikipedia: Baum – Welch è un algoritmo di massimizzazione delle aspettative che utilizza l'algoritmo avanti-indietro. Le due illustrazioni distinguono anche Baum-Welch dall'algoritmo avanti-indietro.

Riferimenti:


12

La risposta di Morat è falsa su un punto: Baum-Welch è un algoritmo Expectation-Maximization, utilizzato per addestrare i parametri di un HMM. Esso utilizza l'algoritmo avanti-indietro durante ogni iterazione. L'algoritmo avanti-indietro è in realtà solo una combinazione degli algoritmi avanti e indietro: un passaggio in avanti, un passaggio all'indietro. Di per sé, l'algoritmo avanti-indietro non viene utilizzato per l'addestramento dei parametri di un HMM, ma solo per il livellamento: calcolare le probabilità marginali di una sequenza di stati.

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

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


2

@Yaroslav Bulatov ha avuto una risposta precisa. Vorrei aggiungere un esempio per raccontare le differenze tra algoritmi avanti-indietro e algoritmi di Viterbi.

Supponiamo di avere questo HMM (dalla pagina HMM di Wikipedia). Si noti che il modello è già stato fornito, quindi non è possibile apprendere dall'attività dati qui.

inserisci qui la descrizione dell'immagine


Supponiamo che i nostri dati siano una sequenza di lunghezza 4. (Walk, Shop, Walk, Clean). Due algoritmi daranno cose diverse.

  • 1

inserisci qui la descrizione dell'immagine

  • 24=16SunnyRainy

inserisci qui la descrizione dell'immagine


Ecco un po 'di Rcodice per la demo

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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.