Алгоритм распространения доверия (англ. belief propagation, trust propagation algorithm, также алгоритм «sum-product») — алгоритм маргинализации с помощью двунаправленной передачи сообщений на графе, применяемый для вывода на графических вероятностных моделях (таких как байесовские и марковские сети). Предложен Дж. Перлом в 1982 году.
Рассмотрим функцию:
Чтобы получить вероятность, необходимо её нормализовать:
Рассматриваются следующие задачи:
Все эти задачи NP-полны, так что сложность их решения в худшем случае возрастает экспоненциально. Однако некоторые частные случаи можно решить быстрее, чем и занимается данный алгоритм.
Граф, используемый алгоритмом, состоит из вершин, соответствующих переменным, и вершин, соответствующих функциям. Функции соединены с переменными, от которых они зависят.
Например, функции
соответствует следующий граф:
В графе пересылаются сообщения двух видов: от функций к переменным и от переменных к функциям.
От переменной x i {\displaystyle x_{i}} к функции f j {\displaystyle f_{j}} :
От функции f j {\displaystyle f_{j}} к переменной x i {\displaystyle x_{i}} :
При этом пустое произведение считаем равным единице. Из этих формул видно, что если у вершины всего одна соседняя точка, то её (вершины) сообщение можно вычислить, не зная входящих сообщений.
Существует два подхода, в зависимости от характера полученного графа:
Предположим, что граф является деревом. Начиная с листьев будем постепенно обходить все вершины и вычислять сообщения (при этом применяется стандартное правило передачи сообщений: сообщение можно передавать только в том случае, если его можно полностью построить).
Тогда за количество шагов, равное диаметру графа, работа алгоритма закончится.
Если граф не является деревом, то можно начать с того, что все переменные передают сообщение 1, а потом уже его модифицируют, когда до них доходят сообщения от функций.
Такой алгоритм в общем случае работает неверно и делает много лишнего, но все же полезен на практике.
Когда рассылка сообщений закончена, маргиналы вычисляются по следующей формуле:
Если нужно рассчитать только нормализованные маргиналы (настоящие вероятности), то можно на каждом шаге нормализовать сообщения от переменных к функциям:
где α i j {\displaystyle \alpha _{ij}} подобраны так, чтобы
С математической точки зрения алгоритм перераскладывает изначальное разложение:
в произведение:
где ϕ j {\displaystyle \phi _{j}} соответствует узлам-функциям, а ψ i {\displaystyle \psi _{i}} — узлам-переменным.
Изначально, до передачи сообщений ϕ j ( X j ) = f j ( X j ) {\displaystyle \phi _{j}(X_{j})=f_{j}(X_{j})} и ψ i ( x i ) = 1 {\displaystyle \psi _{i}(x_{i})=1}
Каждый раз, когда приходит сообщение r j → i {\displaystyle r_{j\to i}} из функции в переменную, ϕ {\displaystyle \phi } и ψ {\displaystyle \psi } пересчитываются:
Очевидно, что общее произведение от этого не меняется, а ψ i {\displaystyle \psi _{i}} по окончании передачи сообщений станет маргиналом p ∗ ( x i ) {\displaystyle p^{*}(x_{i})} .
С. Николенко. Курс «Вероятностное обучение»