Алгоритм распространения доверия

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм распространения доверия (Шаблон:Lang-en, также алгоритм «sum-product») — алгоритм маргинализации с помощью двунаправленной передачи сообщений на графе, применяемый для вывода на графических вероятностных моделях (таких как байесовские и марковские сети). Предложен Дж. Перлом в 1982 году.

Постановка задачи

Шаблон:Стиль статьи Рассмотрим функцию:

p∗(X)=∏j=1mfj(Xj), где Xj={xi}i=1n

Чтобы получить вероятность, необходимо её нормализовать:

p(X)=1Z∏j=1mfj(Xj),Z=∑X∏j=1mfj(Xj)

Рассматриваются следующие задачи:

  1. Задача нормализации:
найти Z=∑X∏j=1mfj(Xj)
  1. Задача маргинализации:
найти pi∗(xi)=∑k≠ip∗(X)
  1. Задача нормализованной маргинализации
найти pi(xi)=∑k≠ip(X)

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

Структура графа

Граф, используемый алгоритмом, состоит из вершин, соответствующих переменным, и вершин, соответствующих функциям. Функции соединены с переменными, от которых они зависят.

Пример

Например, функции

p∗(X)=f1(x1)f2(x2)f3(x3)f4(x1,x2)f5(x2,x3)

соответствует следующий граф:

Файл:SumProduct ExampleGraph.png

Передача сообщений

В графе пересылаются сообщения двух видов: от функций к переменным и от переменных к функциям.

От переменной xi к функции fj:

qi→j(xi)=∏k∈ne(i)∖jrk→i(xi) (здесь ne(i) — множество вершин, соседних с i)


От функции fj к переменной xi:

rj→i(xi)=∑Xi∖xi(fj(Xj)∏k∈ne(i)∖jqk→j(xk)

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

Алгоритм

Существует два подхода, в зависимости от характера полученного графа:

Подход 1

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

Тогда за количество шагов, равное диаметру графа, работа алгоритма закончится.

Подход 2

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

Такой алгоритм в общем случае работает неверно и делает много лишнего, но все же полезен на практике.

Вычисление маргиналов

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

pi∗(xi)=∏j∈ne(i)rj→i(xi)
Z=∑ipi∗(xi),p(xi)=1Zpi∗(xi)

Нормализация на лету

Если нужно рассчитать только нормализованные маргиналы (настоящие вероятности), то можно на каждом шаге нормализовать сообщения от переменных к функциям:

qi→j(xi)=αij∏k∈ne(i)∖jrk→i(xi),

где αij подобраны так, чтобы

∑iqi→j(xi)=1

Математическое обоснование алгоритма

С математической точки зрения алгоритм перераскладывает изначальное разложение:

p∗(X)=∏j=1mfj(Xj)

в произведение:

p∗(X)=∏j=1mϕj(Xj)∏i=1mψi(xi),

где ϕj соответствует узлам-функциям, а ψi — узлам-переменным.

Изначально, до передачи сообщений ϕj(Xj)=fj(Xj) и ψi(xi)=1

Каждый раз, когда приходит сообщение rj→i из функции в переменную, ϕ и ψ пересчитываются:

ψi(xi)=∏j∈ne(i)rj→i(xi),
ϕj(Xi)=fj(Xj)∏i∈ne(j)rj→i(xi)

Очевидно, что общее произведение от этого не меняется, а ψi по окончании передачи сообщений станет маргиналом p∗(xi).

Ссылки

С. Николенко. Курс «Вероятностное обучение»