Optimierungsschleifen
In dieser Lektion werden wir lernen, wie man einen Optimierer verwendet, um die parametrisierten Quantenzustände unseres Ansatzes iterativ zu untersuchen:
- Bootstrap einer Optimierungsschleife
- Verstehen von Kompromissen bei der Verwendung lokaler und globaler Optimierer
- Erforschen Sie unfruchtbare Plateaus und wie Sie sie vermeiden können
Auf einer hohen Ebene sind Optimierer von zentraler Bedeutung für die Erkundung unseres Suchraums. Der Optimierer verwendet Kostenfunktionsbewertungen, um den nächsten Satz von Parametern in einer Variationsschleife auszuwählen, und wiederholt den Prozess, bis er einen stabilen Zustand erreicht. In diesem Stadium wird ein optimaler Satz von Parameterwerten zurückgegeben.
Lokale und globale Optimierer
Wir werden zunächst unser Problem aufstellen, bevor wir die einzelnen Optimierungsklassen untersuchen. Wir beginnen mit einer Schaltung, die acht Variationsparameter enthält:
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.circuit.library import TwoLocal
import numpy as np
theta_list = (2 * np.pi * np.random.rand(1, 8)).tolist()
observable = SparsePauliOp.from_list([("XX", 1), ("YY", -3)])
reference_circuit = QuantumCircuit(2)
reference_circuit.x(0)
variational_form = TwoLocal(
2,
rotation_blocks=["rz", "ry"],
entanglement_blocks="cx",
entanglement="linear",
reps=1,
)
ansatz = reference_circuit.compose(variational_form)
ansatz.decompose().draw("mpl")Output:
def cost_func_vqe(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 (Estimator): Estimator primitive instance
Returns:
float: Energy estimate
"""
pub = (ansatz, hamiltonian, params)
cost = estimator.run([pub]).result()[0].data.evs
return costfrom qiskit.primitives import StatevectorEstimator
estimator = StatevectorEstimator()Lokale Optimierer
Lokale Optimierer suchen nach einem Punkt, der die Kostenfunktion minimiert, beginnend mit einem oder mehreren Anfangspunkten und bewegen sich in aufeinanderfolgenden Iterationen zu verschiedenen Punkten, je nachdem, was sie in der Region, die sie gerade bewerten, beobachten. Dies bedeutet, dass die Konvergenz dieser Algorithmen in der Regel schnell ist, aber stark vom Ausgangspunkt abhängen kann. Lokale Optimierer sind nicht in der Lage, über die Region, in der sie bewerten, hinauszuschauen, und können besonders anfällig für lokale Minima sein, indem sie Konvergenz melden, wenn sie eines finden, und andere Zustände mit günstigeren Bewertungen ignorieren.
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="SLSQP"
)
resultOutput:
message: Optimization terminated successfully
success: True
status: 0
fun: -3.9999999964520634
x: [ 1.000e+00 1.000e+00 -1.571e+00 -4.556e-05 -1.207e+00
-1.935e+00 4.079e-01 -4.079e-01]
nit: 12
jac: [ 0.000e+00 0.000e+00 -7.957e-04 2.543e-04 1.381e-03
1.381e-03 5.430e-04 5.431e-04]
nfev: 112
njev: 12
Globale Optimierer
Globale Optimierer suchen nach dem Punkt, der die Kostenfunktion über mehrere Regionen ihres Bereichs minimiert (d.h. nicht lokal), indem sie diese iterativ (d.h. bei der Iteration ) über einen vom Optimierer festgelegten Satz von Parametervektoren auswerten. Dadurch sind sie weniger anfällig für lokale Minima und einigermaßen unabhängig von der Initialisierung, konvergieren aber auch deutlich langsamer zu einer vorgeschlagenen Lösung.
Bootstrapping-Optimierung
Bootstrapping, d. h. die Festlegung der Anfangswerte für die Parameter auf der Grundlage einer vorherigen Optimierung, kann unserem Optimierer helfen, schneller zu einer Lösung zu konvergieren. Wir bezeichnen dies als den Anfangspunkt und als den Anfangszustand. Dieser Ausgangszustand unterscheidet sich von unserem Referenzzustand , da ersterer sich auf die Anfangsparameter konzentriert, die während unserer Optimierungsschleife festgelegt werden, während letzterer sich auf die Verwendung bekannter "Referenz"-Lösungen konzentriert. Sie können übereinstimmen, wenn (d.h. die Identitätsoperation).
Wenn lokale Optimierer zu nicht-optimalen lokalen Minima konvergieren, können wir versuchen, die Optimierung global zu booten und die Konvergenz lokal zu verfeinern. Dies erfordert zwar die Einrichtung von zwei Variationsrechnungen, ermöglicht es dem Optimierer jedoch, eine optimalere Lösung zu finden als der lokale Optimierer allein.
Gradientenbasierte und gradientenfreie Optimierer
Gradientenbasiert
Wenn wir für unsere Kostenfunktion den Gradienten der Funktion ausgehend von einem Anfangspunkt kennen, ist die einfachste Art, die Funktion zu minimieren, die Aktualisierung der Parameter in Richtung des steilsten Abstiegs der Funktion. Das heißt, wir aktualisieren die Parameter mit , wobei die Lernrate ist - eine kleine, positive Ein Hyperparameter ist ein Parameter, den wir zur Steuerung unseres Algorithmus verwenden. Der Begriff Hyper unterscheidet ihn von den Parametern (θ), die unser Algorithmus zu finden versucht., die die Größe der Aktualisierung steuert. Wir fahren damit fort, bis wir zu einer Ein lokales Minimum ist der niedrigste Punkt der Funktion für einen kleinen Wertebereich von Theta. Im Gegensatz dazu ist ein globales Minimum der niedrigste Punkt irgendwo in unserer Funktion (d. h. für jeden Wert von θ). der Kostenfunktion konvergieren, .
Mit dieser Kostenfunktion und einem Optimierer können wir die optimalen Parameter berechnen
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="BFGS"
)
resultOutput:
message: Optimization terminated successfully.
success: True
status: 0
fun: -3.9999999999997025
x: [ 1.000e+00 1.000e+00 1.571e+00 3.220e-07 2.009e-01
-2.009e-01 6.342e-01 -6.342e-01]
nit: 14
jac: [-1.192e-07 -2.980e-08 8.345e-07 1.103e-06 5.960e-08
0.000e+00 -5.960e-08 2.980e-08]
hess_inv: [[ 1.000e+00 1.872e-10 ... 5.077e-05 3.847e-05]
[ 1.872e-10 1.000e+00 ... -5.208e-05 -4.060e-05]
...
[ 5.077e-05 -5.208e-05 ... 7.243e-01 -2.604e-01]
[ 3.847e-05 -4.060e-05 ... -2.604e-01 8.179e-01]]
nfev: 144
njev: 16
Die Hauptnachteile dieser Art von Optimierung sind die Konvergenzgeschwindigkeit, die sehr langsam sein kann, und die Tatsache, dass es keine Garantie für das Erreichen der optimalen Lösung gibt.
Gradientenfrei
Gradientenfreie Optimierungsalgorithmen benötigen keine Gradienteninformationen und können in Situationen nützlich sein, in denen die Berechnung des Gradienten schwierig, teuer oder zu verrauscht ist. Sie sind auch robuster bei der Suche nach globalen Optima, während gradientenbasierte Methoden dazu neigen, zu lokalen Optima zu konvergieren. Wir werden einige Fälle untersuchen, in denen ein gradientenfreier Optimierer helfen kann, unfruchtbare Plateaus zu vermeiden. Allerdings erfordern gradientenfreie Verfahren einen höheren Rechenaufwand, insbesondere bei Problemen mit hochdimensionalen Suchräumen.
Hier ist ein Beispiel, das den COBYLA optimierer verwendet:
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="COBYLA"
)
resultOutput:
message: Optimization terminated successfully.
success: True
status: 1
fun: -3.999999973369678
x: [ 1.631e+00 1.492e+00 1.571e+00 3.142e+00 1.375e+00
-1.767e+00 1.484e+00 1.658e+00]
nfev: 137
maxcv: 0.0
Karge Hochebenen
In der Tat kann die Kostenlandschaft recht kompliziert sein, wie die Hügel und Täler im folgenden Beispiel zeigen. Die Optimierungsmethode navigiert uns durch die Kostenlandschaft und sucht nach dem Minimum, wie durch die schwarzen Punkte und Linien dargestellt. Wir können sehen, dass zwei der drei Suchen in einem lokalen Minimum der Landschaft enden, anstatt in einem globalen.
Unabhängig von der Art der verwendeten Optimierungsmethode kann es für die Methode schwierig sein, die geeignete Suchrichtung zu bestimmen, wenn die Kostenlandschaft relativ flach ist. Dieses Szenario wird als Wenn die Gradienten parametrisierter Quantenschaltungen im Verhältnis zur Anzahl der Qubits exponentiell klein werden, wird die Optimierung schwierig und möglicherweise unmöglich. bezeichnet, bei dem die Kostenlandschaft immer flacher wird (und es somit schwieriger ist, die Richtung zum Minimum zu bestimmen). Für ein breites Spektrum parametrisierter Quantenschaltungen nimmt die Wahrscheinlichkeit, dass der Gradient entlang einer vernünftigen Richtung mit einer festen Genauigkeit ungleich Null ist, exponentiell ab, wenn die Anzahl der Qubits steigt.
Obwohl dieser Bereich noch Gegenstand aktiver Forschung ist, haben wir einige Empfehlungen zur Verbesserung der Optimierungsleistung:
- Bootstrapping kann der Optimierungsschleife helfen, nicht in einem Parameterraum stecken zu bleiben, in dem der Gradient klein ist.
- Experimentieren mit hardware-effizienten Ansätzen : Da wir ein verrauschtes Quantensystem als Blackbox-Orakel verwenden, kann die Qualität dieser Auswertungen die Leistung des Optimierers beeinflussen. Die Verwendung von hardwareeffizienten Ansätzen, wie z. B
EfficientSU2kann die Erzeugung exponentiell kleiner Gradienten vermeiden. - Experimente zur Fehlerunterdrückung und Fehlerminderung : Die Primitive „ IBM Quantum “ bieten eine einfache Schnittstelle, um mit verschiedenen Werten für bzw
optimization_level``resilience_setting. zu experimentieren. Dadurch lassen sich die Auswirkungen von Rauschen verringern und der Optimierungsprozess effizienter gestalten. - Experimentieren mit gradientenfreien Optimierern : Im Gegensatz zu gradientenbasierten Optimierungsalgorithmen stützen sich Optimierer wie
COBYLAnicht auf Gradienteninformationen, um die Parameter zu optimieren, und sind daher weniger wahrscheinlich von dem unfruchtbaren Plateau betroffen.
Zusammenfassung
In dieser Lektion haben Sie gelernt, wie Sie Ihre Optimierungsschleife definieren:
- Bootstrap einer Optimierungsschleife
- Verstehen von Kompromissen bei der Verwendung lokaler und globaler Optimierer
- Erforschen Sie unfruchtbare Plateaus und wie Sie sie vermeiden können
Unsere Variationsarbeit auf hohem Niveau ist abgeschlossen:
Als Nächstes werden wir spezifische Variationsalgorithmen unter Berücksichtigung dieses Rahmens untersuchen.