Skip to main content
IBM Quantum Platform

Il risolutore di autovalori quantistici variazionali (VQE)

Questa lezione introdurrà l'eigensolver quantistico variazionale, spiegherà la sua importanza come algoritmo fondamentale per l'informatica quantistica ed esplorerà anche i suoi punti di forza e di debolezza. La VQE da sola, senza metodi aggiuntivi, non è probabilmente sufficiente per i moderni calcoli quantistici su scala utility. È comunque importante come archetipo del metodo ibrido classico-quantistico e costituisce un'importante base su cui sono costruiti molti algoritmi più avanzati.

Questo video offre una panoramica della VQE e dei fattori che ne influenzano l'efficienza. Il testo che segue aggiunge ulteriori dettagli e implementa VQE utilizzando Qiskit.


1. Che cos'è il VQE?

Il risolutore variazionale degli autovalori quantistici è un algoritmo che utilizza congiuntamente l'informatica classica e quella quantistica per svolgere un compito. Il calcolo del VQE si basa su quattro elementi principali:

  • Un operatore : Spesso un'hamiltoniana, che chiameremo HH, che descrive una proprietà del sistema che si desidera ottimizzare. Un altro modo per dirlo è che si cerca l'autovettore di questo operatore che corrisponde all'autovalore minimo. Spesso chiamiamo questo autovettore "stato fondamentale".
  • Un "ansatz" (parola tedesca che significa "approccio"): si tratta di un circuito quantistico che prepara uno stato quantistico che approssima l'autovettore che si sta cercando. In realtà l'ansatz è una famiglia di circuiti quantistici, perché alcune porte dell'ansatz sono parametrizzate, cioè alimentate con un parametro che possiamo variare. Questa famiglia di circuiti quantistici può preparare una famiglia di stati quantistici che approssimano lo stato fondamentale.
  • Uno stimatore : un metodo per stimare il valore atteso dell'operatore HH sullo stato quantistico variazionale corrente. A volte ciò che ci interessa davvero è semplicemente questo valore atteso, che chiamiamo funzione di costo. A volte ci interessa una funzione più complessa che possa comunque essere definita a partire da uno o più valori attesi.
  • Un ottimizzatore classico : un algoritmo che varia i parametri per cercare di minimizzare la funzione di costo.

Analizziamo in modo più approfondito ciascuno di questi componenti.

1.1 L'operatore (Hamiltoniano)

Il cuore di un problema VQE è un operatore che descrive un sistema di interesse. Assumeremo qui che l'autovalore minimo e l'autovettore corrispondente di questo operatore siano utili per qualche scopo scientifico o commerciale. Gli esempi possono includere un'hamiltoniana chimica che descrive una molecola, in modo che l'autovalore più basso dell'operatore corrisponda all'energia di stato fondamentale della molecola e l'autostato corrispondente descriva la geometria o la configurazione degli elettroni della molecola. Oppure l'operatore potrebbe descrivere un costo di un certo processo da ottimizzare e gli autostati potrebbero corrispondere a percorsi o pratiche. In alcuni campi, come la fisica, una "hamiltoniana" si riferisce quasi sempre a un operatore che descrive l'energia di un sistema fisico. Ma nell'informatica quantistica è comune vedere gli operatori quantistici che descrivono un problema commerciale o logistico chiamati anche "hamiltoniani". Adotteremo questa convenzione in questa sede.

Un'immagine degli orbitali atomici e un'immagine di una rete composta da numerosi nodi e collegamenti tra di essi.

La mappatura di un problema fisico o di ottimizzazione in qubit è tipicamente un compito non banale, ma questi dettagli non sono l'obiettivo di questo corso. Una discussione generale sulla mappatura di un problema in un operatore quantistico si trova in Quantum computing in practice. Un'analisi più dettagliata della mappatura dei problemi di chimica in operatori quantistici si trova in Quantum Chemistry with VQE.

Ai fini di questo corso, assumeremo che la forma dell'hamiltoniana sia nota. Ad esempio, l'hamiltoniana per una semplice molecola di idrogeno (sotto certe ipotesi di spazio attivo e utilizzando il mappatore di Jordan-Wigner) è:

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,
    ],
)

Si noti che nell'hamiltoniana di cui sopra, ci sono termini come ZZII e YYYY che non commutano tra loro. Cioè, per valutare ZZII, dovremmo misurare l'operatore Pauli Z sul qubit 3 (tra le altre misure). Ma per valutare YYYY, dobbiamo misurare l'operatore di Pauli Y su questo stesso qubit, il qubit 3. Esiste una relazione di incertezza tra gli operatori Y e Z sullo stesso qubit; non possiamo misurare entrambi gli operatori allo stesso tempo. Riprenderemo questo punto di seguito e nel corso del corso. L'hamiltoniana di cui sopra è un operatore matriciale 16×1616\times 16. La diagonalizzazione dell'operatore per trovare il suo autovalore di energia minima non è difficile.

import numpy as np

A = np.array(hamiltonian)
eigenvalues, eigenvectors = np.linalg.eigh(A)
print("The ground state energy is ", min(eigenvalues), "hartrees")

Output:

The ground state energy is  -1.1459778447627311 hartrees

Gli eigensolver classici a forza bruta non sono in grado di descrivere le energie o le geometrie di sistemi di atomi molto grandi, come i farmaci o le proteine. Il VQE è uno dei primi tentativi di sfruttare l'informatica quantistica in questo problema.

In questa lezione incontreremo hamiltoniani molto più grandi di quelli sopra citati. Ma sarebbe inutile spingersi oltre i limiti di ciò che VQE può fare, prima di introdurre alcuni degli strumenti più avanzati che possono aumentare o sostituire VQE, più avanti in questo corso.

1.2 Ansatz

La parola "ansatz" in tedesco significa "approccio". Il plurale corretto in tedesco è "ansätze", anche se spesso si legge "ansatzes" o "ansatze". Nel contesto della VQE, un ansatz è il circuito quantistico che si utilizza per creare una funzione d'onda multi-qubit che approssima il più possibile lo stato fondamentale del sistema che si sta studiando e che quindi produce il valore di aspettativa più basso del proprio operatore. Questo circuito quantistico conterrà parametri variazionali (spesso raccolti nel vettore delle variabili θ\vec{\theta} ).

Un'immagine di un circuito quantistico con parametri variazionali contrassegnati con "theta".

Viene scelto un insieme iniziale di valori θ0\vec{\theta_0} dei parametri variazionali. Chiameremo l'operazione unitaria dell'ansatz sul circuito Uvar(θ0)U_{\text{var}}(\vec{\theta_0}). Per impostazione predefinita, tutti i qubit nei computer quantistici IBM® sono inizializzati allo stato 0|0\rangle. Quando il circuito viene eseguito, lo stato dei qubit sarà

ψ(θ0)=Uvar(θ0)0N|\psi(\vec{\theta_0})\rangle=U_{\text{var}}(\vec{\theta_0})|0\rangle^{\otimes N}

Se ci servisse solo l'energia più bassa (usando il linguaggio dei sistemi fisici), potremmo stimarla semplicemente misurando l'energia più volte e prendendo la più bassa. Ma in genere vogliamo anche la configurazione che produce l'energia o l'autovalore più basso. Il passo successivo è quindi la stima del valore di aspettativa dell'hamiltoniana, che si ottiene attraverso misure quantistiche. È un'attività che richiede molto impegno. Ma possiamo comprendere questo processo qualitativamente notando che la probabilità PjP_j di misurare un'energia EjE_j (sempre usando il linguaggio dei sistemi fisici) è legata al valore di aspettativa da:

ψ(θ0)Hψ(θ0)\langle \psi(\vec{\theta_0}) |H|\psi (\vec{\theta_0}) \rangle

La probabilità PjP_j è anche legata alla sovrapposizione tra l'autostato ϕj|\phi_j\rangle e lo stato attuale del sistema ψ(θ0)|\psi(\vec{\theta_0})\rangle :

Pj=ϕjψ(θ0)2=ϕjUvar(θ0)0N2P_j=|\langle \phi_j|\psi(\vec{\theta_0})\rangle|^2 = |\langle \phi_j|U_{\text{var}}(\vec{\theta_0})|0\rangle^{\otimes N}|^2

Quindi, effettuando molte misure degli operatori di Pauli che compongono la nostra hamiltoniana, possiamo stimare il valore di aspettativa dell'hamiltoniana nello stato attuale del sistema ψ(θ0)|\psi(\vec{\theta_0})\rangle. Il passo successivo consiste nel variare i parametri θ\vec{\theta} e cercare di avvicinarsi maggiormente allo stato a bassa energia (ground) del sistema. A causa dei parametri variazionali presenti nell'ansatz, a volte si sente parlare di forma variazionale.

Prima di passare al processo variazionale, si noti che spesso è utile iniziare il proprio stato da uno stato di "buona approssimazione". Potreste conoscere il vostro sistema a sufficienza per fare un'ipotesi iniziale migliore di 0N|0\rangle^{\otimes N}. Ad esempio, è comune inizializzare i qubit allo stato Hartree-Fock nelle applicazioni chimiche. Questa ipotesi iniziale, che non contiene alcun parametro variazionale, è chiamata stato di riferimento. Chiamiamo il circuito quantistico utilizzato per creare lo stato di riferimento UrefU_{ref}. Ogni volta che diventa importante distinguere lo stato di riferimento dal resto dell'ansatz, usiamo: Uansatz(θ)=Uvar(θ)Uref.U_{\text{ansatz}}(\vec{\theta}) =U_{\text{var}}(\vec{\theta})U_{\text{ref}}. Equivalentemente

ψref=Uref0Nψansatz(θ)=Uvar(θ)ψref=Uvar(θ)Uref0N.\begin{aligned} |\psi_{\text{ref}}\rangle&=U_{\text{ref}}|0\rangle^{\otimes N}\\ |\psi_{\text{ansatz}}(\vec{\theta})\rangle&=U_{var}(\vec{\theta})|\psi_{\text{ref}}\rangle = U_{\text{var}}(\vec{\theta})U_{\text{ref}}|0\rangle^{\otimes N}. \end{aligned}

1.3 Stimatore

Abbiamo bisogno di un modo per stimare il valore di aspettativa della nostra hamiltoniana in un particolare stato variazionale ψ(θ)|\psi(\vec{\theta})\rangle. Se potessimo misurare direttamente l'intero operatore HH, sarebbe semplice effettuare molte misure (diciamo NN ) e calcolare la media dei valori misurati:

ψ(θ)Hψ(θ)N1Nj=1NEj\langle \psi(\vec{\theta})|H|\psi(\vec{\theta})\rangle _N \approx \frac{1}{N}\sum_{j=1}^N {E_j}

Qui, il simbolo \approx ci ricorda che questo valore di aspettativa sarebbe corretto solo nel limite di NN\rightarrow \infty. Ma con migliaia di misure effettuate su un circuito, l'errore di campionamento del valore di aspettativa è piuttosto basso. Ci sono altre considerazioni, come il rumore, che diventano un problema per i calcoli molto precisi.

Tuttavia, in genere non è possibile misurare contemporaneamente l' HH. L' HH può contenere più operatori di Pauli X, Y e Z non commutativi. Pertanto, l'hamiltoniano deve essere suddiviso in gruppi di operatori che possano essere misurati simultaneamente; ciascuno di questi gruppi deve essere stimato separatamente e i risultati devono essere combinati per ottenere un valore atteso. Approfondiremo questo argomento nella prossima lezione, quando tratteremo la scalabilità degli approcci classici e quantistici. Questa complessità nella misurazione è uno dei motivi per cui abbiamo bisogno di un codice altamente efficiente per effettuare tale stima. In questa lezione e nelle successive, utilizzeremo la funzione "Estimator" di IBM Quantum a questo scopo.

1.4 Ottimizzatori classici

Un ottimizzatore classico è un qualsiasi algoritmo classico progettato per trovare gli estremi di una funzione obiettivo (tipicamente un minimo). Eseguono una ricerca nello spazio dei possibili parametri alla ricerca di un insieme che minimizzi una funzione di interesse. Possono essere ampiamente classificati in metodi basati sul gradiente, che utilizzano le informazioni sul gradiente, e metodi senza gradiente, che operano come ottimizzatori black-box. La scelta dell'ottimizzatore classico può avere un impatto significativo sulle prestazioni di un algoritmo, soprattutto in presenza di rumore nell'hardware quantistico. Gli ottimizzatori più diffusi in questo campo sono Adam, AMSGrad e SPSA, che hanno mostrato risultati promettenti in ambienti rumorosi. Gli ottimizzatori più tradizionali includono COBYLA e SLSQP.

Un flusso di lavoro comune (dimostrato nella sezione 3.3 ) consiste nell'utilizzare uno di questi algoritmi come metodo all'interno di un minimizzatore come la funzione minimize di scipy. Prende come argomenti:

  • Una funzione da minimizzare. Questo è spesso il valore di aspettativa energetica. Ma queste vengono generalmente definite "funzioni di costo".
  • Un insieme di parametri da cui iniziare la ricerca. Spesso chiamato x0x_0 o θ0\theta_0.
  • Argomenti, compresi gli argomenti della funzione di costo. Nell'informatica quantistica con Qiskit, questi argomenti comprenderanno l'ansatz, l'hamiltoniano e la primitiva Estimator, che verrà trattata più approfonditamente nella prossima sottosezione.
  • Un "metodo" di minimizzazione. Si riferisce all'algoritmo specifico utilizzato per la ricerca nello spazio dei parametri. Qui si specifica, ad esempio, COBYLA o SLSQP.
  • Opzioni. Le opzioni disponibili possono variare a seconda del metodo. Ma un esempio che praticamente tutti i metodi includono è il numero massimo di iterazioni dell'ottimizzatore prima di terminare la ricerca: 'maxiter'.
Un'immagine che mostra una linea curva che rappresenta l'energia, con diversi punti in cui viene verificato il valore per individuare il minimo.

A ogni passo iterativo, il valore di aspettativa dell'hamiltoniana viene stimato effettuando molte misurazioni. L'energia stimata viene restituita dalla funzione di costo e il minimizzatore aggiorna le informazioni che possiede sul paesaggio energetico. La scelta esatta del passo successivo da parte dell'ottimizzatore varia da metodo a metodo. Alcuni utilizzano i gradienti e selezionano la direzione di discesa più ripida. Altri possono tenere conto del rumore e richiedere che il costo diminuisca di un ampio margine prima di accettare che l'energia reale diminuisca in quella direzione.

# 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 Il principio variazionale

In questo contesto, il principio di variazione è molto importante; esso afferma che nessuna funzione d'onda variazionale può produrre un valore di aspettativa dell'energia (o del costo) inferiore a quello prodotto dalla funzione d'onda dello stato fondamentale. Matematicamente,

Evar=ψvarHψvarEmin=ψ0Hψ0E_\text{var}=\langle \psi_\text{var}|H|\psi_\text{var}\rangle \geq E_\text{min}=\langle \psi_\text{0}|H|\psi_\text{0}\rangle

Questo è facile da verificare se si nota che l'insieme di tutti gli autostati {ψ0,ψ1,ψ2,...ψn}\{|\psi_0\rangle, |\psi_1\rangle, |\psi_2\rangle, ...|\psi_n \rangle\} di HH forma una base completa per lo spazio di Hilbert. In altre parole, qualsiasi stato e in particolare ψvar|\psi_\text{var}\rangle può essere scritto come una somma ponderata (normalizzata) di questi autostati di HH :

ψvar=i=0nciψi|\psi_\text{var}\rangle=\sum_{i=0}^n c_i |\psi_i\rangle

dove cic_i sono costanti da determinare e i=0ci2=1\sum_{i=0} |c_i|^2 = 1. Lasciamo questo esercizio al lettore. Ma si noti l'implicazione: lo stato variazionale che produce il valore di aspettativa a più bassa energia è la migliore stima del vero stato fondamentale.

Verifica la tua comprensione

Verificare matematicamente che EvarE0E_\text{var}\geq E_0 per ogni stato variazionale ψvar|\psi_\text{var}\rangle.

  • Utilizzando l'espansione data dello stato variazionale in termini di autostati energetici,

    ψvar=i=0nciψi,|\psi_\text{var}\rangle=\sum_{i=0}^n c_i |\psi_i\rangle,

    possiamo scrivere il valore di aspettativa dell'energia variazionale come

    Evar=ψvarHψvar=(i=0nciψi)H(j=0ncjψj)=(i=0nciψi)(j=0ncjEjψj)=i,j=0ncicjEjψiψj=i,j=0ncicjEjδi,j=i=0nci2Ei.\begin{aligned} E_\text{var}&=\langle \psi_\text{var}|H|\psi_\text{var}\rangle =\left(\sum_{i=0}^n c^*_i \langle \psi_i|\right)H\left(\sum_{j=0}^n c_j |\psi_j\rangle\right)\\ &=\left(\sum_{i=0}^n c^*_i \langle \psi_i|\right)\left(\sum_{j=0}^n c_j E_j|\psi_j\rangle\right)\\ &=\sum_{i,j=0}^n c^*_i c_j E_j \langle \psi_i|\psi_j\rangle\\ &=\sum_{i,j=0}^n c^*_i c_j E_j \delta_{i,j}\\ &=\sum_{i=0}^n |c_i|^2 E_i. \end{aligned}

    Per tutti i coefficienti 0ci210\leq|c_i|^2\leq 1. Quindi possiamo scrivere

    Evar=i=0nci2Eii=0nci2E0=E0i=0nci2=E0(1)EvarE0\begin{aligned} E_\text{var}&=\sum_{i=0}^n |c_i|^2 E_i\geq \sum_{i=0}^n |c_i|^2 E_0 = E_0 \sum_{i=0}^n |c_i|^2 = E_0(1) \\ E_\text{var}&\geq E_0 \end{aligned}

2. Confronto con il flusso di lavoro classico

Supponiamo di essere interessati a una matrice con N righe e N colonne. Supponiamo che la matrice sia così grande che la diagonalizzazione esatta non sia possibile. Supponiamo inoltre di conoscere abbastanza il problema da poter fare alcune ipotesi sulla struttura complessiva dell'autostato target e di voler sondare stati simili alla nostra ipotesi iniziale per vedere se il costo/energia può essere ulteriormente ridotto. Si tratta di un approccio variazionale ed è un metodo utilizzato quando la diagonalizzazione esatta non è un'opzione.

2.1 Flusso di lavoro classico

Utilizzando un computer classico, il funzionamento sarebbe il seguente:

  • Fate un'ipotesi di stato, con alcuni parametri θi\vec{\theta}_i che varierete: ψ(θi)|\psi(\vec{\theta}_i)\rangle. Anche se questa ipotesi iniziale potrebbe essere casuale, non è consigliabile. Vogliamo utilizzare la conoscenza del problema in questione per adattare il più possibile le nostre ipotesi.
  • Calcolare il valore di aspettativa dell'operatore con il sistema in quello stato: ψ(θi)Hψ(θi)\langle\psi(\vec{\theta}_i)|H|\psi(\vec{\theta}_i)\rangle
  • Modificare i parametri variazionali e ripetere: θiθi+1\vec{\theta}_i\rightarrow \vec{\theta}_{i+1}.
  • Utilizzare le informazioni accumulate sul panorama dei possibili stati nel sottospazio variazionale per fare ipotesi sempre migliori e avvicinarsi allo stato target. Il principio variazionale garantisce che il nostro stato variazionale non può produrre un autovalore inferiore a quello dello stato fondamentale target. Quindi, più basso è il valore di aspettativa, migliore è l'approssimazione dello stato fondamentale:
minθ{Evar,i=ψ(θi)Hψ(θi)}E0\min_{\vec{\theta}} \{ E_{\text{var},i} = \langle\psi(\vec{\theta_i})|H|\psi(\vec{\theta_i})\rangle \} \geq E_0

Esaminiamo la difficoltà di ogni fase di questo approccio. L'impostazione o l'aggiornamento dei parametri è facile dal punto di vista computazionale; la difficoltà sta nel selezionare parametri iniziali utili e fisicamente motivati. Utilizzare le informazioni accumulate dalle iterazioni precedenti per aggiornare i parametri in modo da avvicinarsi allo stato fondamentale è un'operazione non banale. Ma esistono algoritmi di ottimizzazione classici che svolgono questo compito in modo abbastanza efficiente. Questa ottimizzazione classica è costosa solo perché può richiedere molte iterazioni; nel caso peggiore, il numero di iterazioni può scalare in modo esponenziale con N. Il passo singolo più costoso dal punto di vista computazionale è quasi certamente il calcolo del valore di aspettativa della matrice utilizzando un dato stato ψ(θi)|\psi(\vec{\theta_i})\rangle : ψ(θi)Hψ(θi).\langle\psi(\vec{\theta_i})|H|\psi(\vec{\theta_i})\rangle.

La matrice N×NN\times N deve agire sul vettore di NN elementi, il che corrisponde a: O(N2)O(N^2) operazioni di moltiplicazione nel caso peggiore. Questa operazione deve essere eseguita a ogni iterazione dei parametri. Per matrici estremamente grandi, questa operazione ha un costo computazionale elevato.

2.2 Flusso di lavoro quantistico e gruppi di Pauli pendolari

Immaginate ora di relegare questa parte del calcolo a un computer quantistico. Invece di calcolare questo valore di aspettativa, lo si stima preparando lo stato ψ(θi)|\psi(\vec{\theta_i})\rangle sul computer quantistico utilizzando il proprio ansatz variazionale e poi effettuando le misure.

Può sembrare più facile di quanto non sia. HH non è generalmente facile da misurare. Ad esempio, potrebbe essere costituito da molti operatori di Pauli X, Y e Z non commutativi. Ma HH può essere scritto come una combinazione lineare di termini, hαh_\alpha, ognuno dei quali è facilmente misurabile (per esempio, operatori di Pauli o gruppi di operatori di Pauli commutativi tra qubit). Il valore di aspettativa di HH su qualche stato Ψ|\Psi\rangle è la somma ponderata dei valori di aspettativa dei termini costituenti hαh_\alpha. Questa espressione vale per qualsiasi stato Ψ|\Psi⟩, ma la utilizzeremo in particolare per gli stati variazionali ψ(θi)|\psi(\theta_i)\rangle.

H=α=1TcαhαH = \sum_{\alpha = 1}^T{c_\alpha h_\alpha}

dove hαh_\alpha è una stringa di Pauli come IZZX…XIYX, o diverse stringhe di questo tipo che commutano tra loro. Quindi una descrizione del valore di aspettativa che si avvicina di più alla realtà della misurazione sui computer quantistici è

ΨHΨ=αcαΨhαΨ.\langle \Psi |H|\Psi \rangle =\sum_{\alpha} c_\alpha \langle \Psi | h_\alpha|\Psi \rangle.

E nel contesto della nostra funzione d'onda variazionale:

ψ(θi)Hψ(θi)=αcαψ(θi)hαψ(θi)\langle \psi(\vec{\theta}_i) |H|\psi(\vec{\theta}_i) \rangle =\sum_{\alpha} c_\alpha \langle \psi(\vec{\theta}_i) | h_\alpha|\psi(\vec{\theta}_i) \rangle

Ciascuno dei termini hαh_\alpha può essere misurato MM volte producendo campioni di misura sαjs_{\alpha j} con j=1Mj=1…M e restituisce un valore di aspettativa μα\mu_\alpha e una deviazione standard σα\sigma_\alpha. Possiamo sommare questi termini e propagare gli errori attraverso la somma per ottenere un valore di aspettativa complessivo μ\mu e una deviazione standard σ\sigma.

ψ(θi)hαψ(θi)μα±σαMμα=1Mjsα,jσα2=1M1j(sα,jμα)2ψ(θi)Hψ(θi)μ±σμ=αcαμασ2=αcα2σα2M\begin{aligned} \langle \psi(\vec{\theta}_i) |h_\alpha|\psi(\vec{\theta}_i) \rangle &\simeq \mu _\alpha \pm \frac{\sigma_\alpha}{\sqrt{M}} &\qquad \mu_\alpha &=\frac{1}{M}\sum_j s_{\alpha,j} &\qquad \sigma^2_\alpha &=\frac{1}{M-1}\sum_j (s_{\alpha,j}-\mu_\alpha)^2\\ \langle \psi(\vec{\theta}_i) |H|\psi(\vec{\theta}_i) \rangle &\simeq \mu \pm \sigma &\qquad \mu &= \sum_\alpha c_\alpha \mu_\alpha &\qquad \sigma^2&=\sum_\alpha c^2_\alpha \frac{\sigma^2_\alpha }{M} \end{aligned}

Ciò non richiede una moltiplicazione su larga scala, né un processo che necessariamente scala come N2N^2. Richiede invece misure multiple sul computer quantistico. Se non ne servono troppi, questo approccio potrebbe essere efficiente. E questa è la parte quantistica del VQE.

Ma parliamo dei motivi per cui questo potrebbe non essere efficiente. Un motivo per effettuare molte misure è quello di ridurre l'incertezza statistica delle stime, per calcoli di altissima precisione. Un altro motivo è il numero di stringhe di Pauli necessarie per coprire l'intera matrice. Poiché le matrici di Pauli (più l'identità: X, Y, Z e I) coprono lo spazio di tutti gli operatori di una data dimensione, abbiamo la garanzia di poter scrivere la nostra matrice di interesse come una somma pesata di operatori di Pauli, come abbiamo fatto in precedenza.

H=α=1TcαhαH = \sum_{\alpha = 1}^T{c_\alpha h_\alpha}

dove hαh_\alpha è una stringa di Pauli che agisce su tutti i qubit che descrivono il sistema come IZZX…XIYX, o diverse stringhe di questo tipo che commutano tra loro. Ricordiamo che Qiskit utilizza la notazione little endian, in cui l'operatore di Pauli nthn^\text{th} da destra agisce sul qubit nthn^\text{th}. Quindi possiamo misurare il nostro operatore misurando una serie di operatori di Pauli.

Ma non possiamo misurare tutti quegli operatori di Pauli contemporaneamente. Gli operatori di Pauli (ad eccezione di I) non commutano tra loro se sono associati allo stesso qubit. Ad esempio, possiamo misurare IZIZ e ZZXZ contemporaneamente, poiché possiamo misurare I e Z contemporaneamente per il terzo qubit, e possiamo conoscere I e X contemporaneamente per il primo qubit. Ma non possiamo misurare ZZZZ e ZZZX contemporaneamente, perché Z e X non commutano e agiscono entrambi sul qubit 0. I lettori più esperti ricorderanno forse che due gruppi di operatori di Pauli possono commutare come insiemi, anche se le misurazioni dei singoli qubit non commutano. L'estimatore presuppone misurazioni di Pauli come prodotto tensoriale (tramite rotazioni di base), corrispondenti a raggruppamenti di operatori che commutano a livello di singolo qubit. Pertanto, per stimare contemporaneamente due stringhe (A e B) di operatori di Pauli utilizzando Estimator, gli operatori di Pauli di ciascun qubit in A e B devono commutare. Ciò significa che non possiamo misurare ZZZZ e ZZXX contemporaneamente.

Una tabella che riporta diverse stringhe di Pauli, alcune delle quali commutano e altre no.

Decomponiamo quindi la nostra matrice HH in una somma di paoli che agiscono su qubit diversi. Alcuni elementi di questa somma possono essere misurati tutti insieme; chiamiamo questo gruppo di paoli pendolari. A seconda del numero di termini non pendolari, potrebbero essere necessari molti gruppi di questo tipo. Chiamiamo il numero di tali gruppi di stringhe di Pauli commutanti NGCPN_\text{GCP}. Se NGCPN_\text{GCP} è piccolo, questo potrebbe funzionare bene. Se HH ha milioni di gruppi, questo non sarà utile.

Le operazioni necessarie per la stima del valore atteso sono raggruppate nella primitiva “ IBM Quantum ” denominata “Estimator”. Per ulteriori informazioni su Estimator, consulta la guida di riferimento all'API nella documentazione di IBM Quantum®. Si può semplicemente utilizzare Estimator direttamente, ma Estimator restituisce molto più del semplice autovalore di energia minima. Ad esempio, restituisce anche informazioni sull'errore standard dell'ensemble. Pertanto, nel contesto dei problemi di minimizzazione, capita spesso di trovare lo stimatore all’interno di una funzione di costo. Per ulteriori informazioni sugli input e gli output di Estimator, consulta questa guida nella documentazione di IBM Quantum.

Si registra il valore di aspettativa (o la funzione di costo) per l'insieme dei parametri θi\vec{\theta_i} utilizzati nel proprio stato, quindi si aggiornano i parametri. Nel corso del tempo, si potrebbero utilizzare i valori di aspettativa o i valori della funzione di costo stimati per approssimare un gradiente della funzione di costo nel sottospazio degli stati campionati dall'ansatz. Esistono ottimizzatori classici sia basati sul gradiente che privi di gradiente. Entrambi soffrono di potenziali problemi di addestrabilità, come la presenza di molteplici minimi locali e di ampie regioni dello spazio dei parametri con gradiente prossimo allo zero, chiamate plateau sterili.

Due immagini di una linea curva con un valore minimo. In un caso, i punti vengono controllati in modo casuale alla ricerca di un minimo; nell’altro, si stima un gradiente tracciando una linea tra due punti adiacenti.

2.3 Fattori che determinano il costo computazionale

Il VQE non risolverà tutti i problemi di chimica quantistica più difficili. Num. Ma essere migliori in tutti i calcoli non è il punto. Abbiamo spostato ciò che determina il costo computazionale.

Una tabella che mette a confronto gli approcci variazionali classici e quantistici. Entrambe richiedono ipotesi iniziali valide. In teoria, il costo varia proporzionalmente al quadrato delle dimensioni della matrice, mentre nell'approccio quantistico dipende dal numero di gruppi di operatori di Pauli commutanti presenti.

Siamo passati da un processo la cui complessità dipende solo dalla dimensione della matrice a uno che dipende dalla precisione richiesta e dal numero di operatori Pauli non commutativi che compongono la matrice. L'ultimo bit non ha un analogo nell'informatica classica.

Sulla base di queste dipendenze, per le matrici rade o per le matrici che coinvolgono poche stringhe di Pauli non comunicanti, questo processo può essere utile. Questo è il caso, ad esempio, dei sistemi di spin interagenti. Per le matrici dense, potrebbe essere meno utile. Sappiamo, ad esempio, che i sistemi chimici hanno spesso hamiltoniani che coinvolgono centinaia, migliaia o addirittura milioni di stringhe di Pauli. È stato fatto un lavoro interessante per ridurre questo numero di termini. Ma i sistemi chimici potrebbero essere più adatti ad alcuni degli altri algoritmi che discuteremo in questo corso.

Verifica la tua comprensione

Si consideri un'hamiltoniana su quattro qubit che contenga i termini:

IIXX, IIXZ, IIZZ, IZXZ, IXXZ, ZZXZ, XZXZ, ZIXZ, ZZZZ, XXXX

Si desidera ordinare questi termini in gruppi, in modo che tutti i termini di un gruppo possano essere misurati contemporaneamente. Qual è il numero più piccolo di gruppi che si possono creare in modo che tutti i termini siano considerati?

  • Si può fare in 4 gruppi. Si noti che tali soluzioni, in genere, non sono univoche.

    IIXX, XXXX, IIZZ, ZZZZ

    IIXZ, IZXZ, ZIXZ, ZZXZ

    IXXZ

    XZXZ

Secondo te, cosa rende solitamente difficile la chimica quantistica con il VQE: il numero di termini nell'Hamiltoniano o la ricerca di un buon ansatz?

  • È emerso che esistono ansätze altamente ottimizzate per i contesti chimici. Il numero di termini nell'hamiltoniana e quindi il numero di misure richieste causano tipicamente più problemi.


3. Esempio di hamiltoniano

Mettiamo in pratica questo algoritmo utilizzando una piccola matrice hamiltoniana, in modo da poter vedere cosa succede in ogni fase. Utilizzeremo il framework di modelli Qiskit:

  • Fase 1 : mappare il problema in circuiti e operatori quantistici - Fase 2 : Ottimizzazione per l'hardware di destinazione - Fase 3 : Esecuzione sull'hardware di destinazione - Fase 4 : Postelaborazione dei risultati

3.1 Fase 1: Mappare il problema su circuiti quantistici e operatori

Utilizzeremo quella definita in precedenza nel contesto della chimica. Iniziamo con alcune importazioni generali.

# General imports
import numpy as np

# SciPy minimizer routine
from scipy.optimize import minimize

# Plotting functions
import matplotlib.pyplot as plt

Anche in questo caso, assumiamo che l'hamiltoniana di interesse sia nota. In questo caso utilizzeremo un'hamiltoniana estremamente piccola, perché altri metodi discussi in questo corso saranno più efficienti per risolvere problemi più grandi.

from qiskit.quantum_info import SparsePauliOp
import numpy as np

hamiltonian = SparsePauliOp.from_list(
    [("YZ", 0.3980), ("ZI", -0.3980), ("ZZ", -0.0113), ("XX", 0.1810)]
)

A = np.array(hamiltonian)
eigenvalues, eigenvectors = np.linalg.eigh(A)
print("The ground state energy is ", min(eigenvalues))

Output:

The ground state energy is  -0.702930394459531

In Qiskit è possibile scegliere tra numerosi ansatz prefabbricati. Utilizzeremo efficient_su2.

# Pre-defined ansatz circuit and operator class for Hamiltonian
from qiskit.circuit.library import efficient_su2

# Note that it is more common to place initial 'h' gates outside the ansatz.
# Here we specifically wanted this layer structure.
ansatz = efficient_su2(
    hamiltonian.num_qubits, su2_gates=["h", "rz", "y"], entanglement="circular", reps=1
)

num_params = ansatz.num_parameters
print("This circuit has ", num_params, "parameters")

ansatz.decompose().draw("mpl", style="iqp")

Output:

This circuit has  4 parameters
Output of the previous code cell

Ansätze diverse avranno strutture di entangling diverse e porte di rotazione diverse. Quello mostrato qui utilizza porte CNOT per l'entangling e porte Y e porte RZ parametrizzate per le rotazioni. Si noti la dimensione di questo spazio dei parametri; significa che dobbiamo minimizzare la funzione di costo su 4 variabili (i parametri per le porte RZ). Questo può essere incrementato, ma non all'infinito. Eseguendo un problema simile su 4 qubit, utilizzando le 3 ripetizioni predefinite per efficient_su2 si ottengono 16 parametri variazionali.

3.2 Passaggio 2: Ottimizzazione per l'hardware di destinazione

L'ansatz è stato scritto utilizzando porte già note, ma il nostro circuito deve essere trasposto per utilizzare le porte di base che possono essere implementate in ogni computer quantistico. Selezioniamo il backend meno trafficato.

# runtime imports
from qiskit_ibm_runtime import QiskitRuntimeService, Session
from qiskit_ibm_runtime import EstimatorV2 as Estimator

# To run on hardware, select the backend with the fewest number of jobs in the queue
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

print(backend)

Output:

<IBMBackend('ibm_torino')>

Possiamo ora transpilare il nostro circuito per questo hardware e visualizzare l'ansatz transpilato.

from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

ansatz_isa = pm.run(ansatz)

ansatz_isa.draw(output="mpl", idle_wires=False, style="iqp")

Output:

Output of the previous code cell

Si noti che le porte utilizzate sono cambiate e che i qubit del nostro circuito astratto sono stati mappati in qubit di numero diverso sul computer quantistico. Affinché i nostri risultati siano significativi, dobbiamo mappare la nostra hamiltoniana in modo identico.

hamiltonian_isa = hamiltonian.apply_layout(layout=ansatz_isa.layout)

3.3 Fase 3: Esecuzione sull'hardware di destinazione

3.3.1 Segnalazione dei valori

Qui definiamo una funzione di costo che prende come argomenti le strutture che abbiamo costruito nei passaggi precedenti: i parametri, l'ansatz e l'hamiltoniano. Utilizza anche Estimator, che non abbiamo ancora definito. Inseriamo del codice per tracciare l'andamento della nostra funzione di costo, in modo da poter verificare il comportamento di convergenza.

def cost_func(params, ansatz, hamiltonian, estimator):
    """Return estimate of energy from Estimator

    Parameters:
        params (ndarray): Array of ansatz parameters
        ansatz (QuantumCircuit): Parameterized ansatz circuit
        hamiltonian (SparsePauliOp): Operator representation of Hamiltonian
        estimator (EstimatorV2): Estimator primitive instance
        cost_history_dict: Dictionary for storing intermediate results

    Returns:
        float: Energy estimate
    """
    pub = (ansatz, [hamiltonian], [params])
    result = estimator.run(pubs=[pub]).result()
    energy = result[0].data.evs[0]

    cost_history_dict["iters"] += 1
    cost_history_dict["prev_vector"] = params
    cost_history_dict["cost_history"].append(energy)
    print(f"Iters. done: {cost_history_dict['iters']} [Current cost: {energy}]")

    return energy


cost_history_dict = {
    "prev_vector": None,
    "iters": 0,
    "cost_history": [],
}

È molto vantaggioso poter scegliere i valori dei parametri iniziali in base alla conoscenza del problema in questione e delle caratteristiche dello stato di destinazione. Non faremo alcuna ipotesi su tale conoscenza e utilizzeremo valori iniziali casuali.

x0 = 2 * np.pi * np.random.random(num_params)
# This required 13 min, 20 s QPU time on an Eagle processor, 28 min total time.
with Session(backend=backend) as session:
    estimator = Estimator(mode=session)
    estimator.options.default_shots = 10000

    res = minimize(
        cost_func,
        x0,
        args=(ansatz_isa, hamiltonian_isa, estimator),
        method="cobyla",
        options={"maxiter": 50},
    )

Output:

Iters. done: 1 [Current cost: 0.010575798722044727]
Iters. done: 2 [Current cost: 0.004040015974440895]
Iters. done: 3 [Current cost: 0.0020213258785942503]
Iters. done: 4 [Current cost: 0.18723082446726014]
Iters. done: 5 [Current cost: -0.2746792152068885]
Iters. done: 6 [Current cost: -0.3094547651648519]
Iters. done: 7 [Current cost: -0.05281985428356641]
Iters. done: 8 [Current cost: 0.00808560303514377]
Iters. done: 9 [Current cost: -0.0014821685303514388]
Iters. done: 10 [Current cost: -0.004759824281150161]
Iters. done: 11 [Current cost: 0.09942328705995292]
Iters. done: 12 [Current cost: 0.01092366214057508]
Iters. done: 13 [Current cost: 0.05017497496069776]
Iters. done: 14 [Current cost: 0.13028868414310696]
Iters. done: 15 [Current cost: 0.013747803514376994]
Iters. done: 16 [Current cost: 0.2583072432944498]
Iters. done: 17 [Current cost: -0.14422125655131562]
Iters. done: 18 [Current cost: -0.0004950150347678081]
Iters. done: 19 [Current cost: 0.00681082268370607]
Iters. done: 20 [Current cost: -0.0023377795527156544]
Iters. done: 21 [Current cost: 0.6027665591169237]
Iters. done: 22 [Current cost: 0.00596641373801917]
Iters. done: 23 [Current cost: -0.008318769968051117]
Iters. done: 24 [Current cost: -0.00026683306709265246]
Iters. done: 25 [Current cost: -0.007648222843450479]
Iters. done: 26 [Current cost: 0.004121086261980831]
Iters. done: 27 [Current cost: -0.004075019968051117]
Iters. done: 28 [Current cost: -0.004419369009584665]
Iters. done: 29 [Current cost: 0.213185460054037]
Iters. done: 30 [Current cost: -0.06505919572162797]
Iters. done: 31 [Current cost: -0.5334241316590271]
Iters. done: 32 [Current cost: 0.00218370607028754]
Iters. done: 33 [Current cost: 0.09579352143666908]
Iters. done: 34 [Current cost: -0.009274800319488819]
Iters. done: 35 [Current cost: -0.44395141360688106]
Iters. done: 36 [Current cost: 0.011747104632587858]
Iters. done: 37 [Current cost: -0.003344149361022364]
Iters. done: 38 [Current cost: 0.19138183916486304]
Iters. done: 39 [Current cost: 0.013513931813145209]

Possiamo esaminare i risultati grezzi.

res

Output:

 message: Return from COBYLA because the trust region radius reaches its lower bound.
 success: True
  status: 0
     fun: -0.5334241316590271
       x: [ 1.024e+00  6.459e+00  3.625e+00  4.007e+00]
    nfev: 39
   maxcv: 0.0

3.4 Fase 4: Post-elaborazione dei risultati

Se la procedura termina correttamente, i valori del nostro dizionario devono essere uguali rispettivamente al vettore delle soluzioni e al numero totale di valutazioni della funzione. È facile da verificare:

cost_history_dict

Output:

{'prev_vector': array([1.02397956, 6.45886604, 3.62479262, 4.00744128]),
 'iters': 39,
 'cost_history': [np.float64(0.010575798722044727),
  np.float64(0.004040015974440895),
  np.float64(0.0020213258785942503),
  np.float64(0.18723082446726014),
  np.float64(-0.2746792152068885),
  np.float64(-0.3094547651648519),
  np.float64(-0.05281985428356641),
  np.float64(0.00808560303514377),
  np.float64(-0.0014821685303514388),
  np.float64(-0.004759824281150161),
  np.float64(0.09942328705995292),
  np.float64(0.01092366214057508),
  np.float64(0.05017497496069776),
  np.float64(0.13028868414310696),
  np.float64(0.013747803514376994),
  np.float64(0.2583072432944498),
  np.float64(-0.14422125655131562),
  np.float64(-0.0004950150347678081),
  np.float64(0.00681082268370607),
  np.float64(-0.0023377795527156544),
  np.float64(0.6027665591169237),
  np.float64(0.00596641373801917),
  np.float64(-0.008318769968051117),
  np.float64(-0.00026683306709265246),
  np.float64(-0.007648222843450479),
  np.float64(0.004121086261980831),
  np.float64(-0.004075019968051117),
  np.float64(-0.004419369009584665),
  np.float64(0.213185460054037),
  np.float64(-0.06505919572162797),
  np.float64(-0.5334241316590271),
  np.float64(0.00218370607028754),
  np.float64(0.09579352143666908),
  np.float64(-0.009274800319488819),
  np.float64(-0.44395141360688106),
  np.float64(0.011747104632587858),
  np.float64(-0.003344149361022364),
  np.float64(0.19138183916486304),
  np.float64(0.013513931813145209)]}
fig, ax = plt.subplots()
x = np.linspace(0, 10, 50)

# Define the constant function
constant = -0.7029
y_constant = np.full_like(x, constant)
ax.plot(
    range(cost_history_dict["iters"]), cost_history_dict["cost_history"], label="VQE"
)
ax.set_xlabel("Iterations")
ax.set_ylabel("Cost")
ax.plot(y_constant, label="Target")
plt.legend()
plt.draw()

Output:

Output of the previous code cell

IBM Quantum ha altre offerte di aggiornamento relative alla VQE. Se siete pronti a mettere in pratica il VQE, consultate il nostro tutorial: Stima dell'energia allo stato limite della catena di Heisenberg con VQE. Se volete maggiori informazioni sulla creazione di hamiltoniani molecolari, consultate questa lezione del nostro corso sulla chimica quantistica con VQE. Se siete interessati ad approfondire il funzionamento di algoritmi variazionali come il VQE, vi consigliamo il corso Variational Algorithm Design.

Verifica la tua comprensione

In questa sezione abbiamo calcolato l'energia dello stato fondamentale a partire da un'hamiltoniana. Se volessimo applicarlo, ad esempio, alla determinazione della geometria di una molecola, come potremmo estenderlo?

  • Dovremmo introdurre variabili per la spaziatura interatomica e gli angoli tra i legami. Dovremmo variare questi elementi. Per ogni variazione di queste, produrremmo una nuova Hamiltoniana (poiché gli operatori che descrivono l'energia dipendono certamente dalla geometria). Per ogni Hamiltoniana prodotta e mappata sui qubit, dovremmo effettuare un'ottimizzazione come quella fatta sopra. Di tutti questi problemi di ottimizzazione convergenti, la geometria che produce l'energia più bassa sarebbe quella adottata dalla natura. Si tratta di una procedura un po' più complessa di quella illustrata sopra. Tale calcolo viene effettuato per la molecola più semplice, H2\text{H}_2, qui.


4. Il rapporto tra VQE e altri metodi

In questa sezione esamineremo i vantaggi e gli svantaggi dell'approccio VQE originale e sottolineeremo le sue relazioni con altri algoritmi più recenti.

4.1 I punti di forza e i punti deboli del VQE

Alcuni punti di forza sono già stati evidenziati. Tra di essi ricordiamo:

  • Adattabilità all'hardware moderno: Alcuni algoritmi quantistici richiedono tassi di errore molto più bassi, avvicinandosi alla tolleranza ai guasti su larga scala. La VQE non lo fa; può essere implementata sugli attuali computer quantistici.
  • Circuiti poco profondi: Il VQE spesso impiega circuiti quantistici relativamente poco profondi. Ciò rende il VQE meno suscettibile agli errori accumulati dai gate e lo rende adatto a molte tecniche di mitigazione degli errori. Naturalmente, i circuiti non sono sempre poco profondi; ciò dipende dall'ansatz utilizzato.
  • Versatilità: Il VQE può essere applicato (in linea di principio) a qualsiasi problema che possa essere trasformato in un problema di autovalori/autovettori. Ci sono molti avvertimenti che rendono la VQE impraticabile o svantaggiosa per alcuni problemi. Alcuni di questi sono riassunti di seguito.

Alcuni punti deboli della VQE e i problemi per i quali non è praticabile sono stati descritti in precedenza. Queste release includono:

  • Natura euristica: Il VQE non garantisce la convergenza all'energia corretta dello stato fondamentale, poiché le sue prestazioni dipendono dalla scelta dell'ansatz e dei metodi di ottimizzazione [1-2]. Se si sceglie un'ansatz povera, che manca dell'entanglement richiesto per lo stato fondamentale desiderato, nessun ottimizzatore classico può raggiungere tale stato fondamentale.
  • Parametri potenzialmente numerosi: Un'ansatz molto espressiva può avere così tanti parametri che le iterazioni di minimizzazione richiedono molto tempo.
  • Elevato sovraccarico di calcolo: nel VQE, si utilizza l'Estimator per stimare il valore atteso di ciascun termine dell'Hamiltoniano. La maggior parte degli Hamiltoniani di interesse conterrà termini che non possono essere stimati contemporaneamente. Ciò può rendere VQE particolarmente esigente in termini di risorse per sistemi di grandi dimensioni con hamiltoniani complessi [1].
  • Effetti del rumore: Quando l'ottimizzatore classico è alla ricerca di un minimo, i calcoli rumorosi possono confonderlo e allontanarlo dal vero minimo o ritardarne la convergenza. Una possibile soluzione è quella di sfruttare le più avanzate tecniche di mitigazione e soppressione degli errori [2-3] di IBM.
  • Altopiani sterili: Queste regioni di gradienti che svaniscono [2-3] esistono anche in assenza di rumore, ma il rumore le rende più problematiche poiché la variazione dei valori di aspettativa dovuta al rumore potrebbe essere maggiore della variazione dovuta all'aggiornamento dei parametri in queste regioni sterili.

4.2 Relazione con altri approcci

Adattamento VQE

L'algoritmo ADAPT-VQE (Adaptive Derivative-Assembled Pseudo-Trotter Variational Quantum Eigensolver) è un miglioramento dell'algoritmo VQE originale, progettato per migliorare l'efficienza, l'accuratezza e la scalabilità delle simulazioni quantistiche, in particolare nella chimica quantistica.

L'algoritmo VQE originale descritto in questa lezione utilizza un'ansatz predefinita e fissa per approssimare lo stato fondamentale del sistema. Nel nostro caso, abbiamo utilizzato efficient_su2, con una singola ripetizione, utilizzando le porte di rotazione Y e RZ. Sebbene i parametri delle porte RZ siano cambiati, la struttura di questo ansatz e le porte utilizzate non sono cambiate.

ADAPT-VQE affronta i limiti di VQE attraverso la costruzione di ansatz adattivi. Invece di partire da un'ansatz fissa, ADAPT-VQE costruisce dinamicamente l'ansatz in modo iterativo. A ogni passo, seleziona l'operatore da un pool predefinito (come gli operatori di eccitazione fermionica) che ha il gradiente maggiore rispetto all'energia. In questo modo si garantisce che vengano aggiunti solo gli operatori di maggiore impatto, ottenendo un'ansatz compatta ed efficiente [4-6]. Questo approccio può avere diversi effetti benefici:

  1. Riduzione della profondità del circuito : Facendo crescere l'ansatz in modo incrementale e concentrandosi solo sugli operatori necessari, ADAPT-VQE riduce al minimo le operazioni di gate rispetto agli approcci VQE tradizionali [5,7].
  2. Accuratezza migliorata : La natura adattiva consente ad ADAPT-VQE di recuperare più energia di correlazione a ogni passo, rendendolo particolarmente efficace per i sistemi fortemente correlati in cui il VQE tradizionale fatica [8,9].
  3. Scalabilità e robustezza al rumore : L'ansatz compatto riduce l'accumulo di errori di porta, riduce l'overhead computazionale e limita il numero di parametri variazionali che devono essere minimizzati.

ADAPT-VQE non è ancora perfetto. In alcuni casi può rimanere intrappolato o rallentato da minimi locali e può soffrire di un'eccessiva parametrizzazione. Può anche essere piuttosto impegnativo dal punto di vista delle risorse, poiché richiede il calcolo dei gradienti e l'ottimizzazione dei parametri con molte strutture di gate.

Stima della fase quantistica (QPE)

Il QPE ha uno scopo simile al VQE, ma è molto diverso nella sua implementazione. La QPE richiede computer quantistici con tolleranza ai guasti a causa dei circuiti quantistici generalmente profondi e dell'elevato livello di coerenza richiesto. Una volta implementato, il QPE sarà più preciso del VQE. Un modo per descrivere la differenza è la precisione in funzione della profondità del circuito. Il QPE raggiunge la precisione ϵ\epsilon con profondità di circuito scalabili come O(1/ϵ)O(1/\epsilon) [10]. Il VQE richiede O(1/ϵ2)O(1/\epsilon^2) campioni per ottenere la stessa precisione [10,11].

Krylov, SQD, QSCI e altri in questo corso

Il VQE ha contribuito a stabilire algoritmi quantistici che dipendono ancora dai computer classici, non solo per il funzionamento del computer quantistico, ma anche per parti sostanziali dell'algoritmo. Diversi algoritmi di questo tipo sono oggetto del resto del corso. Qui di seguito ne spieghiamo brevemente alcuni, semplicemente per confrontarli con la VQE. Saranno spiegati in modo molto più dettagliato nelle lezioni successive.

Diagonalizzazione quantistica di Krylov (KQD)

I metodi dei sottospazi di Krylov consentono di proiettare una matrice su un sottospazio per ridurne la dimensione e renderla più maneggevole, mantenendo le caratteristiche più importanti. Un trucco di questo metodo consiste nel generare un sottospazio che mantenga queste caratteristiche; si scopre che la generazione di questo sottospazio è strettamente correlata a un metodo consolidato sui computer quantistici chiamato Trotterizzazione.

Esistono alcune varianti dei metodi di Krylov quantistici, ma in generale l'approccio è quello:

  • Utilizzare il computer quantistico per generare un sottospazio (il sottospazio di Krylov) attraverso la trotterizzazione
  • Proiettare la matrice di interesse su tale sottospazio di Krylov
  • Diagonalizzare la nuova Hamiltoniana proiettata utilizzando un computer classico

Diagonalizzazione quantistica basata sul campionamento (SQD)

La diagonalizzazione quantistica basata sul campionamento (SQD) è correlata al metodo di Krylov in quanto cerca di ridurre la dimensione di una matrice da diagonalizzare preservandone le caratteristiche principali. SQD si comporta nel modo seguente:

  • Iniziare con un'ipotesi iniziale per lo stato fondamentale e preparare il sistema in tale stato.
  • Utilizzare Sampler per campionare le stringhe di bit che compongono questo stato.
  • Utilizzare la collezione di stati base computazionali del campionatore come sottospazio su cui proiettare la matrice di interesse.
  • Diagonalizzare la matrice proiettata più piccola utilizzando un computer classico.

È correlato al VQE in quanto sfrutta l'informatica classica e quantistica per componenti sostanziali dell'algoritmo. Entrambi condividono anche il requisito di preparare una buona ipotesi iniziale o ansatz. Ma la distribuzione del lavoro tra i computer classici e quantistici in SQD è più simile a quella del metodo di Krylov.

In effetti, il metodo di Krylov e la SQD sono stati recentemente combinati nel metodo della diagonalizzazione quantistica di Krylov basata sul campionamento (SKQD) [12].

Interazione di configurazione del sottospazio quantistico

La Quantum Selected Configuration Interaction (QSCI) [13] è un algoritmo che produce uno stato fondamentale approssimato di un'hamiltoniana campionando una funzione d'onda di prova per identificare gli stati base significativi per generare un sottospazio per una diagonalizzazione classica. Sia SQD che QSCI utilizzano un computer quantistico per costruire un sottospazio ridotto. L'ulteriore punto di forza del QSCI è la preparazione degli stati, soprattutto nel contesto dei problemi di chimica. Sfrutta varie strategie, come l'utilizzo di stati evoluti nel tempo [14] e una serie di ansätze ispirate alla chimica. Concentrandosi su una preparazione efficiente degli stati, il QSCI riduce i costi di calcolo quantistico per gli hamiltoniani chimici, mantenendo un'elevata fedeltà e sfruttando la robustezza del rumore delle tecniche di campionamento degli stati quantistici [15]. QSCI offre anche una tecnica di costruzione adattiva che fornisce più ansätze per un risultato migliore.

Il flusso di lavoro predefinito di QSCI per il problema della chimica è il seguente:

  • Costruire l'hamiltoniana molecolare con il software prescelto (ad esempio SciPy ).
  • Preparare un algoritmo QSCI selezionando uno stato iniziale appropriato e un'ipotesi ispirata alla chimica con un insieme di parametri preselezionati.
  • Campionare gli stati base significativi e diagonalizzare l'hamiltoniana utilizzando un computer classico per ottenere l'energia dello stato fondamentale.
  • Spesso si ricorre al recupero della configurazione [16] e alla post-selezione di simmetria [15] come tecniche di post-elaborazione.
  • Opzionalmente, il flusso di lavoro di QSCI adattivo prevede un ulteriore ciclo di ottimizzazione da step2 a step3, utilizzando più ansätze con stati iniziali casuali.

Verifica la tua comprensione

Cosa ha in comune il VQE con tutti gli altri metodi sopra elencati (ad eccezione del QPE, che non è descritto in modo approfondito)?

  • Tutti implicano uno stato di prova o una funzione d'onda di qualche tipo. Tutti funzionano al meglio quando l'ipotesi iniziale per questo stato di prova è eccellente.

    Un'altra risposta corretta è che sono tutti più facili da implementare quando l'hamiltoniana è facile da misurare (può essere ordinata in un numero relativamente basso di gruppi di operatori di Pauli commutanti).

Che cosa ha in comune la VQE con nessuno degli altri metodi sopra elencati?

  • Ottimizzatori classici. Nessuno degli altri utilizza algoritmi di ottimizzazione classici per selezionare i parametri variazionali.


Riferimenti

[2] https://en.wikipedia.org/wiki/Variational\risolutore_quantistico_di_eigeni

[3] https://journals.aps.org/prapplied/abstract/10.1103/PhysRevApplied.19.024047

[4] https://arxiv.org/abs/2111.05176

[6] https://inquanto.quantinuum.com/tutorials/InQ_tut_fe4n2_2.html

[7] https://www.nature.com/articles/s41467-019-10988-2

[8] https://arxiv.org/abs/2210.15438

[9] https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.013254

[10] https://arxiv.org/html/2403.09624v1

[11] https://www.nature.com/articles/s42005-023-01312-y

[13] https://arxiv.org/abs/1802.00171

[14] https://arxiv.org/abs/2103.08505

[15] https://arxiv.org/html/2501.09702v1

[16] https://quri-sdk.qunasys.com/docs/examples/quri-algo-vm/qsci/

[17] https://arxiv.org/abs/2412.13839

[18] https://arxiv.org/abs/2302.11320v1

[19] https://arxiv.org/pdf/2405.05068v1

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.