Vzorkováním založená kvantová diagonalizace (SQD)
Vzorkováním založená kvantová diagonalizace (SQD) kombinuje klasickou lineární algebru a sílu kvantových výpočtů pro diagonalizaci Hamiltoniánu (matice) a výpočet jeho vlastních hodnot a vlastních vektorů. Diagonalizace matic je důležitá matematická operace, protože tuto metodu využívá mnoho problémů ve vědě, výpočtech a optimalizaci.
Následující video poskytuje přehled SQD, čím je jeho užitečnost dána a co ho dělá rychlejším než mnoho jiných přístupů. Následující text uvádí další podrobnosti.
1. Úvod a motivace
Jako příklad uvažujme rovnici pro vlastní hodnoty energie, kterou proslavil Schrödinger.
je Hamiltonián systému, je vlnová funkce (známá také jako vlastní stav) a je vlastní hodnota. Vlastní hodnoty matice reprezentují energetické hladiny systému. Pokud je například systém molekulou, nejnižší vlastní hodnota reprezentuje energii základního stavu molekuly. V mnoha úlohách nás zajímá odhad energie základního stavu.
Aplikací technik přesné diagonalizace z lineární algebry můžeme diagonalizovat celou matici . Tento přístup se však stává výpočetně náročným (a dokonce nemožným), jak se matice zvětšuje. Například i pro malé chemické molekuly může být prohibitivně velká (například Hamiltonián pro molekulu s bází cc-PVDZ má rozměr
Naštěstí ne vždy potřebujeme všechny vlastní hodnoty a vlastní vektory Hamiltoniánu , a proto v mnoha praktických případech není diagonalizace celé matice nutná. Například v případě odhadu základního stavu nás zajímá nejnižší vlastní hodnota a odpovídající vlastní vektor. To nám umožňuje uplatnit koncept projekce na (užitečný) podprostor.
Uvažujme matici o rozměrech , kde úplný vektorový prostor (Hilbertův prostor) má dimenzi ( je velké). Dále zvolíme podprostor () — což je podmnožina celého Hilbertova prostoru — o dimenzi , kde je dostatečně malé. Po projekci na tento podprostor bude projektovaná matice (řekněme ) menší (). Menší lze diagonalizovat vhodnou klasickou numerickou metodou a získat vlastní hodnoty a vlastní vektory pro tento podprostor.
Je třeba poznamenat, že podprostor musí být v nosiči našeho cílového (například základního) vlastního stavu. Jinými slovy, projektovaný Hamiltonián musí být v podprostoru, který zahrnuje nejnižší vlastní hodnotu.
2. Projekce a diagonalizace
Předpokládejme, že chceme najít nejnižší vlastní hodnotu a odpovídající vlastní vektor pro následující Hamiltonián o rozměrech .
Pro demonstraci škálovatelnosti a důležitosti volby podprostoru budeme diagonalizovat celou matici spolu s různými projektovanými verzemi () pro různé podprostory.
Energie základního stavu (minimální vlastní hodnota) matice je a přesná vlnová funkce základního stavu (vlastní vektor) je:
tedy základní stav matice je generován dvěma výpočetními bázovými stavy (vektory) a .
# 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. ]
Dále budeme matici projektovat na různé podprostory a ověříme, zda dokážeme získat přesný základní stav. Konkrétně projektujeme matici na podprostor generovaný:
- přesnými vektory základního stavu ( a ).
- vektory, které vylučují některé nebo všechny přesné vektory základního stavu (například , a ).
- vektory, které zahrnují jak přesný základní stav, tak stavy mimo základní stav (ale ne všechny možné vektory v Hilbertově prostoru).
2.1 Případ 1: Podprostor obsahuje základní stav
Předpokládejme, že chceme promítnout do podprostoru (), který je rozpětím dvou vektorů a . Promítnutý Hamiltonián je definován takto:
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]
Zde můžeme učinit několik klíčových pozorování.
- Protože jsme podprostor vytvořili rozpětím dvou vektorů, dimenze promítnuté matice () je , což je menší než plná matice ().
- Minimální vlastní hodnota promítnuté matice odpovídá přesné vlastní hodnotě základního stavu.
- Hodnoty v proměnné
eigvecsoznačují amplitudy vektorů rozpínajících podprostor a pomocí nich dokážeme zrekonstruovat vlastní stav (základní stav). V tomto případě získáme přesný základní stav (až na globální fázi):
2.2 Případ 2: Podprostor vylučuje některé nebo všechny vektory základního stavu
Dále promítneme na podprostor vytvořený rozpětím tří vektorů , a . Vektory záměrně volíme tak, aby vylučovaly jeden vektor základního stavu (). Promítnutý Hamiltonián je definován takto:
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
Vlastní hodnota v tomto případě neodpovídá minimální vlastní hodnotě plného Hamiltoniánu. Klíčové pozorování zde je: pokud promítáme na podprostor, který vylučuje bázové stavy našeho cílového (základního) stavu – ať už částečně, nebo úplně – odhadnutý základní stav se bude lišit od přesného.
2.3 Případ 3: Podprostor obsahuje jak základní stav, tak vektory mimo základní stav
Dále ukážeme případ, kdy je podprostor generován vektory zahrnujícími jak vektory přesného základního stavu, tak nežádoucí vektory. Předpokládejme, že náš podprostor je generován vektory , (přítomné v přesném základním stavu) a (v přesném základním stavu nepřítomný).
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. ]
V tomto případě opět dostáváme jako minimální vlastní číslo , což odpovídá úplné matici (tedy přesnému základnímu stavu). Dalším zajímavým výsledkem je amplituda vrácená procesem projekce a diagonalizace. Amplituda je , a když zrekonstruujeme vlnovou funkci (vlastní stav) pomocí vypočtených amplitud a vektorů, dostáváme:
I když tedy náš podprostor obsahuje některé necílové vektory (spolu s úplnou sadou cílových vektorů), můžeme správně spočítat vlastní číslo i vlastní stav, protože proces projekce a diagonalizace odfiltruje necílové vektory tím, že jejich amplitudy nastaví na . Tato vlastnost SQD poskytuje vrozenou toleranci vůči šumu.
3. Role kvantové části v SQD
Výše uvedené analýzy ukazují důležitost vektorů generujících podprostor, které musejí být v pokrytí cílového stavu. To vyvolává důležitou otázku: Jak zvolit vektory s pokrytím cílového stavu pro konstrukci podprostoru?
Zde vstupují do hry kvantové počítače. Kvantově-klasická synergie funguje v paradigmatu SQD takto:
- Pomocí vhodného kvantového obvodu se snažíme na kvantovém počítači připravit stav, který generuje bázové stavy, na kterých má cílová vlnová funkce (například základní stav) významné pokrytí. Navzorkované bázové stavy (bitstringy) budou generovat podprostor pro projekci Hamiltoniánu.
- Klasický počítač projikuje Hamiltonián do podprostoru (generovaného vzorky/vektory z kvantového počítače) a diagonalizuje ho, aby pomocí vhodných numerických metod vypočítal vlastní čísla a vlastní vektory.
Způsobů, jak takový kvantový stav připravit, může být několik a mohou být variační nebo nevariační v závislosti na úloze.
V následujících dvou lekcích si ukážeme dva konkrétní příklady přípravy stavů a vzorkování z nich.
- V lekci 4 použijeme parametrizovaný ansatz LUCJ (local unitary coupled Jastrow) ke generování vzorků pro chemickou úlohu (odhad energie základního stavu molekuly ). LUCJ ansatz inicializujeme parametry z klasického výpočtu CCSD (coupled cluster singles and doubles).
- V lekci 5 budeme vzorkovat z Krylovových bázových stavů, abychom generovali podprostor pro úlohu z fyziky kondenzovaných látek. Tento přístup je svou povahou nevariační.
Kromě výše uvedených problémově specifických přístupů existuje obecný přístup k přípravě stavu založený na variačním ansatzu, kde iterativně aktualizujeme parametry ansatzu pomocí klasického optimalizátoru.
Vzorky z pre-fault-tolerantních kvantových počítačů mohou být zašuměn é. SQD využívá samokonzistentní proces obnovy konfigurací k opravě zašuměných vzorků [1]. Proces obnovy konfigurací probereme podrobněji a iterativně jej použijeme k opravě zašuměných vzorků za účelem zpřesnění odhadu energie základního stavu pro chemickou úlohu v lekci 4.
3.1 Poznámky k pokrytí základního stavu
Pojďme si koncept pokrytí základního stavu vysvětlit podrobněji. Pokrytí základního stavu lze definovat jako množinu bázových stavů, ve kterých má základní stav nenulovou amplitudu (až po prahovou hodnotu).
Předpokládejme, že přesný základní stav -qubitové úlohy je
Pokud výše uvedený stav navzorkujeme, měli bychom získat množinu výpočetních bázových stavů , (ostatní výpočetní bázové stavy mají v základním stavu nulovou amplitudu, a proto se při vzorkování v ideálním případě neobjeví).
V ideálním případě se množina bázových vektorů tohoto stavu skládá z (jinými slovy, podprostor tohoto stavu je generován těmito dvěma bázovými vektory).
V praxi nemusíme připravovat přesný základní stav, protože vzorkování z mnoha jiných stavů nám může poskytnout stejnou množinu vektorů. Například:
Příprava a vzorkování z kter éhokoli z výše uvedených stavů vygeneruje vektory, které mají v základním stavu nenulovou amplitudu, a všechny se kvalifikují jako stavy mající pokrytí základního stavu. Všimni si, že vzorkování zahrnuje jeden vektor navíc, , který má v přesném základním stavu amplitudu . Dříve jsme však ukázali, že zahrnutí takových vektorů do podprostoru není problematické, protože operace projekce a diagonalizace nastaví amplitudu nežádoucích vektorů na , a tak můžeme získat očekávané vlastní číslo a zrekonstruovat správný vlastní stav.

Příprava a vzorkování z přesného základního stavu tedy není nutná. Ve skutečnosti to může být obtížné, protože přesný základní stav není a priori znám, a často je výhodné přesný základní stav nepřipravovat a z něj nevzorkovat, zejména pokud je vlnová funkce (stav) zešikmená tak, že některé bázové stavy mají velmi vysoké pravděpodobnosti. Uvažuj následující vlnovou funkci:
Toto je zešikmená vlnová funkce, kde bázové stavy a mají mnohem větší amplitudy ve srovnání s a . Při vzorkování budeme a dostávat mnohem častěji ( pro a každý, pro a pro ). Při omezeném rozpočtu vzorkování (shots) je velmi pravděpodobné, že naše navzorkovaná množina bude obsahovat pouze a . Jak bylo ukázáno dříve, pokud podprostor generujeme takovou množinou s chybějícími vektory, nebudeme schopni najít skutečné minimální vlastní číslo. Proto bude výhodné (a nezbytné) vzorkovat ze stavu s pokrytím základního stavu.