Обзор

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

  1. Tensorflow и Cirq как квант тензорного потока
  2. Пайторч и Qiskit

В этой статье мы поговорим об интеграции Qiskit в пользовательские слои Keras.

Вступление

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

С точки зрения реализации это означает поиск способа интеграции квантовой обработки в обычные глубокие нейронные сети. Для этого существует несколько способов. Здесь мы обсуждаем интеграцию Qiskit как подклассов слоев Keras. Давайте начнем.

Определение квантового слоя

Очевидно, это зависит от конкретного приложения. Следует иметь в виду, что входные и выходные данные этого слоя должны быть последовательными. Если eager_execution по умолчанию в Tensorflow 2.x, вполне естественно вернуться к numpy массивам в качестве входных и выходных данных по умолчанию для всех квантовых слоев.

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

Взаимодействие с квантовым слоем

Теперь нам нужно создать Keras слой, который объединяет квантовый слой, который мы определили ранее. Для этого нам нужно расширить класс tensorflow.keras.Layer, который позволяет писать собственные слои для моделей Keras.

Уровень получает входные данные в соответствии с batch_size обучения. Поэтому нам нужно убедиться, что каждый обучающий пример проходит через квантовый слой для создания выходных данных, следовательно, и потребность в цикле.

tf.executing_eagerly() важен, поскольку он позволит нам преобразовать ввод по умолчанию Tensor в массив numpy через inputs.numpy(). Если приложение зависит от Tensorflow 1.x, может быть вызван tf.enable_eager_execution() для включения активного выполнения. Стремительное выполнение интуитивно позволяет нам получать доступ к значениям тензора по мере их появления. Если он отключен, нам нужно внести сложность сессий тензорного потока и графиков выполнения.

Построение модели

Построить модель несложно. Мы можем построить функциональную модель или последовательную модель для нашего использования.

Составление модели с run_eagerly очень важно. Я заметил, что некоторые сохраненные модели не работают должным образом после их загрузки, если они не скомпилированы с run_eagerly, установленным на True.

Сохранение и загрузка модели

Сохранение происходит в обычном режиме. Однако при загрузке предлагается определить настраиваемый класс для созданного нами настраиваемого слоя.

custom_objects позволяет вам определять собственные объекты. Требуется словарь, в котором keys соответствует имеющимся у вас пользовательским слоям, а их values соответствует пользовательским классам, с которыми вы хотите связать пользовательские слои. Здесь есть тонкое предостережение: можно изменить реализации этих уровней между разными тренировками какой-либо модели. Если у вас есть модель, обученная на квантовом слое, приведенном ранее в этом посте, можно загрузить такую ​​модель и переобучить ее на какой-либо другой квантовой логике.

Заключение

Этот пост представляет собой базовую основу для создания работающей архитектуры глубокого обучения с квантовой поддержкой с использованием Qiskit и Tensorflow. Следует отметить некоторые моменты:

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

Надеюсь, это поможет вам начать работу с уровнями Qiskit в сетях Tensorflow. Хорошего дня :)