Skip to main content
IBM Quantum Platform

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 θ⃗∗\vec\theta^* zurückgegeben.

Ein Diagramm einiger wichtiger Faktoren bei der Optimierung, einschließlich unfruchtbarer Plateaus, gradientenbasierter vs. gradientenfreier Optimierer und Bootstrapping.

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:

Output of the previous code cell
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 cost
from qiskit.primitives import StatevectorEstimator

estimator = StatevectorEstimator()

Lokale Optimierer

Lokale Optimierer suchen nach einem Punkt, der die Kostenfunktion minimiert, beginnend mit einem oder mehreren Anfangspunkten C(θ0⃗)C(\vec{\theta_0}) 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"
)

result

Output:

 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 ii ) über einen vom Optimierer festgelegten Satz von Parametervektoren Θi:=θ⃗i,j∣j∈Jopti\Theta_i := \\{ {\vec\theta_{i,j} | j \in \mathcal{J}_\text{opt}^i} \\} 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 θ⃗\vec\theta auf der Grundlage einer vorherigen Optimierung, kann unserem Optimierer helfen, schneller zu einer Lösung zu konvergieren. Wir bezeichnen dies als den Anfangspunkt θ⃗0\vec\theta_0 und ∣ψ(θ⃗0)⟩=UV(θ⃗0)∣ρ⟩|\psi(\vec\theta_0)\rangle = U_V(\vec\theta_0)|\rho\rangle als den Anfangszustand. Dieser Ausgangszustand unterscheidet sich von unserem Referenzzustand ∣ρ⟩|\rho\rangle, 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 UV(θ⃗0)≡IU_V(\vec\theta_0) \equiv I (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 C(θ⃗)C(\vec\theta) den Gradienten der Funktion ∇⃗C(θ⃗)\vec{\nabla} C(\vec\theta) 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 θ⃗n+1=θ⃗n−η∇⃗C(θ⃗)\vec\theta_{n+1} = \vec\theta_n - \eta \vec{\nabla} C(\vec\theta), wobei η\eta 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, C(θ⃗∗)C({\vec\theta^*}).

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"
)

result

Output:

  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.

diagramm von f(theta) gegen theta, mehrere Punkte zeigen verschiedene Zustände eines Gradientenabstiegsalgorithmus, der das Minimum einer Kurve findet.

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"
)

result

Output:

 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.

Ein komplizierter gekrümmter Verteiler mit vielen Spitzen und Tälern.

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.

Ein Diagramm eines geografischen Plateaus im Vergleich zu einem Berghang, um zu erklären, warum ein Gefälle uns hilft, ein Minimum zu finden, und ein Plateau unsere Bemühungen behindert.

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 COBYLA nicht 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:

Ein Quantenschaltkreis mit einer Unitary, die den Referenzzustand herstellt, und einer zweiten Unitary, die den Zustand durch Variationsparameter verändert.

Als Nächstes werden wir spezifische Variationsalgorithmen unter Berücksichtigung dieses Rahmens untersuchen.

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.