El Variational Quantum Eigensolver (VQE)
Esta lección presenta el Variational Quantum Eigensolver, explica su importancia como algoritmo fundamental en la computación cuántica y examina sus fortalezas y debilidades. VQE por sí solo, sin métodos complementarios, probablemente no será suficiente para los cálculos cuánticos modernos a escala de utilidad. Sin embargo, es importante como método híbrido clásico-cuántico arquetípico y constituye un fundamento esencial sobre el cual se construyen muchos algoritmos más avanzados.
Este video ofrece una descripción general de VQE y los factores que afectan su eficiencia. El texto siguiente complementa esto con más detalles e implementa VQE con Qiskit.
1. ¿Qué es VQE?
El Variational Quantum Eigensolver es un algoritmo que utiliza conjuntamente la computación clásica y cuántica para resolver una tarea. Un cálculo VQE consta de cuatro componentes principales:
- Un operador: A menudo un hamiltoniano, al que llamamos , que describe una propiedad del sistema que se desea optimizar. En otras palabras, se busca el vector propio de este operador que corresponde al valor propio mínimo. A este vector propio lo llamamos frecuentemente el "estado fundamental".
- Un "ansatz" (una palabra alemana): Un circuito cuántico que prepara un estado cuántico que se aproxima al vector propio buscado. Estrictamente hablando, un ansatz es una familia de circuitos cuánticos, porque algunas de las puertas del ansatz están parametrizadas, es decir, se les pasa un parámetro que podemos variar. Esta familia de circuitos puede generar una familia de estados cuánticos que aproximan el estado fundamental.
- Un Estimator: Un medio para estimar el valor esperado del operador sobre el estado cuántico variacional actual. A veces, este valor esperado, la llamada función de costo, es nuestro objetivo principal. A veces nos interesa una función más compleja que, sin embargo, se compone de uno o más valores esperados.
- Un optimizador clásico: Un algoritmo que varía parámetros para minimizar la función de costo.
Examinemos cada uno de estos componentes con más detalle.
1.1 El operador (hamiltoniano)
En el centro de un problema VQE se encuentra un operador que describe un sistema de interés. Aquí asumimos que el valor propio más pequeño y el vector propio asociado de este operador son útiles para un propósito científico o práctico. Ejemplos de esto incluyen un hamiltoniano químico que describe una molécula, donde el valor propio más pequeño corresponde a la energía del estado fundamental de la molécula y el estado propio asociado describe la geometría o configuración electrónica de la molécula. O bien, el operador describe el costo de un proceso a optimizar, y los estados propios corresponden a rutas o estrategias. En algunos campos como la física, un "hamiltoniano" casi siempre se refiere a un operador que describe la energía de un sistema físico. Sin embargo, en la computación cuántica es común referirse a operadores de mecánica cuántica que describen un problema empresarial o logístico también como "hamiltoniano". Adoptamos esta convención aquí.
Mapear un problema físico o de optimización a qubits no es típicamente una tarea trivial, pero estos detalles no son el foco de este curso. Una discusión general sobre el mapeo de un problema a un operador cuántico se encuentra en Quantum computing in practice. Una mirada más detallada al mapeo de problemas químicos a operadores cuánticos se ofrece en Quantum Chemistry with VQE.
Para los fines de este curso, asumimos que la forma del hamiltoniano es conocida. Un hamiltoniano para una molécula simple de hidrógeno (bajo ciertas suposiciones de espacio activo y con el mapeador de Jordan-Wigner) es, por ejemplo:
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime scipy
from qiskit.quantum_info import SparsePauliOp
hamiltonian = SparsePauliOp(
[
"IIII",
"IIIZ",
"IZII",
"IIZI",
"ZIII",
"IZIZ",
"IIZZ",
"ZIIZ",
"IZZI",
"ZZII",
"ZIZI",
"YYYY",
"XXYY",
"YYXX",
"XXXX",
],
coeffs=[
-0.09820182 + 0.0j,
-0.1740751 + 0.0j,
-0.1740751 + 0.0j,
0.2242933 + 0.0j,
0.2242933 + 0.0j,
0.16891402 + 0.0j,
0.1210099 + 0.0j,
0.16631441 + 0.0j,
0.16631441 + 0.0j,
0.1210099 + 0.0j,
0.17504456 + 0.0j,
0.04530451 + 0.0j,
0.04530451 + 0.0j,
0.04530451 + 0.0j,
0.04530451 + 0.0j,
],
)
Nótese que el hamiltoniano anterior contiene términos como ZZII e YYYY que no conmutan entre sí. Para evaluar ZZII, entre otras cosas, habría que medir el operador Pauli-Z en el qubit 3. Sin embargo, para evaluar YYYY, hay que medir el operador Pauli-Y en el mismo qubit 3. Entre el operador Y y el Z en el mismo qubit existe una relación de incertidumbre; ambos operadores no pueden medirse simultáneamente. Volveremos sobre este punto más adelante y a lo largo del curso.
El hamiltoniano anterior es un operador matricial de . Diagonalizar el operador para determinar su valor propio de energía más pequeño no es difícil.
import numpy as np
A = np.array(hamiltonian)
eigenvalues, eigenvectors = np.linalg.eigh(A)
print("The ground state energy is ", min(eigenvalues), "hartrees")
The ground state energy is -1.1459778447627311 hartrees
Los solucionadores de valores propios clásicos por fuerza bruta no pueden escalar para describir las energías o geometrías de sistemas atómicos muy grandes como fármacos o proteínas. VQE es uno de los primeros intentos de hacer que la computación cuántica sea útil para este problema.
En esta lección nos encontraremos con hamiltonianos significativamente más grandes que el anterior. Sin embargo, sería prematuro explorar los límites de VQE antes de que más adelante en este curso presentemos algunas de las herramientas más avanzadas que pueden complementar o reemplazar a VQE.
1.2 Ansatz
La palabra "ansatz" es alemana. El plural correcto en alemán es "Ansätze", aunque también se encuentran frecuentemente "ansatzes" o "ansatze". En el contexto de VQE, un ansatz es el circuito cuántico con el que se genera una función de onda de múltiples qubits que se aproxima lo mejor posible al estado fundamental del sistema estudiado y, por lo tanto, proporciona el valor esperado más pequeño del operador. Este circuito contiene parámetros variacionales (a menudo agrupados en el vector de parámetros ).
Se elige un conjunto inicial de valores de los parámetros variacionales. A la operación unitaria del ansatz en el circuito la llamamos . Por defecto, todos los qubits en las computadoras cuánticas de IBM® se inicializan en el estado . Cuando se ejecuta el circuito, el estado de los qubits es:
Si solo necesitáramos la energía más baja (en el lenguaje de los sistemas físicos), podríamos estimarla midiendo la energía muchas veces y tomando el valor más pequeño. Sin embargo, típicamente también queremos conocer la configuración que produce esta energía más baja o este valor propio mínimo. El siguiente paso es, por lo tanto, la estimación del valor esperado del hamiltoniano mediante mediciones cuánticas. Esto implica bastante. Cualitativamente, este proceso se puede entender considerando que la probabilidad de medir una energía (de nuevo en el lenguaje de los sistemas físicos) está relacionada con el valor esperado mediante la siguiente relación:
La probabilidad está además relacionada con el solapamiento entre el estado propio y el estado actual del sistema :
Mediante muchas mediciones de los operadores de Pauli que componen nuestro hamiltoniano, podemos estimar el valor esperado del hamiltoniano en el estado actual del sistema . El siguiente paso consiste en variar los parámetros y aproximarse aún más al estado fundamental del sistema con la energía más baja. Debido a los parámetros variacionales en el ansatz, a veces también se le denomina forma variacional.
Antes de abordar este proceso variacional, a menudo es útil partir de un "buen estado inicial". Si se conoce lo suficiente sobre el sistema, se puede hacer una mejor estimación inicial que . Por ejemplo, en aplicaciones químicas es común inicializar los qubits en el estado de Hartree-Fock. Este estado inicial sin parámetros variacionales se denomina estado de referencia. Al circuito para generar el estado de referencia lo llamamos . Siempre que sea importante distinguir el estado de referencia del resto del ansatz, utilice: De manera equivalente:
1.3 Estimator
Necesitamos una forma de estimar el valor esperado de nuestro hamiltoniano en un estado variacional determinado . Si pudiéramos medir directamente el operador completo , sería tan sencillo como realizar muchas (digamos ) mediciones y promediar los valores medidos:
El símbolo nos recuerda que este valor esperado solo sería exacto en el límite . Sin embargo, con miles de mediciones en un circuito, el error de muestreo del valor esperado es bastante pequeño. Para cálculos muy precisos, otros factores como el ruido juegan un papel importante.
No obstante, en general no es posible medir de una sola vez. puede contener múltiples operadores de Pauli X, Y y Z que no conmutan entre sí. Por lo tanto, el hamiltoniano debe dividirse en grupos de operadores que puedan medirse simultáneamente, y cada grupo debe estimarse por separado; luego se combinan los resultados para obtener un valor esperado. Abordaremos esto con más detalle en la siguiente lección, cuando discutamos la escalabilidad de los enfoques clásicos y cuánticos. Esta complejidad en la medición es una razón por la que necesitamos código altamente eficiente para este tipo de estimación. En esta lección y las siguientes, utilizamos para ello la primitiva Estimator del entorno de ejecución de Qiskit.
1.4 Optimizadores clásicos
Un optimizador clásico es un algoritmo clásico diseñado para encontrar valores extremos de una función objetivo (típicamente un mínimo). Busca en el espacio de parámetros posibles un conjunto que minimice una función de interés. En términos generales, estos algoritmos pueden clasificarse en métodos basados en gradientes, que utilizan información del gradiente, y métodos libres de gradientes, que funcionan como optimizadores de caja negra. La elección del optimizador clásico puede afectar significativamente el rendimiento de un algoritmo, especialmente en presencia de ruido en el hardware cuántico. Entre los optimizadores comunes en este ámbito se encuentran Adam, AMSGrad y SPSA, que han mostrado resultados prometedores en entornos ruidosos. Entre los optimizadores más tradicionales se encuentran COBYLA y SLSQP.
Un flujo de trabajo típico (como se muestra en la Sección 3.3) consiste en utilizar uno de estos algoritmos como método dentro de un minimizador como la función minimize de SciPy. Esta acepta como argumentos:
- Una función a minimizar. A menudo es el valor esperado de la energía. En general, estas se denominan "funciones de costo".
- Un conjunto de parámetros iniciales para la búsqueda. Frecuentemente denominados o .
- Argumentos, incluyendo los argumentos de la función de costo. En computación cuántica con Qiskit, estos incluyen el ansatz, el hamiltoniano y la primitiva Estimator, que se describe con más detalle en la siguiente subsección.
- Un método de minimización (
method). Este es el algoritmo específico que busca en el espacio de parámetros. Aquí se especificaría, por ejemplo, COBYLA o SLSQP. - Opciones (
options). Las opciones disponibles pueden variar según el método. Un ejemplo que prácticamente todos los métodos incluyen es el número máximo de iteraciones del optimizador antes de detenerse:maxiter.
En cada paso iterativo, el valor esperado del hamiltoniano se estima mediante muchas mediciones. Este valor de energía estimado es devuelto por la función de costo, y el minimizador actualiza su información sobre el paisaje energético. La forma exacta en que el optimizador elige el siguiente paso depende del método. Algunos utilizan gradientes y eligen la dirección de descenso más pronunciado. Otros tienen en cuenta el ruido y requieren que el costo disminuya por un margen considerable antes de aceptar que la energía verdadera disminuye en esa dirección.
# Example syntax for minimization
# from scipy.optimize import minimize
# res = minimize(cost_func, x0, args=(ansatz, hamiltonian, estimator), method="cobyla", options={'maxiter': 200})
1.5 El principio variacional
El principio variacional es de importancia central en este contexto: establece que ninguna función de onda variacional puede producir un valor esperado de energía (o costo) menor que el de la función de onda del estado fundamental. Expresado matemáticamente:
Esto se puede demostrar fácilmente si se observa que el conjunto de todos los estados propios