Узнайте, как реализовать регрессию данных Клиффорда

Хотите начать работу с квантовым машинным обучением? Взгляните на Практическое обучение квантовому машинному обучению с помощью Python.

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

Лучшее, что мы можем сделать сегодня, — это уменьшить влияние шума на вычисления. Это то, что касается уменьшения квантовых ошибок.

Недавно IBM объявила о своей второй премии в области квантовой науки. Они ищут решение проблемы квантового моделирования. Они хотят, чтобы мы использовали Trotterization для моделирования гамильтониана модели Гейзенберга с тремя частицами. Тем не менее, основная проблема заключается в том, чтобы справиться с неизбежным шумом, потому что они хотят, чтобы мы решили проблему на их 7-кубитной системе Jakarta.

Но прежде чем мы сможем решить эту проблему на реальном квантовом компьютере, давайте сначала посмотрим, как мы вообще можем реализовать метод уменьшения квантовых ошибок с помощью Qiskit. В моем предыдущем посте я представил метод регрессии данных Клиффорда (CDR), разработанный P. Чарник и др., Снижение ошибок с помощью данных квантовой схемы Клиффорда, Quantum 5, 592 (2021). В этом недавнем многообещающем методе уменьшения ошибок мы создаем модель машинного обучения, которую мы можем использовать для прогнозирования и уменьшения шума, используя данные из квантовых схем, которые мы можем моделировать классически.

Мы используем Qiskit, библиотеку квантовой разработки IBM, и Mitiq, набор инструментов Python для реализации методов устранения ошибок на квантовых компьютерах.

Mitiq предоставляет API для метода CDR и хорошо интегрируется с Qiskit. Итак, это должно быть легко, чтобы заставить это работать, не так ли?

Давайте сначала посмотрим на Введение Mitiq в CDR. На первый взгляд, они четко описывают то, что нам нужно сделать. Это четырехступенчатая процедура:

  1. Определить квантовую схему
  2. Определить исполнителя
  3. Наблюдаемый
  4. (Недалеко от Клиффорда) Симулятор

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

Итак, нам нужно адаптировать код к Qiskit API.

Определить квантовую схему

Квантовая схема, которую нам нужно определить, представляет проблему, которую мы стремимся решить, например гамильтоновское моделирование, о котором нас просит IBM. Тем не менее, мы придерживаемся примера, который предоставляет Mitiq. Это двухкубитная схема, состоящая только из вентилей Клиффорда и поворотов вокруг оси Z (𝑅𝑍). Ворота Клиффорда легко моделируются на классическом компьютере, что является предварительным условием для метода CDR.

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

Ничего особенного здесь не происходит. Внутри цикла for мы применяем произвольные квантовые вентили к нашим кубитам. В основном это повороты (rz, rx и запутывания cx). Для применения метода CDR детали этой схемы не имеют особого значения. Как уже упоминалось, давайте предположим, что они представляют проблему под рукой.

Как и в примере Mitiq, мы применяем серию вентилей несколько раз, чтобы увеличить длину всей схемы. На самом деле, если мы планируем решить гамильтоновскую симуляцию с использованием Trotterization, эта структура оказывается удобной, потому что Trotterization строится на таком повторении серии квантовых вентилей.

Наконец, важным отличием от примера является измерение, которое мы включаем в нашу схему. В Qiskit нам нужно явно указать, когда мы «смотрим» на наши кубиты.

Определить исполнителя

На следующем шаге нам нужно определить исполнителя. Это функция, которая принимает нашу квантовую схему в качестве входных данных и возвращает Mitiq QuantumResult. Звучит легко. Тем не менее, дьявол кроется в деталях.

Когда мы смотрим на пример кода, мы видим, что он использует функцию Mitiq calculate_density_matrix, которую они импортируют из mitiq.interface.mitiq_cirq. Судя по всему, он возвращает матрицу плотности. Это матрица, описывающая квантовое состояние.

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

Вместо этого Mitiq теперь предоставляет четыре функции, связанные с Cirq: execute, execute_with_depolarizing_noise, execute_with_shots и execute_with_shots_and_depolarizing_noise.

То же самое относится и к их интерфейсу Qiskit. Здесь есть execute, execute_with_noise, execute_with_shots и execute_with_shots_and_noise.

Вопрос в том, какой из них мы должны использовать?

В примере с Mitiq говорят, что добавили однокубитный деполяризующий шум. Итак, мы непременно хотим создать экзекьютор с шумом. Но нужны ли нам несколько снимков?

Ответ: да, делаем! В исходном примере они возвращают окончательную матрицу плотности — представление квантового состояния. Если мы запустим схему только один раз (без выстрелов), мы не сможем создать такую ​​матрицу.

Итак, это функция, которую мы собираемся использовать:

mitiq.interface.mitiq_qiskit.qiskit_utils.execute_with_shots_and_noise(circuit, obs, noise_model, shots, seed=None)
Simulates the evolution of the noisy circuit and returns the statistical estimate of the expectation value of the observable.
Parameters
   circuit (QuantumCircuit) – The input Qiskit circuit.
   obs (ndarray) – The observable to measure as a NumPy array
   noise – The input Qiskit noise model
   shots (int) – The number of measurements.
   seed (Optional[int]) – Optional seed for qiskit simulator.
   noise_model (NoiseModel) –
Return type float
Returns The expectation value of obs as a float.

Вы ничего не замечаете? Верно, функция возвращает число с плавающей запятой, а не матрицу плотности. Кроме того, для функции требуется параметр obs. Это наблюдаемое как массив NumPy. Мы создадим наблюдаемую на следующем шаге. Итак, отложим определение исполнителя на секунду.

Наблюдаемый

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

Кубит — это двумерная система, как показано на следующем изображении. Полюса визуализации изображают базисные состояния |0⟩ и |1⟩. Стрелка — вектор квантового состояния. Близости к полюсам (базисным состояниям) обозначают амплитуды, квадраты которых представляют собой вероятности измерения кубита как 0 или 1. Проще говоря, чем ближе вектор квантового состояния к базисному состоянию |1⟩, тем выше вероятность измерение кубита как 1.

Все идет нормально. Тем не менее, амплитуды квантового состояния являются комплексными числами. Комплексное число — это двумерное число с действительной и мнимой частями, как показано на следующем рисунке.

Это эффективно превращает кубит в трехмерную конструкцию, которую мы обычно представляем как сферу Блоха. Тем не менее, близость к полюсам определяет вероятность измерения.

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

Практически это наблюдаемая величина, которую мы определяем вращением всей сферы. Точки, которые заканчиваются на полюсах вращающейся сферы, становятся измерениями, которые мы получаем, глядя на кубит.

Mitiq предоставляет API для указания наблюдаемого. Он принимает список PauliStrings. Они обозначают вращения сферы Блоха. В примере с Mitiq у нас есть два кубита. Первый PauliString применяет Z-гейты к обоим кубитам (переворачивание вокруг оси Z). Второй PauliString применяет вращение вокруг оси X к первому кубиту на -1,75 (это чуть больше половины окружности, равной 𝜋 (около 3,14).

Когда мы смотрим на наблюдаемую, мы видим, что она выводит составное вращение.

Z(0)*Z(1) + (-1.75+0j)*X(0)

Итак, имея наблюдаемое в нашем распоряжении, вернемся к исполнителю.

Определить исполнителя — еще раз

Для функции execute_with_noise_and_shots требуется наблюдаемое в виде массива NumPy. Мы получаем это представление, вызывая функцию matrix наблюдаемого объекта.

Далее нам нужно указать Noise_Model. Noise_model сообщает симулятору, какой шум добавить к моделированию.

Qiskit предоставляет пакет шума для создания собственной модели шума. Мы используем его для добавления ошибок на однокубитных и двухкубитных вентилях с определенной вероятностью. Это означает, что всякий раз, когда мы применяем вентиль определенного типа, мы получим разрушенное состояние кубита с указанной вероятностью.

Наконец, нам нужно указать количество выстрелов, которые мы хотим запустить в цепи. Все, что превышает 1000 выстрелов, должно работать нормально.

(Недалеко от Клиффорда) Симулятор

Последний компонент — бесшумный симулятор. Он почти аналогичен исполнителю. Разница лишь в том, что он не должен иметь никакого шума. Мы можем просто использовать функцию execute_with_shots.

Запустить CDR

Мы готовы запустить CDR. Мы можем использовать остальную часть кода примера как есть. Нам нужно только подключить функции, которые мы создали.

Сначала мы вычисляем бесшумный результат.

ideal_measurement =  0.6259272372946627

Затем мы вычисляем результат с полным шумом.

unmitigated_measurement =  0.48027121352169094

Затем мы вычисляем смягченный результат из CDR.

mitigated_measurement =  0.6076182171631638

Наконец, мы сравниваем результаты.

Error (unmitigated): 0.14565602377297177
Error (mitigated with CDR): 0.018309020131498932
Relative error (unmitigated): 0.23270440251572316
Relative error (mitigated with CDR): 0.029251035968066913
Error reduction with CDR: 87.4%.

Заключение

Взгляд на результаты показывает, что CDR устраняет почти 90% ошибок, возникающих из-за шума.

Mitiq помог нам использовать CDR практически из коробки. Нам вообще не пришлось заморачиваться с ее реализацией. Однако подготовка кода для работы с API немного сложна, потому что пример кажется устаревшим.

Хотите начать работу с квантовым машинным обучением? Взгляните на Практическое обучение квантовому машинному обучению с помощью Python.

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