7.3 Algoritmo hacia adelante-hacia atrás (forward-backward)

Utilizamos el algoritmo forward-backward para calcular γ^ij y δ^j. Recordemos que

δ^j=P(St=j|x)=P(x,St=j)P(x)γ^ij=P(St1=i,St=j|x)=P(x,St1=i,St=j)P(x)

El cálculo de cada una de las probabilidades de arriba es computacionalmente intensivo, por ejemplo para calcular P(x):

P(x)=Sps1(x1)ps1,s2ps2(x2)psT1,sTpsT(xT)

donde S son las combinaciones de posibles estados (MT posibilidades) por tanto esta aproximación no es factible. Es por esto que surge la necesidad de un algoritmo más eficiente.

El algoritmo hacia adelante-hacia atrás usa el principio de programación dinámica(recursión inteligente) para calcular γ^ij y δ^j en tiempo lineal (M2T), consta de dos pasos y explota las independencias condicionales del modelo.

Probabilidad hacia adelante

Definimos la probabilidad hacia adelante αi(t) como la probabilidad conjunta de observar las primeras t observaciones xj (j=1,...,t) y siendo i el estado al tiempo t:

αi(t)=P(X1=x1,...,XT=xt,St=i)

La probabilidad se puede evaluar de manera recursiva siguiendo la fórmula:

  1. αi(1)=πkpi(x1) para i=1,...,M

  2. αi(t)=pi(xt)j=1Mαj(t1)pj,i para t=2,...,T e i=1,...,M.

Prueba:

La idea clave es usar (St,Xt)(X1,...,Xt1)|St1 αi(t)=P(x1,...,xt,St=i)=j=1MP(x1,...,xt,St=i,St1=j)=j=1MP(x1,...,xt1,St1=j)P(xt|St=i)P(St=1|St1=j)=j=1Mαj(t1)pi(xt)pj,i

Probabilidad hacia atrás

Definimos la probabilidad hacia atrás βi(t) como la probabilidad condicional de las observaciones posteriores al tiempo t (xt+1,...,xT) dado que el estado al tiempo t es i.

βi(t)=P(xt+1,...,xT|St=i) para t=1,...T1.

La recursión de la probabilidad hacia atrás se evalúa como:

  1. βi(T)=1, para i=1,...,M.

  2. βi(t)=i=1Mpi,jpj(xt+1)βi(t+1) para t=1,...,T1.

Prueba:

La idea clave es usar Xt+1(Xt+2,...,XT)|St+1

βi(t)=P(xt+1,...,xT|St=i)=j=1MP(xt+1,...,xT,St+1=j|St=i)=j=1MP(St+1=j|St=i)P(xt+1,...,xT|St+1=j)=j=1Mpi,jP(xt+1,...,xT|St+1=j)=j=1Mpi,jP(xt+1|St+1=j)P(xt+2,...,xT|st+1=j)=j=1Mpi,jpj(xt+1)βj(t+1)

Escribimos δ y γ

Ahora vemos como escrbir δj y γi,j usando las probabilidades hacia adelante y hacia atrás:

δ^j(t)=P(St=j|x)=P(x,St=j)P(x)=αj(t)βj(t)i=1Mαi(T)

Prueba: P(x1,...,xT,St=j)=P(x1,...,xt,St=j)P(xt+1,...,xT|St=j)=αj(t)βj(t)

Para el denominador notemos que:

P(x)=iMP(x,St=i)=i=1Mαi(t)βi(t) esto se cumple para cualquier t, así que si tomamos t=T:

P(x)=i=1Mαi(T)

En el caso de γi,j tenemos:

γ^ij=P(St1=i,St=j|x)=P(x,St1=i,St=j)P(x)=αi(t1)βj(t)pi,jpj(xt)P(x)

Prueba: P(x1,...,xT,St1=i,St=j)=P(x1,...,xt1,St1=i)P(xt+1,...,XT|St=j)P(St=j|St1=i)P(xt|St=j)=αi(t1)βj(t)pi,jpj(xt)

7.3.1 Resumen de algoritmo de estimación

Entonces, el algoritmo de estimación itera de la siguiente manera:

  1. Comenzamos con valores inciales δ^j y γ^ij.

  2. Actualizamos los parámetros p^ij=γ^ijlγ^il y los correspondientes a las densidades pj(x).

  3. Utilizando el conjunto de parámetros actuales (p^ij y los correspondientes a pj(x)) calculamos δ^j y γ^ij a través del algoritmo hacia adelante-hacia atrás.

  4. Iteramos entre 2 y 3.

7.3.2 Algoritmo de Viterbi

En muchas de las aplicaciones de HMM nos interesa hacer inferencia de la secuencia de estados {S1,...,ST}, en este caso el criterio de optimización es:

MAP(S|x)=argmaxsP(S|x)=argmaxsP(S,x)

Aqui estamos buscando el camino más probable. Si consideramos un algoritmo de fuerza bruta, esto es, realizamos búsqueda exahustiva sobre todas las posibles secuencias tendríamos que considerar MT casos. Es por ello que nuevamente recurrimos a un algoritmo de programación dinámica.