Chcę wiedzieć, jakie są różnice między algorytmem do przodu i do tyłu i algorytmem Viterbiego do wnioskowania w ukrytych modelach Markowa (HMM).
Chcę wiedzieć, jakie są różnice między algorytmem do przodu i do tyłu i algorytmem Viterbiego do wnioskowania w ukrytych modelach Markowa (HMM).
Odpowiedzi:
Najpierw trochę tła, może trochę to wyjaśnia.
Mówiąc o HMM (ukrytych modelach Markowa), na ogół należy rozważyć 3 problemy:
Problem z oceną
Problem z dekodowaniem
Problem treningowy
Podsumowując, używasz algorytmu Viterbi dla problemu dekodowania oraz Baum Welch / Forward-backward, kiedy trenujesz swój model na zestawie sekwencji.
Baum Welch działa w następujący sposób.
Dla każdej sekwencji w zestawie sekwencji treningowych.
Jeśli potrzebujesz pełnego opisu równań dla dekodowania Viterbiego i algorytmu treningowego daj mi znać, a mogę skierować cię we właściwym kierunku.
Forward-Backward daje marginalne prawdopodobieństwo dla każdego stanu , Viterbi daje prawdopodobieństwo najbardziej prawdopodobnej sekwencji stanów . Na przykład, jeśli Twoim zadaniem HMM jest przewidywanie pogody słonecznej i deszczowej na każdy dzień, funkcja Forward Backward poinformuje cię o prawdopodobieństwie, że będzie „słoneczna” każdego dnia, Viterbi poda najbardziej prawdopodobną sekwencję dni słonecznych / deszczowych, a prawdopodobieństwo tej sekwencji.
Uważam, że te dwa slajdy z {2} są naprawdę dobre do umiejscowienia algorytmów do przodu i do tyłu oraz wszystkich innych typowych algorytmów używanych w HMM:
Uwagi:
Bibliografia:
Odpowiedź Morata jest fałszywa w jednym punkcie: Baum-Welch jest algorytmem Expectation-Maximization, używanym do szkolenia parametrów HMM. To wykorzystuje algorytm przód-tył podczas każdej iteracji. Algorytm do przodu i do tyłu jest tak naprawdę kombinacją algorytmów do przodu i do tyłu: jedno przejście do przodu, jedno przejście do tyłu. Sam algorytm przewijania do przodu nie jest wykorzystywany do uczenia parametrów HMM, lecz jedynie do wygładzania: obliczania marginalnych prawdopodobieństw sekwencji stanów.
https://en.wikipedia.org/wiki/Forward%E2%80%93backward_algorithm
@Yaroslav Bulatov miał dokładną odpowiedź. Dodałbym jeden przykład tego, żeby powiedzieć różnice między algorytmami do przodu i do tyłu i algorytmami Viterbi.
Załóżmy, że mamy ten HMM (ze strony Wikipedii HMM). Uwaga: model jest już podany, więc nie ma tutaj uczenia się na podstawie zadania danych.
Załóżmy, że nasze dane to sekwencja o długości 4. (Walk, Shop, Walk, Clean)
. Dwa algorytmy dają różne rzeczy.
Sunny
Rainy
Oto R
kod dla wersji demonstracyjnej
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))