Diagonalisation quantique par échantillonnage (SQD)
La diagonalisation quantique par échantillonnage (SQD, de l'anglais Sample-based Quantum Diagonalization) combine l'algèbre linéaire classique et la puissance de l'informatique quantique pour diagonaliser un hamiltonien (matrice) et calculer ses valeurs propres et vecteurs propres. La diagonalisation de matrices est une opération mathématique importante, car de nombreux problèmes en science, en calcul et en optimisation y font appel.
La vidéo ci-dessous donne une vue d'ensemble de SQD, de ce qui détermine son utilité et de ce qui le rend plus rapide que de nombreuses autres approches. Le texte qui suit entre dans les détails.
1. Introduction et motivation
Prenons comme exemple l'équation aux valeurs propres d'énergie rendue célèbre par Schrödinger.
est l'hamiltonien d'un système, est la fonction d'onde (également appelée état propre) et est une valeur propre. Les valeurs propres de la matrice représentent les niveaux d'énergie du système. Par exemple, si le système est une molécule, la valeur propre la plus basse représente l'énergie de l'état fondamental de la molécule. Dans de nombreux problèmes, on s'intéresse à l'estimation de l'énergie de l'état fondamental.
En appliquant des techniques de diagonalisation exacte issues de l'algèbre linéaire, on peut diagonaliser la matrice complète. Cependant, cette approche devient coûteuse en calcul (voire impossible) à mesure que la matrice grandit. Par exemple, même pour de petites molécules chimiques, peut être d'une taille prohibitive (par exemple, le hamiltonien de la molécule avec une base cc-PVDZ a une dimension de
Heureusement, on n'a pas toujours besoin de toutes les valeurs propres et de tous les vecteurs propres d'un hamiltonien , et donc, la diagonalisation de la matrice complète n'est pas nécessaire dans de nombreux cas pratiques. Par exemple, pour l'estimation de l'état fondamental, on s'intéresse à la valeur propre la plus basse et au vecteur propre correspondant. Cela nous permet d'appliquer le concept de projection sur un sous-espace (utile).
Considère une matrice , , où l'espace vectoriel complet (espace de Hilbert) a une dimension ( est grand). Ensuite, on sélectionne un sous-espace () — qui est un sous-ensemble de l'espace de Hilbert complet — de dimension , où est suffisamment petit. Après avoir projeté sur ce sous-espace, la matrice projetée (appelons-la ) sera plus petite (). Le plus petit peut être diagonalisé à l'aide d'une méthode numérique classique appropriée, et générer des valeurs propres et des vecteurs propres pour ce sous-espace.
Remarque : le sous-espace doit être dans le support de notre état cible (par exemple, l'état fondamental). En d'autres termes, le hamiltonien projeté doit être dans un sous-espace qui inclut la valeur propre la plus basse.
2. Projection et diagonalisation
Supposons qu'on veuille trouver la valeur propre la plus basse et le vecteur propre correspondant pour le hamiltonien suivant .
On va diagonaliser la matrice complète ainsi que différentes versions projetées () pour différents sous-espaces afin de démontrer la scalabilité et l'importance du choix du sous-espace.
L'énergie de l'état fondamental (valeur propre minimale) de la matrice est et la fonction d'onde exacte de l'état fondamental (vecteur propre) est :
c'est-à-dire que l'état fondamental de la matrice est engendré par deux états de base computationnels (vecteurs) et .
# Added by doQumentation — required packages for this notebook
!pip install -q numpy scipy
import numpy as np
from scipy.linalg import eigh
np.set_printoptions(precision=4, sign="-", suppress=True, linewidth=100)
H = np.array(
[
[0.2235, -0.039, -0.1035, -0.0818, 0.1746, 0.1091, 0.1165, -0.0104],
[-0.0390, 0.6621, 0.0706, -0.1964, -0.0782, 0.2619, 0.1095, 0.0029],
[-0.1035, 0.0706, 0.9961, 0.1724, 0.1067, -0.2299, -0.1817, 0.1571],
[-0.0818, -0.1964, 0.1724, -0.1773, 0.1019, -0.4778, -0.1272, -0.0414],
[0.1746, -0.0782, 0.1067, 0.1019, 0.1418, -0.1359, -0.1793, -0.0766],
[0.1091, 0.2619, -0.2299, -0.4778, -0.1359, 0.1014, 0.1696, 0.0552],
[0.1165, 0.1095, -0.1817, -0.1272, -0.1793, 0.1696, 0.4227, 0.2702],
[-0.0104, 0.0029, 0.1571, -0.0414, -0.0766, 0.0552, 0.2702, 0.4456],
]
)
eigvals, eigvecs = eigh(H)
print("Eigenvalues:")
print(eigvals)
print(f"Minimum eigenvalue: {eigvals.min()}")
print("\nEigenvectors (columns represent vectors):")
print(eigvecs)
print("\nEigenvector for the minimum eigenvalue (ground state)")
print(eigvecs[:, np.argmin(eigvals)])
Eigenvalues:
[-0.5357 -0.1321 0.1049 0.1258 0.3616 0.6405 0.947 1.3039]
Minimum eigenvalue: -0.5356560029438817
Eigenvectors (columns represent vectors):
[[-0. -0.5612 0.098 -0.0024 0.8051 -0.0806 0.0643 0.1288]
[-0. -0.1403 -0.1985 -0.4249 -0.0092 0.585 -0.5952 0.2526]
[ 0. 0.0416 0.3041 0.2122 0.1509 -0.0139 -0.5794 -0.7086]
[ 0.8 -0.1936 -0.0127 -0.4376 -0.1081 -0.0838 0.1557 -0.2966]
[ 0. 0.6716 -0.3535 -0.2552 0.5395 0.0954 0.1449 -0.1941]
[ 0.6 0.258 0.017 0.5834 0.1441 0.1118 -0.2076 0.3954]
[ 0. 0.3088 0.5504 -0.4197 0.0626 -0.468 -0.2625 0.3657]
[-0. -0.1146 -0.6559 0.0356 -0.0394 -0.6352 -0.3856 0.0418]]
Eigenvector for the minimum eigenvalue (ground state)
[-0. -0. 0. 0.8 0. 0.6 0. -0. ]
Ensuite, on va projeter la matrice sur différents sous-espaces et vérifier si on peut obtenir l'état fondamental exact. En particulier, on va projeter la matrice sur un sous-espace engendré par :
- les vecteurs de l'état fondamental exact ( et ).
- des vecteurs qui excluent certains ou tous les vecteurs de l'état fondamental exact (par exemple, , et ).
- des vecteurs qui incluent à la fois l'état fondamental exact et des états hors de l'état fondamental (mais pas tous les vecteurs possibles dans l'espace de Hilbert).
2.1 Cas 1 : le sous-espace inclut l'état fondamental
Supposons qu'on veuille projeter dans un sous-espace () engendré par deux vecteurs et . Le hamiltonien projeté est défini par :
x1 = np.zeros(8)
x1[3] = 1 # binary 011 is 3 in decimal. |011> = |3> = [0,0,0,1,0,0,0,0]
x2 = np.zeros(8)
x2[5] = 1 # binary 101 is 5 in decimal
Hs = np.array([[x1 @ H @ x1.T, x1 @ H @ x2.T], [x2 @ H @ x1.T, x2 @ H @ x2.T]])
print(Hs)
[[-0.1773 -0.4778]
[-0.4778 0.1014]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.535656000064295
Eigenvector for minimum eigenvalue: [-0.8 -0.6]
On peut faire plusieurs observations clés ici.
- Comme on a engendré le sous-espace avec deux vecteurs, la dimension de la matrice projetée () est , ce qui est plus petit que la matrice complète ().
- La valeur propre minimale de la matrice projetée correspond à la valeur propre de l'état fondamental exact.
- Les valeurs dans la variable
eigvecsdésignent l'amplitude des vecteurs générateurs du sous-espace, et à l'aide de celles-ci on peut reconstruire l'état propre (état fondamental). Dans ce cas, on obtient l'état fondamental exact (à une phase globale près) :
2.2 Cas 2 : le sous-espace exclut certains ou tous les vecteurs de l'état fondamental
Ensuite, on projette sur un sous-espace engendré par trois vecteurs , et . On choisit délibérément les vecteurs de manière à exclure un vecteur de l'état fondamental (). Le hamiltonien projeté est défini par :
x1 = np.zeros(8)
x1[0] = 1
x2 = np.zeros(8)
x2[3] = 1
x3 = np.zeros(8)
x3[6] = 1
Hs = np.array(
[
[x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
print(Hs)
[[ 0.2235 -0.0818 0.1165]
[-0.0818 -0.1773 -0.1272]
[ 0.1165 -0.1272 0.4227]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
Minimum eigenvalue: -0.21108858736702252
La valeur propre dans ce cas ne correspond pas à la valeur propre minimale du hamiltonien complet. L'observation clé ici est la suivante : si on projette sur un sous-espace qui exclut des états de base figurant dans notre état cible (fondamental) — partiellement ou complètement — l'état fondamental estimé sera différent de l'état exact.
2.3 Cas 3 : le sous-espace inclut à la fois des vecteurs de l'état fondamental et des vecteurs hors état fondamental
Ensuite, on montre un cas où le sous-espace est engendré par des vecteurs qui incluent les vecteurs de l'état fondamental exact ainsi que des vecteurs indésirables. Supposons que notre sous-espace soit engendré par , (présents dans l'état fondamental exact) et (absent dans l'état fondamental exact).
x1 = np.zeros(8)
x1[3] = 1
x2 = np.zeros(8)
x2[5] = 1
x3 = np.zeros(8)
x3[7] = 1
Hs = np.array(
[
[x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
print(Hs)
[[-0.1773 -0.4778 -0.0414]
[-0.4778 0.1014 0.0552]
[-0.0414 0.0552 0.4456]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.53565600006461
Eigenvector for minimum eigenvalue: [ 0.8 0.6 -0. ]
Dans ce cas, on obtient à nouveau comme valeur propre minimale, ce qui correspond à la matrice complète (c'est-à-dire l'état fondamental exact). Un autre résultat intéressant est l'amplitude de retournée par le processus de projection et de diagonalisation. L'amplitude est , et lorsqu'on reconstruit la fonction d'onde (état propre) avec les amplitudes et vecteurs calculés, on obtient :
Ainsi, même si notre sous-espace inclut des vecteurs non cibles (avec l'ensemble complet des vecteurs cibles), on peut calculer la valeur propre et l'état propre corrects car le processus de projection et de diagonalisation filtre les vecteurs non cibles en fixant leurs amplitudes à . Cette propriété de SQD confère une tolérance intrinsèque au bruit.
3. Rôle du quantique dans SQD
Les analyses ci-dessus établissent l'importance des vecteurs générateurs du sous-espace, qui doivent être dans le support de l'état cible. Cela soulève une question importante : Comment choisir des vecteurs ayant le support de l'état fondamental pour la construction du sous-espace ?
C'est là qu'interviennent les ordinateurs quantiques. La synergie quantique-classique fonctionne comme suit dans le paradigme SQD :
- À l'aide d'un circuit quantique approprié, on essaie de préparer un état sur un ordinateur quantique qui générera des états de base sur lesquels la fonction d'onde cible (par exemple, l'état fondamental) a un support significatif. Les états de base échantillonnés (chaînes de bits) vont engendrer le sous-espace pour la projection du hamiltonien.
- Un ordinateur classique projette le hamiltonien sur le sous-espace (engendré par les échantillons/vecteurs issus de l'ordinateur quantique) et le diagonalise pour calculer les valeurs propres et les vecteurs propres à l'aide de méthodes numériques appropriées.
Il peut y avoir plusieurs façons de préparer un tel état quantique, et elles peuvent être variationnelles ou non variationnelles selon le problème.
Dans les deux prochaines leçons, on montrera deux exemples spécifiques de préparation d'états et d'échantillonnage à partir de ceux-ci.
- Dans la leçon 4, on utilisera un ansatz LUCJ (couplage unitaire local de Jastrow) paramétré pour générer des échantillons pour un problème de chimie (estimation de l'énergie de l'état fondamental de la molécule ). On initialisera l'ansatz LUCJ avec des paramètres issus du calcul classique CCSD (coupled cluster singles and doubles).
- Dans la leçon 5, on échantillonnera à partir d'états de base de Krylov pour engendrer le sous-espace pour un problème de physique de la matière condensée. Cette approche est non variationnelle.
En dehors des approches spécifiques au problème ci-dessus, une approche générique pour la préparation d'état implique un ansatz variationnel, dans lequel on mettra à jour de manière itérative les paramètres de l'ansatz à l'aide d'un optimiseur classique.
Les échantillons issus d'ordinateurs quantiques pré-tolérants aux pannes peuvent être bruités. SQD emploie un processus de récupération de configuration auto-cohérent pour corriger les échantillons bruités [1]. On discutera du processus de récupération de configuration plus en détail et on l'appliquera pour corriger de manière itérative les échantillons bruités afin d'affiner l'estimation de l'énergie de l'état fondamental pour un problème de chimie dans la leçon 4.
3.1 Notes sur le support de l'état fondamental
Expliquons davantage le concept de support de l'état fondamental. Le support de l'état fondamental peut être défini comme l'ensemble des états de base pour lesquels l'état fondamental a une amplitude non nulle (jusqu'à un seuil de coupure).
Supposons que l'état fondamental exact d'un problème à qubits soit
Si on échantillonne l'état ci-dessus, on devrait obtenir un ensemble d'états de base computationnels , (les autres états de base computationnels ont une amplitude nulle dans l'état fondamental, et donc, idéalement, n'apparaîtront pas lors de l'échantillonnage).
Idéalement, l'ensemble des vecteurs de base pour cet état est constitué de (en d'autres termes, le sous-espace de cet état est engendré par ces deux vecteurs de base).
En pratique, on n'a pas besoin de préparer l'état fondamental exact car l'échantillonnage de nombreux autres états peut nous donner le même ensemble de vecteurs. Par exemple :
Préparer et échantillonner à partir de l'un des états ci-dessus générera des vecteurs ayant une amplitude non nulle dans l'état fondamental, et tous ces états sont qualifiés pour avoir le support de l'état fondamental. Remarque que l'échantillonnage de inclut un vecteur supplémentaire dont l'amplitude est dans l'état fondamental exact. Cependant, on a montré précédemment qu'inclure de tels vecteurs dans le sous-espace n'est pas problématique car l'opération de projection et de diagonalisation fixe l'amplitude des vecteurs indésirables à , et on peut obtenir la valeur propre attendue et reconstruire l'état propre correct.

Ainsi, préparer et échantillonner à partir de l'état fondamental exact n'est pas nécessaire. En fait, faire ainsi peut être difficile car l'état fondamental exact n'est pas connu a priori, et il est souvent avantageux de ne pas préparer et échantillonner à partir de l'état fondamental exact, surtout si la fonction d'onde (état) est asymétrique avec certains états de base ayant des probabilités très élevées. Considère la fonction d'onde suivante :
C'est une fonction d'onde asymétrique où les états de base et ont des amplitudes bien plus grandes que et . Lors de l'échantillonnage, on obtiendra et plus fréquemment (