El algoritmo de Viterbi es un algoritmo de programación dinámica que permite obtener la máxima estimación de probabilidad a posteriori de la secuencia más probable de estados ocultos (denominada camino de Viterbi ) que da como resultado una secuencia de eventos observados. Esto se hace especialmente en el contexto de las fuentes de información de Markov y los modelos ocultos de Markov (HMM).
El algoritmo ha encontrado una aplicación universal en la decodificación de los códigos convolucionales utilizados tanto en CDMA como en GSM , módems de acceso telefónico , satélite, comunicaciones de espacio profundo y redes LAN inalámbricas 802.11 . Ahora también se utiliza comúnmente en reconocimiento de voz , síntesis de voz , diarización , [1] detección de palabras clave , lingüística computacional y bioinformática . Por ejemplo, en la conversión de voz a texto (reconocimiento de voz), la señal acústica se trata como la secuencia observada de eventos, y una cadena de texto se considera la "causa oculta" de la señal acústica. El algoritmo de Viterbi encuentra la cadena de texto más probable dada la señal acústica.
El algoritmo de Viterbi recibe su nombre de Andrew Viterbi , quien lo propuso en 1967 como un algoritmo de decodificación para códigos convolucionales sobre enlaces de comunicación digital ruidosos. [2] Sin embargo, tiene una historia de invención múltiple , con al menos siete descubrimientos independientes, incluidos los de Viterbi, Needleman y Wunsch , y Wagner y Fischer . [3] Se introdujo en el procesamiento del lenguaje natural como un método de etiquetado de partes del discurso ya en 1987.
La ruta de Viterbi y el algoritmo de Viterbi se han convertido en términos estándar para la aplicación de algoritmos de programación dinámica a problemas de maximización que involucran probabilidades. [3] Por ejemplo, en el análisis estadístico, se puede utilizar un algoritmo de programación dinámica para descubrir la única derivación (análisis) libre de contexto más probable de una cadena, que comúnmente se denomina "análisis de Viterbi". [4] [5] [6] Otra aplicación es en el seguimiento de objetivos , donde se calcula la pista que asigna una probabilidad máxima a una secuencia de observaciones. [7]
Dado un modelo oculto de Markov con un conjunto de estados ocultos y una secuencia de observaciones , el algoritmo de Viterbi encuentra la secuencia de estados más probable que podría haber producido esas observaciones. En cada paso de tiempo , el algoritmo resuelve el subproblema en el que solo se consideran las observaciones hasta .
Se construyen dos matrices de tamaño :
Sean y las probabilidades inicial y de transición respectivamente, y sea la probabilidad de observar en el estado . Entonces los valores de están dados por la relación de recurrencia [8] La fórmula para es idéntica para , excepto que se reemplaza por , y . La ruta de Viterbi se puede encontrar seleccionando el máximo de en el paso de tiempo final y siguiendo a la inversa.
La función Viterbi(estados, init, trans, emit, obs) es entrada estados: S estados ocultos entrada init: probabilidades iniciales de cada estado entrada trans: matriz de transición S × S entrada emit: matriz de emisión S × O entrada obs: secuencia de T observaciones prob ← Matriz de ceros T × S prev ← Matriz T × S vacía para cada estado s en estados hacer prob[0][s] = init[s] * emit[s][obs[0]] para t = 1 a T - 1 inclusive hacer // t = 0 ya se ha tratado para cada estado s en estados hacer para cada estado r en estados hacer nuevo_prob ← prob[t - 1][r] * trans[r][s] * emitir[s][obs[t]] Si new_prob > prob[t][s] entonces prob[t][s] ← nuevo_prob anterior[t][s] ← r ruta ← matriz vacía de longitud T path[T - 1] ← el estado s con máxima probabilidad[T - 1][s] para t = T - 2 a 0 inclusive hacer ruta[t] ← anterior[t + 1][ruta[t + 1]] Fin de la ruta de retorno
La complejidad temporal del algoritmo es . Si se sabe qué transiciones de estado tienen una probabilidad distinta de cero, se puede encontrar un límite mejorado iterando solo sobre aquellas que se vinculan a en el bucle interno. Luego, utilizando el análisis amortizado, se puede demostrar que la complejidad es , donde es el número de aristas en el gráfico, es decir, el número de entradas distintas de cero en la matriz de transición.
Un médico desea determinar si los pacientes están sanos o tienen fiebre. La única información que puede obtener es preguntándoles cómo se sienten. Los pacientes pueden decir que se sienten normales, mareados o con frío.
Se cree que el estado de salud de los pacientes funciona como una cadena discreta de Markov . Existen dos estados, "saludable" y "fiebre", pero el médico no puede observarlos directamente; están ocultos para él. Cada día, la probabilidad de que un paciente le diga al médico "me siento normal", "tengo frío" o "tengo mareos" depende únicamente del estado de salud del paciente ese día.
Las observaciones (normal, resfriado, mareo) junto con los estados ocultos (saludable, fiebre) forman un modelo oculto de Markov (HMM). A partir de la experiencia previa, las probabilidades de este modelo se han estimado como:
init = {"Saludable": 0,6, "Fiebre": 0,4}trans = { "Saludable": {"Saludable": 0,7, "Fiebre": 0,3}, "Fiebre": {"Saludable": 0,4, "Fiebre": 0,6},}emitir = { "Saludable": {"normal": 0,5, "frío": 0,4, "mareado": 0,1}, "Fiebre": {"normal": 0,1, "resfriado": 0,3, "mareado": 0,6},}
En este código, init
representa la creencia del médico sobre la probabilidad de que el paciente esté sano inicialmente. Nótese que la distribución de probabilidad particular utilizada aquí no es la de equilibrio, que sería {'Healthy': 0.57, 'Fever': 0.43}
según las probabilidades de transición. Las probabilidades de transición trans
representan el cambio de la condición de salud en la cadena de Markov subyacente. En este ejemplo, un paciente que está sano hoy tiene solo un 30% de posibilidades de tener fiebre mañana. Las probabilidades de emisión emit
representan la probabilidad de cada posible observación (normal, resfriado o mareado), dada la condición subyacente (sano o fiebre). Un paciente que está sano tiene un 50% de posibilidades de sentirse normal; uno que tiene fiebre tiene un 60% de posibilidades de sentirse mareado.
Un paciente en particular visita tres días seguidos y refiere sentirse normal el primer día, con frío el segundo día y mareado el tercer día.
En primer lugar, se calculan las probabilidades de estar sano o de tener fiebre el primer día. La probabilidad de que un paciente esté sano el primer día y diga que se siente normal es . Del mismo modo, la probabilidad de que un paciente tenga fiebre el primer día y diga que se siente normal es .
Las probabilidades para cada uno de los días siguientes se pueden calcular directamente a partir del día anterior. Por ejemplo, la probabilidad más alta de estar sano el segundo día y reportar tener un resfriado, después de reportar tener un resfriado normal el primer día, es el máximo de y . Esto sugiere que es más probable que el paciente haya estado sano durante ambos días, en lugar de tener fiebre y recuperarse.
El resto de probabilidades se resumen en la siguiente tabla:
De la tabla se desprende que lo más probable es que el paciente haya tenido fiebre el tercer día. Además, existe una secuencia de estados que termina en "fiebre", cuya probabilidad de producir las observaciones dadas es de 0,01512. Esta secuencia es precisamente (sano, sano, fiebre), que se puede encontrar rastreando los estados que se utilizaron al calcular los máximos (que resulta ser la mejor estimación de cada día, pero no siempre lo será). En otras palabras, dadas las actividades observadas, lo más probable es que el paciente haya estado sano el primer día y también el segundo día (a pesar de sentir frío ese día), y que solo haya contraído fiebre el tercer día.
El funcionamiento del algoritmo de Viterbi se puede visualizar mediante un diagrama de enrejado . El camino de Viterbi es esencialmente el camino más corto a través de este enrejado.
Una generalización del algoritmo de Viterbi, denominada algoritmo de suma máxima (o algoritmo de producto máximo ), se puede utilizar para encontrar la asignación más probable de todas o de algún subconjunto de variables latentes en un gran número de modelos gráficos , por ejemplo , redes bayesianas , campos aleatorios de Markov y campos aleatorios condicionales . Las variables latentes necesitan, en general, estar conectadas de una manera similar a un modelo oculto de Markov (HMM), con un número limitado de conexiones entre variables y algún tipo de estructura lineal entre las variables. El algoritmo general implica el paso de mensajes y es sustancialmente similar al algoritmo de propagación de creencias (que es la generalización del algoritmo de avance-retroceso ).
Con un algoritmo llamado decodificación iterativa de Viterbi , se puede encontrar la subsecuencia de una observación que coincide mejor (en promedio) con un modelo oculto de Markov dado. Este algoritmo es propuesto por Qi Wang et al. para tratar con el código turbo . [9] La decodificación iterativa de Viterbi funciona invocando iterativamente un algoritmo de Viterbi modificado, reestimando la puntuación de un relleno hasta la convergencia.
Se ha propuesto un algoritmo alternativo, el algoritmo Lazy Viterbi. [10] Para muchas aplicaciones de interés práctico, en condiciones de ruido razonables, el decodificador Lazy (que utiliza el algoritmo Lazy Viterbi) es mucho más rápido que el decodificador Viterbi original (que utiliza el algoritmo Viterbi). Mientras que el algoritmo Viterbi original calcula cada nodo en el enrejado de resultados posibles, el algoritmo Lazy Viterbi mantiene una lista priorizada de nodos para evaluar en orden, y la cantidad de cálculos necesarios es típicamente menor (y nunca mayor) que el algoritmo Viterbi ordinario para el mismo resultado. Sin embargo, no es tan fácil [ aclaración necesaria ] para paralelizar en hardware.
El algoritmo de Viterbi de salida suave ( SOVA ) es una variante del algoritmo de Viterbi clásico.
SOVA se diferencia del algoritmo clásico de Viterbi en que utiliza una métrica de ruta modificada que tiene en cuenta las probabilidades a priori de los símbolos de entrada y produce una salida suave que indica la confiabilidad de la decisión.
El primer paso en SOVA es la selección de la ruta de supervivencia, que pasa por un nodo único en cada instante de tiempo, t . Dado que cada nodo tiene 2 ramas que convergen en él (se elige una rama para formar la ruta de supervivencia y se descarta la otra), la diferencia en las métricas de las ramas (o el costo ) entre las ramas elegidas y descartadas indica la cantidad de error en la elección.
Este costo se acumula a lo largo de toda la ventana deslizante (generalmente equivale al menos a cinco longitudes de restricción) para indicar la medida de salida suave de la confiabilidad de la decisión de bit dura del algoritmo de Viterbi.
{{cite conference}}
: CS1 maint: multiple names: authors list (link)