Практическое руководство

Этот пост является частью книги: Практическое квантовое машинное обучение с помощью Python.

Байесовские сети - это вероятностные модели, моделирующие знания о неопределенной области. Например, выживание пассажира на борту «Титаника».

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

Байесовская сеть представлена ​​как ориентированный ациклический граф с узлами и ребрами.

Узлы представляют собой случайные переменные, такие как пол пассажира или то, был ли он / она ребенком.

Ребра соответствуют прямому влиянию одной переменной на другую. Другими словами, края определяют взаимосвязь между двумя переменными. Направление стрелок тоже важно. Узел, соединенный с хвостом стрелки, является родительским узлом. Узел, подключенный к голове, является дочерним узлом. Дочерний узел зависит от родительского узла.

Мы количественно оцениваем эту зависимость с помощью таблиц условных вероятностей (CPT) для дискретных переменных и условных распределений вероятностей (CPD) для непрерывных переменных.

В следующей таблице показаны апостериорные вероятности выживания с учетом пола пассажира (Sex).

У пассажиров-женщин было намного больше шансов выжить, чем у пассажиров-мужчин.

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

На первый взгляд кажется, что возраст пассажира явно не влияет на шансы на выживание. Хуже того, шансы на выживание сильно различаются в зависимости от возраста. Например, у 47-летнего пассажира шанс выжить был 0,1, а у 48-летнего - 0,6.

Такие вариации не кажутся разумными.

Вместо этого, если мы рассмотрим характеристику ребенка (isChild), а не Age пассажира. Дети в возрасте 8 лет и младше имели значительно более высокие шансы на выживание, чем взрослые.

Рассмотрим байесовскую сеть с тремя узлами. Переменные Sex и Child обозначают родительские узлы. У этих узлов нет самих родителей. Это корневые узлы. Их CPT обусловлены пустым набором переменных. Таким образом, они равны предельным (или априорным) вероятностям. Обратите внимание, это не вероятность выживания, а вероятность появления соответствующей характеристики.

Survival кораблекрушения "Титаник" является дочерним узлом. Этот CPT зависит от значений родительских узлов, как показано на следующем рисунке.

Учитывая такой набор CPT, мы можем вычислить предельную вероятность выживания.

Из-за независимости между узлами Sex и isChild (их значения независимы, потому что мы не моделировали никакой зависимости, но их влияние на Survival не является независимым), совместная вероятность пассажира, имеющего определенные Sex и isChild, может быть рассчитана как P ( Секс, isChild) = P (Секс) ⋅P (isChild).

Следовательно, условная вероятность выживания при определенных Sex и isChild равна P (Выживание) = P (Выживание | Секс, isChild) ⋅P (Секс) ⋅P (isChild).

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

Эта структура данных позволяет нам выводить свойства совокупности. Байесовская сеть поддерживает прямой и обратный вывод. Например, мы можем рассчитать общий шанс выжить, интегрировав распределение дочернего узла (прямой вывод). И, зная о выживании пассажира, мы можем сделать вывод, насколько определенные характеристики способствовали его или ее выживанию. Например, если мы посмотрим на графики дочернего узла, мы увидим, что пол пассажира имел большое значение, если только пассажир не был ребенком. Согласно норме, касающейся женщин и детей в первую очередь, они не сильно отдавали предпочтение девочкам перед мальчиками. Эту взаимозависимость между Sex и isChild нельзя было включить в наивный байесовский классификатор.

Эту структуру данных, байесовский сетевой граф, можно создать двумя разными способами. При достаточном знании зависимостей он может быть спроектирован разработчиком априори. Как вариант, это можно узнать на самой машине.

На нашем пути к квантовому машинному обучению мы сделаем и то, и другое. Начнем с небольшой квантовой байесовской сети (QBN), которую мы моделируем сами. Затем мы позволяем машине учиться на данных.

Схема реализации

Мы начинаем с реализации нашего примера до сих пор, влияние Sex пассажира и ребенка (isChild) на Survival кораблекрушения "Титаник".

Каждый узел в байесовской сети представлен кубитом. Поскольку все наши узлы являются двоичными (Sex, isChild, Survival), каждому по одному кубиту достаточно. Если бы у нас было больше дискретных состояний или непрерывного распределения, нам понадобилось бы больше кубитов. Состояния кубита представляют собой предельную (для корневых узлов) и условную (для Survival узла) амплитуды вероятностей соответствующих переменных.

Состояние | 0⟩ представляет пассажира мужского пола или взрослого. Состояние | 1⟩ женщина или ребенок. Суперпозиция кубита обозначает вероятность любого состояния

Мы инициализируем эти два кубита вращением вокруг оси Y.

Мы вычисляем вероятности быть ребенком (строка 21) и быть женщиной (строка 25). Мы используем RY-вентили, чтобы кубиты q0 (строка 31) и q1 (строка 34) представляли эти маргинальные вероятности.

Затем мы добавляем в схему CPT Survial. Это еще немного работы.

Существует четыре различных комбинации значений родительского узла: Sex и isChild. Это взрослый мужчина (| 00⟩), ребенок мужского пола (| 01⟩), взрослая женщина (| 10⟩) и ребенок женского пола (| 11⟩). Следовательно, у нас есть четыре угла поворота, по одному для каждой комбинации родительских узлов.

Для каждой из этих комбинаций мы используем управляемый управляемый вентиль RYRY (CCRY), чтобы указать вероятность Survival. Если бы было n родительских узлов, мы бы реализовали CnRY-gate.

Как показано на следующем рисунке, мы инкапсулируем каждый поворот в X-вентили. Для CCRY-гейта вращение применяется только к управляемому кубиту, если оба управляющих кубита находятся в состоянии | 1⟩, ведущие X-ворота выбирают соответствующую комбинацию, а конечные X-ворота отменяют выбор.

Например, чтобы применить условную вероятность взрослого мужчины (состояние | 00⟩), нам нужно перевернуть оба кубита. Это то, что мы делаем. После применения CCRY-гейта под соответствующим углом мы переворачиваем кубиты обратно в исходное состояние.

В Qiskit нет CCRY-гейта. Но как его создать мы узнали в этом посте. Функция ccry (строки 1-6) добавляет такой вентиль в нашу схему.

В следующем коде мы вычисляем условную вероятность каждого из наших четырех случаев. Мы разделяем совокупность, например, детей женского пола (строка 3), разделяем выживших среди них (строка 4) и рассчитываем их вероятность выживания, разделив количество выживших на общее количество детей женского пола среди пассажиров (строка 5 ).

Мы делаем то же самое для взрослых женщин (строки 8–10), детей мужского пола (строки 13–16) и взрослых мужчин (строки 19–21).

Затем мы выбираем состояния, представляющие эти группы пассажиров, и применяем CCRY-gate с соответствующей вероятностью.

Теперь мы готовы запустить схему. Давайте посмотрим.

Мы видим восемь разных состояний. Они принадлежат жертвам (кубит q2 = 0) и выжившим (q2 = 1) четырех групп. Таким образом, общая предельная вероятность выживания - это сумма всех состояний, в которых кубит q2 = 1.

Чтобы не складывать их вручную, давайте включим измерение в нашу схему. Мы включаем ClassicalRegister в нашу схему.

Затем нам нужно применить все ворота (пропущены для краткости). Добавляем измерение (строка 3). Здесь нас интересует кубит q2q2.

Наконец, мы выбираем соответствующий бэкэнд (qasm_simulator) и запускаем схему несколько раз (здесь 1000 снимков) (строка 9).

Результат показывает, что фактическая вероятность выживания близка к 0,38. Фактический результат может немного отличаться, поскольку мы не вычисляем, а эмпирически моделируем этот результат.

Вывод

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

Этот пост является частью книги: Практическое квантовое машинное обучение с помощью Python.

Первые три главы получите бесплатно здесь.