Vai al contenuto principale

Stati di riferimento

In questa lezione esploreremo come inizializzare il nostro sistema con uno stato di riferimento per aiutare il nostro algoritmo variazionale a convergere più rapidamente. Prima impareremo a costruire manualmente uno stato di riferimento, poi esploreremo diverse opzioni standard utilizzabili in un algoritmo variazionale.

Diagramma delle opzioni per gli stati di riferimento: predefinito, specifico per applicazione e quantistico.

Stato predefinito

Uno stato di riferimento indica il punto di partenza fisso e iniziale per il nostro problema. Per preparare uno stato di riferimento, dobbiamo applicare l'unitario non parametrizzato appropriato URU_R all'inizio del nostro circuito quantistico, in modo che ρ=UR0|\rho\rangle = U_R |0\rangle. Se hai un'ipotesi ragionata o un valore di partenza proveniente da una soluzione ottimale già nota, l'algoritmo variazionale convergerà probabilmente più in fretta se lo usi come punto di partenza.

Lo stato di riferimento più semplice possibile è lo stato predefinito, in cui si utilizza lo stato iniziale di un circuito quantistico a nn qubit: 0n|0\rangle^{\otimes n}. Per lo stato predefinito, l'operatore unitario è URIU_R \equiv I. Grazie alla sua semplicità, lo stato predefinito è uno stato di riferimento valido e utilizzato in molti scenari.

Stato di riferimento classico

Supponiamo di avere un sistema a tre qubit e di voler partire dallo stato 001|001\rangle invece dello stato predefinito 000|000\rangle. Questo è un esempio di stato di riferimento puramente classico: per costruirlo, è sufficiente applicare un gate X al qubit 00 (seguendo l'ordinamento dei qubit di Qiskit), poiché 001=X0000|001\rangle = X_0 |000\rangle.

In questo caso, l'operatore unitario è URX0U_R \equiv X_0, che produce lo stato di riferimento ρ001|\rho\rangle \equiv |001\rangle.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.x(0)

qc.draw("mpl")

Output of the previous code cell

Stato di riferimento quantistico

Supponiamo di voler partire da uno stato più complesso che coinvolga sovrapposizione e/o entanglement, come 12(100+111)\frac{1}{\sqrt{2}}(|100\rangle+|111\rangle).

Per ottenere questo stato a partire da 000|000\rangle, un approccio possibile è applicare un gate di Hadamard al qubit 00 (H0H_0), un gate CNOT (CX) con il qubit 00 come qubit di controllo e il qubit 11 come qubit target (CNOT01CNOT_{01}), e infine un gate XX applicato al qubit 22 (X2X_2).

In questo scenario, l'operatore unitario è URX2CNOT01H0000U_{R} \equiv X_2CNOT_{01}H_0|000\rangle e lo stato di riferimento è ρ12(100+111)|\rho\rangle \equiv \frac{1}{\sqrt{2}}(|100\rangle+|111\rangle).

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.x(2)

qc.draw("mpl")

Output of the previous code cell

Costruire stati di riferimento con circuiti template

Possiamo anche usare vari circuiti template, come TwoLocal, che permette di esprimere con facilità molteplici parametri regolabili ed entanglement. Tratteremo questi circuiti template in modo più dettagliato nella prossima lezione, ma possiamo usarli per i nostri stati di riferimento a condizione di fissare i parametri:

from qiskit.circuit.library import TwoLocal
from math import pi

reference_circuit = TwoLocal(2, "rx", "cz", entanglement="linear", reps=1)
theta_list = [pi / 2, pi / 3, pi / 3, pi / 2]

reference_circuit = reference_circuit.assign_parameters(theta_list)

reference_circuit.decompose().draw("mpl")

Output of the previous code cell

Stati di riferimento specifici per applicazione

Machine learning quantistico

Nel contesto di un classificatore quantistico variazionale (VQC), i dati di addestramento vengono codificati in uno stato quantistico tramite un circuito parametrizzato noto come feature map, in cui ogni valore di parametro rappresenta un punto del dataset di addestramento. La zz_feature_map è un tipo di circuito parametrizzato che può essere utilizzato per passare i nostri punti dati (xx) a questa feature map.

from qiskit.circuit.library import zz_feature_map

data = [0.1, 0.2]

zz_feature_map_reference = zz_feature_map(feature_dimension=2, reps=2)
zz_feature_map_reference = zz_feature_map_reference.assign_parameters(data)
zz_feature_map_reference.decompose().draw("mpl")

Output of the previous code cell

Riepilogo

Con questa lezione hai imparato a inizializzare il tuo sistema usando:

  • Stato di riferimento predefinito
  • Stati di riferimento classici
  • Stati di riferimento quantistici
  • Stati di riferimento specifici per applicazione

Il nostro carico di lavoro variazionale ad alto livello si presenta come segue:

Diagramma di un circuito con un operatore unitario che prepara uno stato di riferimento.

Mentre gli stati di riferimento sono punti di partenza fissi, possiamo usare una forma variazionale per definire un ansatz che rappresenti una collezione di stati parametrizzati che il nostro algoritmo variazionale andrà ad esplorare.