לולאות אופטימיזציה
בשיעור זה נלמד כיצד להשתמש במייעל לחקירה איטרטיבית של המצבים הקוונטיים הפרמטריים של האנזאץ' שלנו:
- אתחול לולאת אופטימיזציה
- הבנת פשרות בעת שימוש במייעלים מקומיים וגלובליים
- חקירת מישורי שממה וכיצד להימנע מהם
ברמה גבוהה, מייעלים הם מרכיבי מפתח לחקירת מרחב החיפוש שלנו. המייעל משתמש בהערכות פונקציית העלות כדי לבחור את קבוצת הפרמטרים הבאה בלולאה וריאציונית, וחוזר על התהליך עד שהוא מגיע למצב יציב. בשלב זה מוחזרת קבוצה אופטימלית של ערכי פרמטרים .
מייעלים מקומיים וגלובליים
נגדיר את הבעיה שלנו תחילה לפני שנחקור כל סוג מייעל. נתחיל עם מעגל המכיל שמונה פרמטרים וריאציוניים:
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit scipy
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")
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()
מייעלים מקומיים
מייעלים מקומיים מחפשים נקודה הממזערת את פונקציית העלות החל מנקודת התחלה (או מספר נקודות) , ועוברים לנקודות שונות בהתאם למה שהם מזהים באזור שהם מעריכים באיטרציות רצופות. משמעות הדבר היא שהתכנסות אלגוריתמים אלה תהיה לרוב מהירה, אך עשויה להיות תלויה מאוד בנקודת ההתחלה. מייעלים מקומיים אינם מסוגלים לראות מעבר לאזור שבו הם מעריכים, ועלולים להיות רגישים במיוחד למינימום מקומי — מדווחים על התכנסות כאשר הם מוצאים אחד ומתעלמים ממצבים עם הערכות נוחות יותר.
# 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
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
מייעלים גלובליים
מייעלים גלובליים מחפשים את הנקודה הממזערת את פונקציית העלות על פני מספר אזורים בתחום שלה (כלומר, לא-מקומית), ומעריכים אותה באופן איטרטיבי (כלומר, באיטרציה ) על פני קבוצת ווקטורי פרמטרים הנקבעת על ידי המייעל. זה הופך אותם לפחות רגישים למינימום מקומי ועצמאיים במידת מה מהאתחול, אך גם איטיים הרבה יותר להתכנסות לפתרון מוצע.
אתחול האופטימיזציה
אתחול, או הגדרת הערך הראשוני לפרמטרים בהתבסס על אופטימיזציה קודמת, יכול לעזור למייעל שלנו להתכנס לפתרון מהר יותר. אנו מכנים זאת נקודת ההתחלה , ו- כמצב ראשוני. מצב ראשוני זה שונה ממצב הייחוס שלנו , שכן הראשון מתמקד בפרמטרים ראשוניים שנקבעו במהלך לולאת האופטימיזציה, בעוד שהאחרון מתמקד בשימוש בפתרונות "ייחוס" ידועים. הם עשויים להתלכד אם (כלומר, פעולת הזהות).
כאשר מייעלים מקומיים מתכנסים למינימום מקומי לא-אופטימלי, ניתן לנסות לאתחל את האופטימיזציה גלובלית ולדייק את ההתכנסות מקומית. בעוד שזה דורש הגדרת שתי עומסי עבודה וריאציוניים, זה מאפשר למייעל למצוא פתרון אופטימלי יותר מאשר המייעל המקומי לבדו.