Павел Александрович Гладков Семинар-практикум в лабораториях ННГУ, созданных при поддержке Intel® Библиотека PNL Probabilistic Network Library Создание графических моделей Обучение моделей Введение наблюдений Механизмы вывода: Junction Tree Inference Loopy-Belief Propagation Проект parPNL - объективно Изучение теоретических основ вероятностных алгоритмов Анализ исходного кода PNL Профилирование библиотеки для нахождения её «узких» мест. Распараллеливание процедур: Для алгоритмов на Junction Tree Для алгоритмов Loopy-Belief Проект parPNL - субъективно Основы работы в MS VC++ 6.0 Теоретические основы вероятностных сетей и механизмов вывода Структуры библиотеки PNL Теоретический курс «параллельные алгоритмы» Инструкции MPI и их применение Инструкции OpenMP Вероятностные сети Графическая модель: А Б А – человек курит Б – у человека рак лёгких P(Б|А)=0.3 Вероятностные сети Более сложная модель «Asia» КУРЕНИЕ БРОНХИТ ВИЗИТ В АЗИЮ РАК ЛЁГКИХ ТУБЕРКУЛЁЗ? ИЛИ ТУБЕРКУЛЁЗ, ИЛИ РАК ЛЁГКИХ ОТДЫШКА ПОЛОЖИТЕЛЬНЫЙ РЕНТГЕН Junction Tree Inference 1. Определение модели: - определение переменных - определение структурных зависимостей - присваивание условных вероятностей 2. Конструирование механизма вывода: - морализация графической модели [упрощение] - триангуляризация морализованного графа - нахождение cliques морализованного графа 3. Анализ наблюдений: - инициализация потенциалов вершин - выполнение “propagation of evidence” - нахождение маргинального распределения вероятностей Профилировка Junction Tree 60 Create (BNet) 50 Create (Evidence) 40 ShrinkObserved 30 20 CollectEvidence 10 DistributeEvidence 0 % общего времени Параллельный JTree Создание Байесовой сети Create(BNet) Создание наблюдения Create(Evidence) Функция DivideNodes, разделяющая работу между N процессами Параллельная версия CollectEvidence Параллельная версия DistributeEvidence Организационный вопрос Сложная иерархия объектов CObject CInfEngine CJtreeInfEngine Периодические обновления PNL Вывод: необходимо создание объекта-потомка CParJtreeInfEngine Функция DivideNodes Вычисляется вес каждой clique Количество вершин в клике Размер сепаратора Вычисляется вес поддеревьев Находится пороговое значение W*=W(Root)/NProc Дерево разбивается на поддеревья с весами, близкими к W* Первоначальный алгоритм 1-ый слой 2-ой слой 3-й слой 4-й слой 11 9 5 10 6 1 7 2 8 3 4 Улучшенный алгоритм W*=270/4=67.5 270 30 100 30 20 140 40 40 20 50 10 20 10 10 50 20 20 10 1 30 30 40 40 Улучшенный алгоритм W*=220/3=73.3 220 30 100 30 20 90 40 40 20 50 10 2 20 10 10 50 20 20 10 1 30 30 40 40 Улучшенный алгоритм W*=130/2=65 130 30 100 30 20 90 40 40 20 50 10 10 10 50 2 20 3 20 20 10 1 30 30 40 40 Улучшенный алгоритм W*=90/1=90 90 30 4 60 30 20 90 40 40 20 50 10 10 10 50 2 20 3 20 20 10 1 30 30 40 40 Сравнение алгоритмов 70 Новый Старый 60 50 40 30 20 10 0 40/115 40/130 50/124 60/134 100/200 Спасибо за внимание Вопросы?