Алгоритм вперед-назад
Эта статья включает список литературы , связанную литературу или внешние ссылки , но ее источники остаются неясными, поскольку в ней отсутствуют встроенные цитаты . ( Апрель 2018 г. ) |
Алгоритм вперед-назад представляет собой вывода алгоритм для скрытых марковских моделей , который вычисляет апостериорные границы всех скрытых переменных состояния с учетом последовательности наблюдений/выбросов. , т.е. он вычисляет для всех скрытых переменных состояния , распределение . Эту задачу вывода обычно называют сглаживанием . Алгоритм использует принцип динамического программирования для эффективного вычисления значений, необходимых для получения апостериорных предельных распределений за два прохода. Первый проход идет вперед во времени, а второй — назад во времени; отсюда и название алгоритма вперед-назад .
Термин «алгоритм вперед-назад» также используется для обозначения любого алгоритма, принадлежащего к общему классу алгоритмов, которые работают с моделями последовательностей в прямом и обратном порядке. В этом смысле описания в оставшейся части статьи относятся только к одному конкретному экземпляру этого класса.
Обзор
[ редактировать ]На первом проходе алгоритм вперед-назад вычисляет набор прямых вероятностей, которые обеспечивают для всех , вероятность оказаться в каком-либо конкретном состоянии при первом наблюдения в последовательности, т.е. . На втором проходе алгоритм вычисляет набор обратных вероятностей, которые обеспечивают вероятность наблюдения оставшихся наблюдений с учетом любой начальной точки. , то есть . Эти два набора распределений вероятностей затем можно объединить, чтобы получить распределение по состояниям в любой конкретный момент времени с учетом всей последовательности наблюдений:
Последний шаг следует из применения правила Байеса и независимости условной и данный .
Как указано выше, алгоритм включает в себя три этапа:
- вычисление прямых вероятностей
- вычисление обратных вероятностей
- вычисление сглаженных значений.
Шаги вперед и назад также можно назвать «передачей сообщения вперед» и «передачей сообщения назад» - эти термины связаны с передачей сообщений, используемой в общих подходах к распространению убеждений . При каждом отдельном наблюдении в последовательности вычисляются вероятности, которые будут использоваться для вычислений при следующем наблюдении. Шаг сглаживания можно рассчитать одновременно во время обратного прохода. Этот шаг позволяет алгоритму учитывать любые прошлые наблюдения за выходными данными для вычисления более точных результатов.
Алгоритм вперед-назад можно использовать для поиска наиболее вероятного состояния в любой момент времени. Однако его нельзя использовать для поиска наиболее вероятной последовательности состояний (см. алгоритм Витерби ).
Форвардные вероятности
[ редактировать ]В следующем описании будут использоваться матрицы значений вероятности, а не распределения вероятностей, хотя в целом алгоритм вперед-назад может применяться как к непрерывным, так и к дискретным вероятностным моделям.
Мы преобразуем распределения вероятностей, относящиеся к данной скрытой марковской модели, в матричную запись следующим образом. Вероятности перехода данной случайной величины представляющие все возможные состояния в скрытой марковской модели, будут представлены матрицей где индекс столбца будет представлять целевое состояние и индекс строки представляет начальное состояние. Переход из состояния вектора-строки в инкрементное состояние вектора-строки написано как . В приведенном ниже примере представлена система, в которой вероятность остаться в том же состоянии после каждого шага составляет 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+1) можно получить состояния, которые наиболее вероятны в эти моменты времени, но вероятность возникновения которых вместе очень мала, т.е. . Наиболее вероятную последовательность состояний, породившую последовательность наблюдений, можно найти с помощью алгоритма Витерби .
Пример
[ редактировать ]В этом примере за основу взят мир зонтиков из книги Russell & Norvig 2010, глава 15, стр. 567 , в котором мы хотели бы сделать вывод о погоде, учитывая наблюдение за другим человеком, который несет или не несет зонтик. Мы предполагаем два возможных состояния погоды: состояние 1 = дождь, состояние 2 = нет дождя. Мы предполагаем, что погода с вероятностью 70% останется неизменной каждый день и с вероятностью 30% изменится. Вероятности перехода тогда равны:
Мы также предполагаем, что каждое состояние генерирует одно из двух возможных событий: событие 1 = зонтик, событие 2 = зонт отсутствует. Условные вероятности их возникновения в каждом состоянии задаются матрицей вероятностей:
Затем мы наблюдаем следующую последовательность событий: {зонтик, зонтик, отсутствие зонтика, зонтик, зонтик}, которую мы представим в наших расчетах как:
Обратите внимание, что отличается от других наблюдением «без зонтика».
При вычислении прямых вероятностей мы начинаем с:
который является нашим вектором предшествующего состояния, указывающим, что мы не знаем, в каком состоянии находится погода до наших наблюдений. Хотя вектор состояния следует задавать в виде вектора-строки, мы будем использовать транспонирование матрицы, чтобы облегчить чтение приведенных ниже вычислений. Тогда наши расчеты запишутся в виде:
вместо:
Обратите внимание, что матрица преобразования также транспонируется, но в нашем примере транспонирование равно исходной матрице. Выполнение этих расчетов и нормализация результатов обеспечивает:
Что касается обратных вероятностей, мы начнем с:
Затем мы можем вычислить (используя наблюдения в обратном порядке и нормируя с помощью различных констант):
Наконец, мы вычислим сглаженные значения вероятности. Эти результаты также необходимо масштабировать так, чтобы сумма их записей была равна 1, поскольку мы не масштабировали обратные вероятности с помощью найден ранее. Таким образом, приведенные выше векторы обратной вероятности фактически представляют вероятность каждого состояния в момент времени t с учетом будущих наблюдений. Поскольку эти векторы пропорциональны фактическим обратным вероятностям, результат необходимо масштабировать еще раз.
Обратите внимание, что значение равно и это равно . Это естественно следует из того, что оба и начните с единых априорных значений для векторов начального и конечного состояния (соответственно) и примите во внимание все наблюдения. Однако, будет равен только когда наш вектор начального состояния представляет собой единообразный априор (т. е. все записи равны). Когда это не так необходимо объединить с вектором начального состояния, чтобы найти наиболее вероятное начальное состояние. Таким образом, мы обнаруживаем, что сами по себе прямые вероятности достаточны для расчета наиболее вероятного конечного состояния. Аналогичным образом, обратные вероятности могут быть объединены с вектором начального состояния, чтобы получить наиболее вероятное начальное состояние с учетом наблюдений. Прямую и обратную вероятности необходимо объединить только для того, чтобы вывести наиболее вероятные состояния между начальной и конечной точками.
Приведенные выше расчеты показывают, что наиболее вероятным погодным явлением во все дни, кроме третьего, был «дождь». Однако они говорят нам нечто большее, поскольку теперь предоставляют возможность количественно оценить вероятности каждого состояния в разное время. Возможно, самое главное, наша ценность в количественно определяет наши знания о векторе состояния в конце последовательности наблюдения. Затем мы можем использовать это, чтобы предсказать вероятность различных погодных условий завтра, а также вероятность наблюдения за зонтиком.
Производительность
[ редактировать ]Алгоритм вперед-назад работает с временной сложностью. в космосе , где длина временной последовательности и количество символов в государственном алфавите. [1] Алгоритм также может работать в постоянном пространстве с временной сложностью. путем пересчета значений на каждом шаге. [2] Для сравнения, процедура грубой силы сгенерирует все возможные последовательности состояний и рассчитать совместную вероятность каждой последовательности состояний с наблюдаемой серией событий, которая будет иметь временную сложность . Грубая сила неразрешима для решения реальных задач, поскольку количество возможных последовательностей скрытых узлов обычно чрезвычайно велико.
Усовершенствование общего алгоритма вперед-назад, называемое алгоритмом Island , позволяет заменять меньшее использование памяти на более длительное время работы. время и память. Кроме того, можно инвертировать модель процесса, чтобы получить космос, алгоритм времени, хотя инвертированный процесс может не существовать или быть плохо обусловленным . [3]
Кроме того, были разработаны алгоритмы расчета. эффективно посредством онлайн-сглаживания, такого как алгоритм сглаживания с фиксированной задержкой (FLS). [4]
Псевдокод
[ редактировать ]algorithm forward_backward is input: guessState int sequenceIndex output: result if sequenceIndex is past the end of the sequence then return 1 if (guessState, sequenceIndex) has been seen before then return saved result result := 0 for each neighboring state n: result := result + (transition probability from guessState to n given observation element at sequenceIndex) × Backward(n, sequenceIndex + 1) save result for (guessState, sequenceIndex) return result
Пример Python
[ редактировать ]Учитывая HMM (так же, как в алгоритме Витерби ), представленный на языке программирования Python :
states = ('Healthy', 'Fever')
end_state = 'E'
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Healthy': 0.6, 'Fever': 0.4}
transition_probability = {
'Healthy' : {'Healthy': 0.69, 'Fever': 0.3, 'E': 0.01},
'Fever' : {'Healthy': 0.4, 'Fever': 0.59, 'E': 0.01},
}
emission_probability = {
'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
}
Мы можем написать реализацию алгоритма вперед-назад следующим образом:
def fwd_bkw(observations, states, start_prob, trans_prob, emm_prob, end_st):
"""Forward–backward algorithm."""
# Forward part of the algorithm
fwd = []
for i, observation_i in enumerate(observations):
f_curr = {}
for st in states:
if i == 0:
# base case for the forward part
prev_f_sum = start_prob[st]
else:
prev_f_sum = sum(f_prev[k] * trans_prob[k][st] for k in states)
f_curr[st] = emm_prob[st][observation_i] * prev_f_sum
fwd.append(f_curr)
f_prev = f_curr
p_fwd = sum(f_curr[k] * trans_prob[k][end_st] for k in states)
# Backward part of the algorithm
bkw = []
for i, observation_i_plus in enumerate(reversed(observations[1:] + (None,))):
b_curr = {}
for st in states:
if i == 0:
# base case for backward part
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] for l in states)
bkw.insert(0,b_curr)
b_prev = b_curr
p_bkw = sum(start_prob[l] * emm_prob[l][observations[0]] * b_curr[l] for l in states)
# Merging the two parts
posterior = []
for i in range(len(observations)):
posterior.append({st: fwd[i][st] * bkw[i][st] / p_fwd for st in states})
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.
В работающем примере алгоритм вперед-назад используется следующим образом:
def example():
return fwd_bkw(observations,
states,
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}
{'Healthy': 0.8770110375573259, 'Fever': 0.1229889624426741} {'Healthy': 0.623228030950954, 'Fever': 0.3767719690490461} {'Healthy': 0.2109527048413057, 'Fever': 0.7890472951586943}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Рассел и Норвиг, 2010, стр. 579.
- ^ Рассел и Норвиг, 2010, стр. 575.
- ^ Биндер, Джон; Мерфи, Кевин; Рассел, Стюарт (1997). «Пространственно-эффективный вывод в динамических вероятностных сетях» (PDF) . Международная совместная конференция. Об искусственном интеллекте . Проверено 8 июля 2020 г.
- ^ Рассел и Норвиг, 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 и алгоритм вперед-назад)