El algoritmo de avance-retroceso es un algoritmo de inferencia para modelos ocultos de Markov que calcula las distribuciones marginales posteriores de todas las variables de estado ocultas dada una secuencia de observaciones/emisiones., es decir, calcula, para todas las variables de estado ocultasla distribuciónEsta tarea de inferencia se suele denominar suavizado . El algoritmo utiliza el principio de programación dinámica para calcular eficientemente los valores necesarios para obtener las distribuciones marginales posteriores en dos pasadas. La primera pasada avanza en el tiempo, mientras que la segunda retrocede; de ahí el nombre de algoritmo de avance-retroceso .
El término algoritmo de avance-retroceso también se utiliza para referirse a cualquier algoritmo perteneciente a la clase general de algoritmos que operan sobre modelos de secuencia de manera bidireccional. En este sentido, las descripciones que se presentan en el resto de este artículo se refieren únicamente a un caso específico de esta clase.
Descripción general
En la primera pasada, el algoritmo hacia adelante-hacia atrás calcula un conjunto de probabilidades hacia adelante que proporcionan, para todo, la probabilidad de terminar en cualquier estado particular dado el primeroobservaciones en la secuencia, es decirEn la segunda pasada, el algoritmo calcula un conjunto de probabilidades hacia atrás que proporcionan la probabilidad de observar las observaciones restantes dado cualquier punto de partida., es decirEstos dos conjuntos de distribuciones de probabilidad se pueden combinar para obtener la distribución sobre los estados en cualquier momento específico, dada toda la secuencia de observaciones:
El último paso se deriva de una aplicación de la regla de Bayes y la independencia condicional deydado.
Como se ha descrito anteriormente, el algoritmo consta de tres pasos:
- cálculo de probabilidades futuras
- cálculo de probabilidades hacia atrás
- Calculando valores suavizados.
Los pasos hacia adelante y hacia atrás también se denominan "paso de mensaje hacia adelante" y "paso de mensaje hacia atrás", términos que se deben al método de propagación de creencias utilizado en general . En cada observación de la secuencia, se calculan las probabilidades que se utilizarán para los cálculos de la siguiente observación. El paso de suavizado se puede calcular simultáneamente durante el paso hacia atrás. Este paso permite que el algoritmo tenga en cuenta las observaciones anteriores de la salida para obtener resultados más precisos.
El algoritmo de avance-retroceso puede utilizarse para encontrar el estado más probable en cualquier momento. Sin embargo, no puede utilizarse para encontrar la secuencia de estados más probable (véase el algoritmo de Viterbi ).
Probabilidades a futuro
La siguiente descripción utilizará matrices de valores de probabilidad en lugar de distribuciones de probabilidad. Sin embargo, el algoritmo de avance-retroceso puede aplicarse, en general, tanto a modelos de probabilidad continuos como discretos.
Transformamos las distribuciones de probabilidad relacionadas con un modelo oculto de Markov dado en notación matricial de la siguiente manera. Las probabilidades de transiciónde una variable aleatoria dadaLa matriz representa todos los estados posibles en el modelo oculto de Markov.donde el índice de la columnarepresentará el estado objetivo y el índice de fila.representa el estado inicial. Una transición desde el estado de vector filaal estado incremental de vector filase escribe comoEl siguiente ejemplo representa un sistema donde la probabilidad de permanecer en el mismo estado después de cada paso es del 70% y la probabilidad de transición al otro estado es del 30%. La matriz de transición es entonces:
En un modelo de Markov típico, multiplicaríamos un vector de estado por esta matriz para obtener las probabilidades del estado subsiguiente. En un modelo oculto de Markov, el estado es desconocido y, en su lugar, observamos eventos asociados con los posibles estados. Una matriz de eventos de la forma:
proporciona las probabilidades de observar eventos dado un estado particular. En el ejemplo anterior, el evento 1 se observará el 90% de las veces si estamos en el estado 1, mientras que el evento 2 tiene una probabilidad del 10% de ocurrir en este estado. Por el contrario, el evento 1 solo se observará el 20% de las veces si estamos en el estado 2 y el evento 2 tiene una probabilidad del 80% de ocurrir. Dado un vector fila arbitrario que describe el estado del sistema (), la probabilidad de observar el evento j es entonces:
La probabilidad de que un estado dado conduzca al evento observado j se puede representar en forma matricial multiplicando el vector fila del estado () con una matriz de observación () que contiene únicamente entradas diagonales. Siguiendo con el ejemplo anterior, la matriz de observación para el evento 1 sería:
Esto nos permite calcular el nuevo vector de estado de probabilidades no normalizadas.mediante la regla de Bayes, ponderando por la probabilidad de que cada elemento deevento generado 1 como:
Ahora podemos hacer que este procedimiento general sea específico para nuestra serie de observaciones. Suponiendo un vector de estado inicial, (que puede optimizarse como un parámetro mediante repeticiones del procedimiento hacia adelante-hacia atrás), comenzamos con, luego actualizando la distribución del estado y ponderando por la probabilidad de la primera observación:
Este proceso puede continuarse con observaciones adicionales utilizando:
Este valor es el vector de probabilidad no normalizado hacia adelante . La i-ésima entrada de este vector proporciona:
Normalmente, normalizaremos el vector de probabilidad en cada paso de modo que la suma de sus entradas sea igual a 1. Por lo tanto, en cada paso se introduce un factor de escala tal que:
dónderepresenta el vector escalado del paso anterior yrepresenta el factor de escala que hace que la suma de las entradas del vector resultante sea igual a 1. El producto de los factores de escala es la probabilidad total de observar los eventos dados, independientemente de los estados finales:
Esto nos permite interpretar el vector de probabilidad escalado como:
Así, encontramos que el producto de los factores de escala nos proporciona la probabilidad total de observar la secuencia dada hasta el tiempo t y que el vector de probabilidad escalada nos proporciona la probabilidad de estar en cada estado en ese momento.
Probabilidades hacia atrás
Se puede construir un procedimiento similar para encontrar probabilidades hacia atrás. Estos pretenden proporcionar las siguientes probabilidades:
Es decir, ahora queremos suponer que comenzamos en un estado particular (), y ahora nos interesa la probabilidad de observar todos los eventos futuros desde este estado. Dado que el estado inicial se asume como dado (es decir, la probabilidad previa de este estado = 100%), comenzamos con:
Observe que ahora estamos utilizando un vector columna, mientras que las probabilidades directas utilizaban vectores fila. A continuación, podemos trabajar hacia atrás utilizando:
Si bien podríamos normalizar este vector para que la suma de sus entradas sea igual a uno, esto no se suele hacer. Teniendo en cuenta que cada entrada contiene la probabilidad de la secuencia de eventos futuros dado un estado inicial particular, normalizar este vector sería equivalente a aplicar el teorema de Bayes para hallar la probabilidad de cada estado inicial dados los eventos futuros (suponiendo distribuciones a priori uniformes para el vector de estado final). Sin embargo, es más común escalar este vector utilizando el mismo método.constantes utilizadas en los cálculos de probabilidad directa. no está escalado, pero las operaciones posteriores utilizan:
dónderepresenta el vector anterior escalado. Este resultado indica que el vector de probabilidad escalado está relacionado con las probabilidades hacia atrás mediante:
Esto es útil porque nos permite hallar la probabilidad total de estar en cada estado en un momento dado, t, multiplicando estos valores:
Para entender esto, observamos queproporciona la probabilidad de observar los eventos dados de una manera que pase por el estadoen el tiempo t. Esta probabilidad incluye las probabilidades hacia adelante que cubren todos los eventos hasta el tiempo t, así como las probabilidades hacia atrás que incluyen todos los eventos futuros. Este es el numerador que buscamos en nuestra ecuación, y dividimos por la probabilidad total de la secuencia de observación para normalizar este valor y extraer solo la probabilidad de queEstos valores a veces se denominan "valores suavizados", ya que combinan las probabilidades hacia adelante y hacia atrás para calcular una probabilidad final.
Los valoresDe esta forma, proporcionan la probabilidad de estar en cada estado en el instante t. Por lo tanto, son útiles para determinar el estado más probable en cualquier momento. El término "estado más probable" es algo ambiguo. Si bien el estado más probable es el que tiene más probabilidades de ser correcto en un punto dado, la secuencia de estados individualmente probables no tiene muchas probabilidades de ser la secuencia más probable. Esto se debe a que las probabilidades para cada punto se calculan independientemente unas de otras. No tienen en cuenta las probabilidades de transición entre estados, y por lo tanto es posible obtener estados en dos momentos (t y t+1) que son ambos los más probables en esos instantes, pero que tienen muy poca probabilidad de ocurrir juntos, es decirLa secuencia de estados más probable que produjo una secuencia de observación se puede encontrar utilizando el algoritmo de Viterbi .
Ejemplo
Este ejemplo se basa en el mundo de los paraguas descrito en Russell y Norvig (2010), capítulo 15, pág. 567, donde se pretende inferir el tiempo a partir de la observación de una persona que lleva o no un paraguas. Suponemos dos estados posibles para el tiempo: estado 1 = lluvia, estado 2 = ausencia de lluvia. Suponemos que el tiempo tiene un 70 % de probabilidad de permanecer igual cada día y un 30 % de probabilidad de cambiar. Las probabilidades de transición son, por lo tanto:
También asumimos que cada estado genera uno de dos posibles eventos: evento 1 = paraguas, evento 2 = sin paraguas. Las probabilidades condicionales de que estos ocurran en cada estado vienen dadas por la matriz de probabilidad:
A continuación, observamos la siguiente secuencia de eventos: {paraguas, paraguas, sin paraguas, paraguas, paraguas} que representaremos en nuestros cálculos como:
Tenga en cuenta queSe diferencia de los demás por la observación de que "no lleva paraguas".
Para calcular las probabilidades a futuro, comenzamos con:
que es nuestro vector de estado previo, lo que indica que no sabemos en qué estado se encuentra el clima antes de nuestras observaciones. Si bien un vector de estado debería darse como un vector fila, utilizaremos la transpuesta de la matriz para que los cálculos que siguen sean más fáciles de leer. Nuestros cálculos se escriben entonces de la siguiente forma:
en lugar de:
Nótese que la matriz de transformación también se transpone, pero en nuestro ejemplo la transpuesta es igual a la matriz original. Al realizar estos cálculos y normalizar los resultados, obtenemos:
Para las probabilidades hacia atrás, comenzamos con:
Entonces podemos calcular (utilizando las observaciones en orden inverso y normalizando con diferentes constantes):
Finalmente, calcularemos los valores de probabilidad suavizados. Estos resultados también deben escalarse de modo que sus entradas sumen 1 porque no escalamos las probabilidades hacia atrás con laSe encontró anteriormente. Los vectores de probabilidad hacia atrás anteriores representan, por lo tanto, la probabilidad de cada estado en el instante t dadas las observaciones futuras. Dado que estos vectores son proporcionales a las probabilidades reales hacia atrás, el resultado debe escalarse un factor adicional.
Observe que el valor dees igual ay esoes igual aEsto se deduce naturalmente porque ambosycomenzar con distribuciones a priori uniformes sobre los vectores de estado inicial y final (respectivamente) y tener en cuenta todas las observaciones. Sin embargo,será igual acuando nuestro vector de estado inicial representa una distribución a priori uniforme (es decir, todas las entradas son iguales). Cuando este no es el casoEs necesario combinar las probabilidades hacia adelante con el vector de estado inicial para hallar el estado inicial más probable. De este modo, concluimos que las probabilidades hacia adelante son suficientes para calcular el estado final más probable. Del mismo modo, las probabilidades hacia atrás pueden combinarse con el vector de estado inicial para obtener el estado inicial más probable a partir de las observaciones. Las probabilidades hacia adelante y hacia atrás solo necesitan combinarse para inferir los estados más probables entre los puntos inicial y final.
Los cálculos anteriores revelan que el estado meteorológico más probable en todos los días excepto en el tercero fue "lluvia". Sin embargo, nos dicen más que esto, ya que ahora proporcionan una forma de cuantificar las probabilidades de cada estado en diferentes momentos. Quizás lo más importante sea nuestro valor enCuantifica nuestro conocimiento del vector de estado al final de la secuencia de observación. Podemos usarlo para predecir la probabilidad de los distintos estados meteorológicos de mañana, así como la probabilidad de observar un paraguas.
Actuación
El algoritmo de avance-retroceso se ejecuta con complejidad temporalen el espacio, dóndees la duración de la secuencia de tiempo yes el número de símbolos en el alfabeto del estado. [ 1 ] El algoritmo también puede ejecutarse en espacio constante con complejidad temporal.recalculando valores en cada paso. [ 2 ] En comparación, un procedimiento de fuerza bruta generaría todos los posiblessecuencias de estados y calcular la probabilidad conjunta de cada secuencia de estados con la serie de eventos observados, lo que tendría una complejidad temporal.El método de fuerza bruta resulta intratable para problemas realistas, ya que el número de posibles secuencias de nodos ocultos suele ser extremadamente alto.
Una mejora del algoritmo general de avance-retroceso, llamado algoritmo de la isla , intercambia un menor uso de memoria por un mayor tiempo de ejecución, tomandotiempo ymemoria. Además, es posible invertir el modelo de proceso para obtener unespacio,algoritmo de tiempo, aunque el proceso invertido puede no existir o estar mal condicionado . [ 3 ]
Además, se han desarrollado algoritmos para calculareficientemente a través de suavizado en línea como el algoritmo de suavizado de retardo fijo (FLS). [ 4 ]
Pseudocódigo
El algoritmo forward_backward es la entrada: guessState Salida de int sequenceIndex : resultadoSi sequenceIndex está más allá del final de la secuencia , entonces devuelve 1. Si ( guessState , sequenceIndex ) ya se ha visto antes, entonces devuelve el resultado guardado . resultado := 0 para cada estado vecino n: resultado := resultado + (probabilidad de transición de guessState a n elemento de observación dado en sequenceIndex ) × Hacia atrás(n, índice de secuencia + 1) guardar resultado para ( guessState , sequenceIndex ) devolver resultado
Ejemplo de Python
Dado el HMM (al igual que en el algoritmo de Viterbi ) representado en el lenguaje de programación Python :
estados = ( "Sano" , "Fiebre" ) estado_final = "E"observaciones = ( "normal" , "frío" , "mareado" )probabilidad_inicial = { "Sano" : 0.6 , "Fiebre" : 0.4 }probabilidad_de_transición = { "Saludable" : { "Saludable" : 0.69 , "Fiebre" : 0.3 , "E" : 0.01 }, "Fiebre" : { "Saludable" : 0.4 , "Fiebre" : 0.59 , "E" : 0.01 }, }probabilidad_de_emisión = { "Saludable" : { "normal" : 0.5 , "frío" : 0.4 , "mareado" : 0.1 }, "Fiebre" : { "normal" : 0.1 , "frío" : 0.3 , "mareado" : 0.6 }, }Podemos escribir la implementación del algoritmo de avance-retroceso de esta manera:
def fwd_bkw ( observaciones , estados , start_prob , trans_prob , emm_prob , end_st ): """Algoritmo hacia adelante-hacia atrás.""" # Parte hacia adelante del algoritmo fwd = [] for i , observation_i in enumerate ( observaciones ): f_curr = {} for st in estados : if i == 0 : # caso base para la parte hacia adelante prev_f_sum = start_prob [ st ] else : prev_f_sum = sum ( f_prev [ k ] * trans_prob [ k ][ st ] for k in estados )f_curr [ st ] = emm_prob [ st ][ observation_i ] * prev_f_sumfwd.append ( f_curr ) f_prev = f_currp_fwd = suma ( f_curr [ k ] * trans_prob [ k ][ end_st ] para k en estados )# Parte inversa del algoritmo bkw = [] para i , observation_i_plus en enumerate ( reversed ( observations [ 1 :] + ( None ,))): b_curr = {} para st en states : si i == 0 : # caso base para la parte inversa b_curr [ st ] = trans_prob [ st ][ end_st ] else : b_curr [ st ] = sum ( trans_prob [ st ][ l ] * emm_prob [ l ][ observation_i_plus ] * b_prev [ l ] para l en states )bkw.insertar ( 0 , b_curr ) b_prev = b_currp_bkw = suma ( start_prob [ l ] * emm_prob [ l ][ observations [ 0 ]] * b_curr [ l ] para l en estados )# Fusionando las dos partes posterior = [] para i en rango ( len ( observaciones )): posterior . append ({ st : fwd [ i ][ st ] * bkw [ i ][ st ] / p_fwd para st en estados })assert p_fwd == p_bkw return fwd , bkw , posteriorLa función fwd_bkwtoma los siguientes argumentos: xes la secuencia de observaciones, por ejemplo ['normal', 'cold', 'dizzy']; stateses el conjunto de estados ocultos; a_0es la probabilidad de inicio; ason las probabilidades de transición; y eson las probabilidades de emisión.
Para simplificar el código, asumimos que la secuencia de observación xno está vacía y que a[i][j]y e[i][j]está definida para todos los estados i,j.
En el ejemplo que se está ejecutando, el algoritmo de avance-retroceso se utiliza de la siguiente manera:
def ejemplo (): return fwd_bkw ( observaciones , estados , probabilidad_inicio , probabilidad_transición , probabilidad_emisión , estado_final , )>>> para línea en ejemplo (): ... imprimir ( * línea ) ... {'Saludable': 0.3, 'Fiebre': 0.04000000000000001} {'Saludable': 0.0892, 'Fiebre': 0.03408} {'Saludable': 0.007518, 'Fiebre': 0.028120319999999997} {'Saludable': 0.0010418399999999998, 'Fiebre': 0.00109578} {'Saludable': 0.00249, 'Fiebre': 0.00394} {'Saludable': 0.01, 'Fiebre': 0.01} {'Saludable': 0,8770110375573259, 'Fiebre': 0,1229889624426741} {'Saludable': 0,623228030950954, 'Fiebre': 0,3767719690490461} {'Saludable': 0,2109527048413057, 'Fiebre': 0,7890472951586943}Véase también
Referencias
- ↑ Russell y Norvig 2010 págs. 579
- ↑ Russell y Norvig 2010 págs. 575
- ↑ Binder, John; Murphy, Kevin; Russell, Stuart (1997). "Inferencia eficiente en espacio en redes probabilísticas dinámicas" (PDF) . Conferencia Conjunta Internacional sobre Inteligencia Artificial . Recuperado el 8 de julio de 2020 .
- ↑ Russell y Norvig 2010 Figura 15.6 págs. 580
- Lawrence R. Rabiner , Tutorial sobre modelos ocultos de Markov y aplicaciones seleccionadas en el reconocimiento de voz. Actas del IEEE , 77 (2), págs. 257-286, febrero de 1989. 10.1109/5.18626
- Lawrence R. Rabiner, BH Juang (enero de 1986). "Una introducción a los modelos ocultos de Markov". Revista IEEE ASSP : 4– 15.
- Eugene Charniak (1993). Aprendizaje estadístico del lenguaje . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-53141-2.
- Stuart Russell y Peter Norvig (2010). Inteligencia artificial: Un enfoque moderno, 3.ª edición . Upper Saddle River, Nueva Jersey: Pearson Education/Prentice-Hall. ISBN 978-0-13-604259-4.
Enlaces externos
- Una hoja de cálculo interactiva para enseñar el algoritmo de avance-retroceso (hoja de cálculo y artículo con instrucciones paso a paso).
- Tutorial de modelos ocultos de Markov, incluyendo el algoritmo de avance-retroceso.
- Colección de algoritmos de IA implementados en Java (incluidos HMM y el algoritmo de avance-retroceso).
- Programación dinámica
- Detección y corrección de errores
- algoritmos de aprendizaje automático
- modelos de Markov