Variational Quantum Eigensolver
Вариационные квантовые алгоритмы — менее изученный раздел квантовых алгоритмов, с меньшими теоретическими гарантиями, но с бóльшими практическими применениями (в основном, для задач квантовой химии). Поскольку на данный момент квантовые компьютеры только-только начинают переходить в режим, где ошибки уже не так велики (т.е. выходят из стадии NISQ — Noisy Intermediate Scale Quantum), алгоритмы этого класса весьма важны для практики.
Общая идея этих алгоритмов заключается в том, что часть задачи представляется в виде квантового вычисления \(f(\theta)\), параметризованного каким-то набором параметров \(\theta = (\theta_1, \theta_2, \dots, \theta_d)\). Обычно вариационные алгоритмы решают задачи оптимизации, поэтому целью алгоритма является нахождение набора оптимальных параметров \(\tilde{\theta}\). Для этого используется классический алгоритм, например, градиентный спуск. Для вычисления градиента можно воспользоваться parameter shift rule.
Вариационный алгоритм поиска собственных значений
Рассмотрим подробнее один из вариационных алгоритмов, используемый для поиска собственных значений. Эта задача часто возникает в квантовой химии, где собственные значения гамильтониана какого-либо вещества задают энергию, которую имеет это вещество в различных состояниях (в частности, минимальное собственное число соответствует энергии наиболее устойчивого состояния). Соответственно, меняя параметры гамильтониана, такие как положение ядер атомов, можно промоделировать эволюцию вещества: взаимодействие молекул, их соединение и распад, изменение геометрии и т.п. Разумеется, такое моделирование играет огромную роль в дизайне новых лекарств, материалов и других замечательных областях; тем не менее, мы сосредоточимся на математической стороне дела.
В типичной постановке задачи химикам (или физикам) известен гамильтониан \(H\), который описывает систему в целом, и нужно найти его минимальное собственное значение. Напомним, что эволюция системы (изменение состояния \(\ket{\Psi(t)}\) в зависимости от времени \(t\)) и гамильтониан связаны уравнением Шрёдингера: \[ H \ket{\Psi(t)} = i\hbar \frac{\mathrm{d}}{\mathrm{d}t} \ket{\Psi(t)}. \] Если гамильтониан не зависит от времени, то решение этого дифференциального уравнения будет выглядеть как: \[ \ket{\Psi(t)} = e^{-iHt/\hbar}\ket{\Psi(0)}. \]
Как правило, гамильтониан задаётся в виде суммы т.н. строк Паули — тензорных произведений операторов \(X,Y,Z,I\), действующих на кубиты системы — с различными коэффициентами: \[ H = \sum_i \alpha_i P_i, \] где \(P_i = \sigma_{i1} \otimes \sigma_{i2} \otimes \dots \otimes \sigma_{in}\) и каждый из операторов \(\sigma_{ij}\) — это какой-либо оператор из набора \(X,Y,Z,I\).
Тогда оказывается, что минимальное собственное число оператора \(H\) по определению равно \[ f(\Psi) = \min_{\ket{\Psi}} \langle \Psi | H | \Psi \rangle. \] К сожалению, поиск минимума по всему пространству, в котором обитает \(\ket{\Psi}\) сложен, поэтому мы заменяем его поиском по (достаточно плотному) подмножеству — анзатцу, который задаётся параметризованной квантовой схемой \(U(\theta)\). Вместо всех возможных состояний \(\ket{\Psi}\) мы ищем минимум только среди состояний вида \(\ket{\psi(\theta)} = U(\theta) \ket{\phi}\). Вычисление собственных значений \(f(\theta) = \langle \psi(\theta) | H | \psi(\theta) \rangle = \langle \phi | U(\theta)^\dagger H U(\theta) | \phi \rangle \) производится на квантовом компьютере, а обновление параметров \(\theta\) — классическим градиентным спуском.
Для вычисления градиента можно воспользоваться следующим трюком, называющимся parameter shift rule. Нам нужно вычислить градиент \(\nabla f(\theta) = \big( \frac{\partial f(\theta)}{\partial \theta_1}, \frac{\partial f(\theta)}{\partial \theta_2}, \dots, \frac{\partial f(\theta)}{\partial \theta_d} \big)^T\). Функцию можно разбить на отдельные слагаемые Паули, а их — на отдельные повороты. Тогда получим: \[ U(\theta) = e^{-i\theta P/2}, \] где \(P = X\), \(Y\) или \(Z\). Тогда \[ \frac{\partial U(\theta)}{\partial \theta} = -\frac{i}{2}P e^{-i\theta P/2} = -\frac{i}{2} PU = -\frac{i}{2} UP. \] Для \(f(\theta) = \langle \phi | U(\theta)^\dagger A U(\theta) | \phi \rangle\) получаем:
\begin{align*} \frac{\partial f(\theta)}{\partial \theta} &= \frac{\partial}{\partial \theta} \langle \phi | U(\theta)^\dagger A U(\theta) | \phi \rangle =\\ &= \langle \phi | \Big(-\frac{i}{2} P \Big) U^\dagger A U | \phi \rangle + \langle \phi | U^\dagger A \Big(-\frac{i}{2} P \Big) U | \phi \rangle =\\ &= \frac{1}{2} \langle \phi | U(\theta + \frac{\pi}{2})^\dagger A U(\theta + \frac{\pi}{2}) | \phi \rangle + \frac{1}{2} \langle \phi | U(\theta - \frac{\pi}{2})^\dagger A U(\theta - \frac{\pi}{2}) | \phi \rangle =\\ &= \frac{1}{2} \Big( f(\theta + \frac{\pi}{2}) - f(\theta - \frac{\pi}{2}) \Big). \end{align*}Получается, что мы можем воспользоваться той же квантовой схемой и для вычисления функции \(f\), и для вычисления её производной (и градиента) \(\partial f / \partial \theta_j\).