Из Википедии, бесплатной энциклопедии
  (Перенаправлен из алгоритма вперед-назад )
Перейти к навигации Перейти к поиску

Алгоритм вперед-назад это умозаключение алгоритм для скрытых марковских моделей , который вычисляет задние маргиналов всех скрытых переменных состояния дана последовательность наблюдений / выбросов , т.е. он вычисляет, для всех скрытых переменных состояния , распределения . Эта задача вывода обычно называется сглаживанием . Алгоритм использует принцип динамического программирования для эффективного вычисления значений, необходимых для получения апостериорных предельных распределений за два прохода. Первый проход идет вперед во времени, а второй - назад; отсюда и название алгоритм прямого-обратного.

Термин " прямой – обратный алгоритм" также используется для обозначения любого алгоритма, принадлежащего к общему классу алгоритмов, которые работают с моделями последовательностей прямым и обратным образом. В этом смысле описания в оставшейся части этой статьи относятся только к одному конкретному экземпляру этого класса.

Обзор [ править ]

На первом проходе алгоритм вперед-назад вычисляет набор прямых вероятностей, которые обеспечивают для всех вероятность оказаться в любом конкретном состоянии с учетом первых наблюдений в последовательности, т . Е. Во втором проходе алгоритм вычисляет набор обратных вероятностей, которые обеспечивают вероятность наблюдения оставшихся наблюдений при любой начальной точке , т . Е. Затем эти два набора распределений вероятностей можно объединить, чтобы получить распределение по состояниям в любой конкретный момент времени с учетом всей последовательности наблюдений:

Последний шаг следует из применения правила Байеса и условной независимости от и данного .

Как указано выше, алгоритм состоит из трех шагов:

  1. вычисление прямых вероятностей
  2. вычисление обратных вероятностей
  3. вычисление сглаженных значений.

Шаги вперед и назад могут также называться «прямой проход сообщения» и «обратный проход сообщения» - эти термины связаны с передачей сообщения, используемой в общих подходах к распространению убеждений . Для каждого отдельного наблюдения в последовательности вычисляются вероятности, которые будут использоваться для вычислений при следующем наблюдении. Шаг сглаживания можно рассчитать одновременно во время обратного прохода. Этот шаг позволяет алгоритму учитывать любые прошлые наблюдения за выходными данными для вычисления более точных результатов.

Алгоритм прямого-обратного можно использовать для поиска наиболее вероятного состояния в любой момент времени. Однако его нельзя использовать для поиска наиболее вероятной последовательности состояний (см. Алгоритм Витерби ).

Прямые вероятности [ править ]

В нижеследующем описании будут использоваться матрицы значений вероятности, а не распределения вероятностей, хотя в целом алгоритм прямого-обратного может применяться как к непрерывным, так и к дискретным вероятностным моделям.

Мы преобразуем распределения вероятностей, связанные с данной скрытой марковской моделью, в матричную запись следующим образом. Вероятности перехода данной случайной переменной, представляющей все возможные состояния в скрытой марковской модели, будут представлены матрицей, где индекс столбца будет представлять целевое состояние, а индекс строки представляет начальное состояние. Переход от состояния вектора-строки к состоянию инкрементного вектора-строки записывается как . В приведенном ниже примере представлена ​​система, в которой вероятность остаться в том же состоянии после каждого шага составляет 70%, а вероятность перехода в другое состояние составляет 30%. Тогда матрица перехода будет следующей:

В типичной марковской модели мы умножаем вектор состояния на эту матрицу, чтобы получить вероятности для последующего состояния. В скрытой марковской модели состояние неизвестно, и вместо этого мы наблюдаем события, связанные с возможными состояниями. Матрица событий вида:

предоставляет вероятности для наблюдения событий в конкретном состоянии. В приведенном выше примере событие 1 будет наблюдаться в 90% случаев, если мы находимся в состоянии 1, в то время как событие 2 имеет 10% вероятность возникновения в этом состоянии. Напротив, событие 1 будет наблюдаться только в 20% случаев, если мы находимся в состоянии 2, а вероятность возникновения события 2 составляет 80%. Для произвольного вектора-строки, описывающего состояние системы ( ), вероятность наблюдения события j равна:

Вероятность данного состояния, ведущего к наблюдаемому событию j, может быть представлена ​​в матричной форме путем умножения вектора-строки состояния ( ) на матрицу наблюдения ( ), содержащую только диагональные элементы. Продолжая приведенный выше пример, матрица наблюдения для события 1 будет:

Это позволяет нам вычислить новый вектор состояния ненормализованных вероятностей с помощью правила Байеса, взвешивая по вероятности того, что каждый элемент сгенерированного события 1 как:

Теперь мы можем конкретизировать эту общую процедуру для нашей серии наблюдений. Предполагая начальный вектор состояния (который может быть оптимизирован как параметр путем повторения процедуры прямого и обратного), мы начинаем с , а затем обновляем распределение состояний и взвешивание по вероятности первого наблюдения:

Этот процесс можно продолжить с дополнительными наблюдениями, используя:

Это значение представляет собой прямой ненормализованный вектор вероятности. I-я запись этого вектора обеспечивает:

Обычно мы нормализуем вектор вероятности на каждом шаге так, чтобы сумма его элементов равнялась 1. Таким образом, на каждом шаге вводится коэффициент масштабирования, так что

где представляет масштабированный вектор из предыдущего шага и представляет коэффициент масштабирования, который заставляет элементы результирующего вектора суммироваться до 1. Произведение коэффициентов масштабирования представляет собой полную вероятность наблюдения данных событий независимо от конечных состояний:

Это позволяет нам интерпретировать масштабированный вектор вероятности как:

Таким образом, мы обнаруживаем, что произведение коэффициентов масштабирования дает нам полную вероятность наблюдения данной последовательности до момента времени t, а масштабированный вектор вероятности дает нам вероятность нахождения в каждом состоянии в это время.

Обратные вероятности [ править ]

Подобная процедура может быть построена для нахождения обратных вероятностей. Они предназначены для обеспечения вероятностей:

То есть теперь мы хотим предположить, что мы начинаем в определенном состоянии ( ), и теперь нас интересует вероятность наблюдения всех будущих событий из этого состояния. Поскольку исходное состояние считается заданным (т.е. априорная вероятность этого состояния = 100%), мы начинаем с:

Обратите внимание, что теперь мы используем вектор-столбец, тогда как прямые вероятности использовали векторы-строки. Затем мы можем работать в обратном направлении, используя:

Хотя мы могли бы также нормализовать этот вектор, чтобы сумма его записей равнялась единице, обычно этого не делается. Отмечая, что каждая запись содержит вероятность будущей последовательности событий с учетом конкретного начального состояния, нормализация этого вектора была бы эквивалентна применению теоремы Байеса для нахождения вероятности каждого начального состояния с учетом будущих событий (при условии единообразных априорных значений для вектора конечного состояния ). Однако более распространено масштабирование этого вектора с использованием тех же констант, которые используются при расчетах прямой вероятности. не масштабируется, но в последующих операциях используются:

где представляет предыдущий масштабированный вектор. Этот результат состоит в том, что масштабированный вектор вероятности связан с обратными вероятностями следующим образом:

Это полезно, потому что позволяет нам найти общую вероятность нахождения в каждом состоянии в данный момент времени t путем умножения этих значений:

Чтобы понять это, отметим, что обеспечивает вероятность наблюдения данных событий способом, который проходит через состояние в момент времени t. Эта вероятность включает прямые вероятности, охватывающие все события до момента времени t, а также обратные вероятности, которые включают все будущие события. Это числитель, который мы ищем в нашем уравнении, и мы делим его на полную вероятность последовательности наблюдений, чтобы нормализовать это значение, и извлекаем только вероятность того, что . Эти значения иногда называют «сглаженными значениями», поскольку они объединяют прямую и обратную вероятности для вычисления окончательной вероятности.

Таким образом, значения обеспечивают вероятность нахождения в каждом состоянии в момент времени t. Таким образом, они полезны для определения наиболее вероятного состояния в любое время. Термин «наиболее вероятное состояние» несколько неоднозначен. Хотя наиболее вероятное состояние с наибольшей вероятностью будет правильным в данной точке, последовательность индивидуально вероятных состояний вряд ли будет наиболее вероятной последовательностью. Это связано с тем, что вероятности для каждой точки рассчитываются независимо друг от друга. Они не принимают во внимание вероятности перехода между состояниями, и, таким образом, можно получить состояния в два момента (t и t + 1), которые являются наиболее вероятными в эти моменты времени, но которые имеют очень небольшую вероятность возникновения вместе, т. Е.. Наиболее вероятную последовательность состояний, которые привели к последовательности наблюдений, можно найти с помощью алгоритма Витерби .

Пример [ править ]

Этот пример берет за основу зонтичный мир из Russell & Norvig 2010, глава 15, стр. 567, в котором мы хотели бы сделать вывод о погоде на основе наблюдения за другим человеком, несущим или не несущим зонтик. Мы предполагаем два возможных состояния погоды: состояние 1 = дождь, состояние 2 = без дождя. Мы предполагаем, что у погоды есть 70% шанс оставаться неизменной каждый день и 30% шанс измениться. Тогда вероятности перехода таковы:

Мы также предполагаем, что каждое состояние генерирует одно из двух возможных событий: событие 1 = зонтик, событие 2 = отсутствие зонтика. Условные вероятности их появления в каждом состоянии задаются матрицей вероятностей:

Затем мы наблюдаем следующую последовательность событий: {зонтик, зонтик, без зонта, зонтик, зонтик}, которые мы представим в наших расчетах как:

Обратите внимание, что отличается от других из-за наблюдения «без зонтика».

При вычислении прямых вероятностей мы начинаем с:

который является нашим вектором предыдущего состояния, указывающим на то, что мы не знаем, в каком состоянии находится погода до наших наблюдений. Хотя вектор состояния должен быть задан как вектор-строка, мы будем использовать транспонирование матрицы, чтобы было легче читать приведенные ниже вычисления. Наши расчеты записываются в виде:

вместо:

Обратите внимание, что матрица преобразования также транспонируется, но в нашем примере транспонирование равно исходной матрице. Выполнение этих расчетов и нормализация результатов обеспечивает:

Для обратных вероятностей мы начнем с:

Затем мы можем вычислить (используя наблюдения в обратном порядке и нормализовав с разными константами):

Наконец, мы вычислим сглаженные значения вероятности. Эти результаты также должны быть масштабированы так, чтобы их сумма записей равнялась 1, потому что мы не масштабировали обратные вероятности с найденными ранее. Таким образом, приведенные выше обратные векторы вероятности фактически представляют вероятность каждого состояния в момент времени t с учетом будущих наблюдений. Поскольку эти векторы пропорциональны реальным обратным вероятностям, результат необходимо дополнительно масштабировать.

Обратите внимание, что значение равно, а оно равно . Это следует естественно, потому что оба и начинаются с единых априорных значений по векторам начального и конечного состояния (соответственно) и учитывают все наблюдения. Однако он будет равен только тогда, когда наш вектор начального состояния представляет собой однородный априор (т.е. все записи равны). Когда это не такнеобходимо объединить с вектором начального состояния, чтобы найти наиболее вероятное начальное состояние. Таким образом, мы находим, что прямых вероятностей самих по себе достаточно для расчета наиболее вероятного конечного состояния. Точно так же обратные вероятности могут быть объединены с вектором начального состояния, чтобы обеспечить наиболее вероятное начальное состояние с учетом наблюдений. Прямые и обратные вероятности нужно только объединить, чтобы вывести наиболее вероятные состояния между начальной и конечной точками.

Приведенные выше расчеты показывают, что наиболее вероятным состоянием погоды на каждый день, кроме третьего, был «дождь». Однако они говорят нам больше, поскольку теперь они предоставляют способ количественной оценки вероятностей каждого состояния в разное время. Возможно, наиболее важно то, что наше значение в количественно определяет наши знания о векторе состояния в конце последовательности наблюдений. Затем мы можем использовать это, чтобы предсказать вероятность различных погодных условий завтра, а также вероятность наблюдения за зонтом.

Производительность [ править ]

Алгоритм прямого-обратного работает с временной сложностью в пространстве , где - длина временной последовательности, а - количество символов в алфавите состояний. [1] Алгоритм также может работать в постоянном пространстве с временной сложностью путем пересчета значений на каждом шаге. [2] Для сравнения, процедура грубой силы генерирует все возможные последовательности состояний и вычисляет совместную вероятность каждой последовательности состояний с наблюдаемой серией событий, которые будут иметь временную сложность . Грубая сила неразрешима для реалистичных задач, поскольку количество возможных последовательностей скрытых узлов обычно чрезвычайно велико.

Усовершенствование общего алгоритма вперед-назад, называемого алгоритмом острова , использует меньшее использование памяти для более длительного времени работы, отнимая время и память. Кроме того, можно инвертировать модель процесса для получения пространственно- временного алгоритма, хотя инвертированный процесс может не существовать или быть плохо обусловленным . [3]

Кроме того, были разработаны алгоритмы для эффективных вычислений посредством онлайн-сглаживания, такие как алгоритм сглаживания с фиксированной задержкой (FLS). [4]

Псевдокод [ править ]

Алгоритм forward_backward является  ввод: guessState int sequenceIndex  вывод:  результат если  sequenceIndex находится за концом последовательности, тогда  верните 1, если ( guessState , sequenceIndex ) было замечено раньше, затем  вернуть сохраненный результат результат  : = 0 для каждого соседнего состояния n: result  : = result + (вероятность перехода от guessState к n заданный элемент наблюдения в sequenceIndex ) × Назад (n, sequenceIndex + 1) сохранить результат для ( guessState , sequenceIndex ) вернуть  результат

Пример Python [ править ]

Учитывая HMM (как и в алгоритме Витерби ), представленный на языке программирования Python :

состояния  =  ( 'Здоровый' ,  'Лихорадка' ) end_state  =  'E' наблюдения  =  ( 'нормальный' ,  'холодный' ,  'головокружительный' ) start_probability  =  { 'Здоровый' :  0,6 ,  'Лихорадка' :  0,4 } transition_probability  =  {  'Healthy'  :  { 'Healthy' :  0,69 ,  'Fever' :  0,3 ,  'E' :  0,01 },  'Fever'  :  { 'Healthy' :  0,4 ,  'Fever' :  0,59 ,  'E' :  0,01 } ,  } эмиссия_probability  =  {  'Здоровый'  :  { 'нормальный' :  0,5 ,  'холодный' :  0,4 ,  'головокружительный' :  0,1 },  'Лихорадка'  :  { 'нормальный' :  0,1 ,  'холодный' :  0,3 ,  'головокружительный' :  0,6 } ,  }

Мы можем написать реализацию алгоритма вперед-назад следующим образом:

def  fwd_bkw ( наблюдения ,  состояния ,  start_prob ,  trans_prob ,  emm_prob ,  end_st ):  "" "Алгоритм прямого – обратного." ""  # Прямая часть алгоритма  fwd  =  []  для  i ,  наблюдение_i  в  enumerate ( наблюдения ):  f_curr  =  { }  для  ст  в  состояниях :  если  я  ==  0 :  # базовый случай для передней части  prev_f_sum  = start_prob [ st ]  else :  prev_f_sum  =  sum ( f_prev [ k ]  *  trans_prob [ k ] [ st ]  для  k  в  состояниях ) f_curr [ st ]  =  emm_prob [ st ] [ наблюдение_i ]  *  prev_f_sum fwd . добавить ( f_curr )  f_prev  =  f_curr p_fwd  =  sum ( f_curr [ k ]  *  trans_prob [ k ] [ end_st ]  для  k  в  состояниях ) # Обратная часть алгоритма  bkw  =  []  для  i ,  наблюдение_i_plus  в  перечислении ( обратное ( наблюдение [ 1 :]  +  ( None ,))):  b_curr  =  {}  для  st  в  состояниях :  if  i  ==  0 :  # базовый случай для обратной части  b_curr [ st ]  =  trans_prob [ st ] [ end_st ]  else :  b_curr[ st ]  =  sum ( trans_prob [ st ] [ l ]  *  emm_prob [ l ] [ Наблюдение_i_plus ]  *  b_prev [ l ]  для  l  в  состояниях ) bkw . вставить ( 0 , b_curr )  b_prev  =  b_curr p_bkw  =  sum ( start_prob [ l ]  *  emm_prob [ l ] [ наблюдения [ 0 ]]  *  b_curr [ l ]  для  l  в  состояниях ) # Объединение двух частей  posterior  =  []  для  i  in  range ( len ( наблюдения )):  posterior . append ({ st :  fwd [ i ] [ st ]  *  bkw [ i ] [ st ]  /  p_fwd  для  st  в  состояниях }) assert  p_fwd  ==  p_bkw  return  fwd ,  bkw ,  posterior

Функция fwd_bkwпринимает следующие аргументы: x- последовательность наблюдений, например ['normal', 'cold', 'dizzy']; statesэто набор скрытых состояний; a_0- вероятность старта; a- вероятности перехода; и e- вероятности выбросов.

Для простоты кода, мы предполагаем , что последовательность наблюдения xне пусто и что a[i][j]и e[i][j]определено для всех состояний I, J.

В текущем примере алгоритм вперед-назад используется следующим образом:

Защиту  пример ():  возвращение  fwd_bkw ( наблюдения ,  состояние ,  start_probability ,  transition_probability ,  emission_probability ,  end_state )
>>> for  line  in  example (): ...  print ( * line ) ... {'Healthy': 0,3, 'Fever': 0,04000000000000001} {'Healthy': 0,0892, 'Fever': 0,03408} {'Healthy ': 0,007518,' Fever ': 0,028120319999999997} {' Healthy ': 0,0010418399999999998,' Fever ': 0,00109578} {' Healthy ': 0,00249,' Fever ': 0,00394} {' Healthy ': 0,01,' Fever ': 0,01} { «Здоровый»: 0,8770110375573259, «Лихорадка»: 0,1229889624426741} {«Здоровый»: 0,623228030950954, «Лихорадка»: 0,3767719690490461} {«Здоровый»: 0,2109527048413057, «Лихорадка»: 0,7890472951586943}

См. Также [ править ]

  • Алгоритм Баума – Велча
  • Алгоритм Витерби
  • Алгоритм BCJR

Ссылки [ править ]

  1. Рассел и Норвиг, 2010, с. 579.
  2. Рассел и Норвиг, 2010, с. 575.
  3. ^ Биндер, Джон; Мерфи, Кевин; Рассел, Стюарт (1997). "Эффективное использование пространства в динамических вероятностных сетях" (PDF) . Int'l, Joint Conf. Об искусственном интеллекте . Проверено 8 июля 2020 .
  4. ^ Russell & Norvig 2010 Рисунок 15.6, стр. 580
  • Лоуренс Р. Рабинер , Учебное пособие по скрытым марковским моделям и избранным приложениям в распознавании речи. Труды IEEE , 77 (2), стр. 257–286, февраль 1989 г. 10.1109 / 5.18626
  • Лоуренс Р. Рабинер, Б. Х. Хуанг (январь 1986 г.). «Введение в скрытые марковские модели». Журнал IEEE ASSP : 4–15.
  • Евгений Чарняк (1993). Статистическое изучение языков . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-53141-2.
  • Стюарт Рассел и Питер Норвиг (2010). Искусственный интеллект - современный подход, 3-е издание . Река Аппер Сэдл, Нью-Джерси: Pearson Education / Prentice-Hall. ISBN 978-0-13-604259-4.

Внешние ссылки [ править ]

  • Интерактивная таблица для обучения алгоритму прямого и обратного хода (таблица и статья с пошаговым описанием)
  • Учебное пособие по скрытым марковским моделям, включая алгоритм вперед – назад
  • Коллекция алгоритмов искусственного интеллекта, реализованных на Java (включая HMM и алгоритм вперед-назад)