דלג לתוכן הראשי

לולאות אופטימיזציה

בשיעור זה נלמד כיצד להשתמש במייעל לחקירה איטרטיבית של המצבים הקוונטיים הפרמטריים של האנזאץ' שלנו:

  • אתחול לולאת אופטימיזציה
  • הבנת פשרות בעת שימוש במייעלים מקומיים וגלובליים
  • חקירת מישורי שממה וכיצד להימנע מהם

ברמה גבוהה, מייעלים הם מרכיבי מפתח לחקירת מרחב החיפוש שלנו. המייעל משתמש בהערכות פונקציית העלות כדי לבחור את קבוצת הפרמטרים הבאה בלולאה וריאציונית, וחוזר על התהליך עד שהוא מגיע למצב יציב. בשלב זה מוחזרת קבוצה אופטימלית של ערכי פרמטרים θ\vec\theta^*.

דיאגרמה של כמה גורמים חשובים באופטימיזציה, כולל מישורי שממה, מייעלים עם גרדיאנט ובלעדיו, ואתחול.

מייעלים מקומיים וגלובליים

נגדיר את הבעיה שלנו תחילה לפני שנחקור כל סוג מייעל. נתחיל עם מעגל המכיל שמונה פרמטרים וריאציוניים:

# 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()

מייעלים מקומיים

מייעלים מקומיים מחפשים נקודה הממזערת את פונקציית העלות החל מנקודת התחלה (או מספר נקודות) C(θ0)C(\vec{\theta_0}), ועוברים לנקודות שונות בהתאם למה שהם מזהים באזור שהם מעריכים באיטרציות רצופות. משמעות הדבר היא שהתכנסות אלגוריתמים אלה תהיה לרוב מהירה, אך עשויה להיות תלויה מאוד בנקודת ההתחלה. מייעלים מקומיים אינם מסוגלים לראות מעבר לאזור שבו הם מעריכים, ועלולים להיות רגישים במיוחד למינימום מקומי — מדווחים על התכנסות כאשר הם מוצאים אחד ומתעלמים ממצבים עם הערכות נוחות יותר.

# 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

מייעלים גלובליים

מייעלים גלובליים מחפשים את הנקודה הממזערת את פונקציית העלות על פני מספר אזורים בתחום שלה (כלומר, לא-מקומית), ומעריכים אותה באופן איטרטיבי (כלומר, באיטרציה ii) על פני קבוצת ווקטורי פרמטרים Θi:=θi,jjJopti\Theta_i := \\{ {\vec\theta_{i,j} | j \in \mathcal{J}_\text{opt}^i} \\} הנקבעת על ידי המייעל. זה הופך אותם לפחות רגישים למינימום מקומי ועצמאיים במידת מה מהאתחול, אך גם איטיים הרבה יותר להתכנסות לפתרון מוצע.

אתחול האופטימיזציה

אתחול, או הגדרת הערך הראשוני לפרמטרים θ\vec\theta בהתבסס על אופטימיזציה קודמת, יכול לעזור למייעל שלנו להתכנס לפתרון מהר יותר. אנו מכנים זאת נקודת ההתחלה θ0\vec\theta_0, ו-ψ(θ0)=UV(θ0)ρ|\psi(\vec\theta_0)\rangle = U_V(\vec\theta_0)|\rho\rangle כמצב ראשוני. מצב ראשוני זה שונה ממצב הייחוס שלנו ρ|\rho\rangle, שכן הראשון מתמקד בפרמטרים ראשוניים שנקבעו במהלך לולאת האופטימיזציה, בעוד שהאחרון מתמקד בשימוש בפתרונות "ייחוס" ידועים. הם עשויים להתלכד אם UV(θ0)IU_V(\vec\theta_0) \equiv I (כלומר, פעולת הזהות).

כאשר מייעלים מקומיים מתכנסים למינימום מקומי לא-אופטימלי, ניתן לנסות לאתחל את האופטימיזציה גלובלית ולדייק את ההתכנסות מקומית. בעוד שזה דורש הגדרת שתי עומסי עבודה וריאציוניים, זה מאפשר למייעל למצוא פתרון אופטימלי יותר מאשר המייעל המקומי לבדו.

מייעלים מבוססי גרדיאנט ומייעלים ללא גרדיאנט

מבוססי גרדיאנט

עבור פונקציית העלות שלנו C(θ)C(\vec\theta), אם יש לנו גישה לגרדיאנט של הפונקציה C(θ)\vec{\nabla} C(\vec\theta) החל מנקודת התחלה, הדרך הפשוטה ביותר לממזר את הפונקציה היא לעדכן את הפרמטרים לכיוון השיפוע התלול ביותר של הפונקציה. כלומר, אנחנו מעדכנים את הפרמטרים כ-θn+1=θnηC(θ)\vec\theta_{n+1} = \vec\theta_n - \eta \vec{\nabla} C(\vec\theta), כאשר η\eta הוא קצב הלמידה — היפר-פרמטר קטן וחיובי השולט בגודל העדכון. ממשיכים לעשות זאת עד שמגיעים למינימום מקומי של פונקציית העלות, C(θ)C({\vec\theta^*}). ניתן להשתמש בפונקציית עלות זו ובמייעל לחישוב פרמטרים אופטימליים

# 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
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

החסרונות העיקריים של סוג אופטימיזציה זה הם מהירות ההתכנסות, שעלולה להיות איטית מאוד, ואין ערובה להשגת הפתרון האופטימלי.

גרף של f(theta) מול theta, נקודות מרובות מציגות מצבים שונים של אלגוריתם ירידת גרדיאנט הממצא את המינימום של עקומה.

ללא גרדיאנט

אלגוריתמי אופטימיזציה ללא גרדיאנט אינם דורשים מידע על הגרדיאנט, ויכולים להיות שימושיים במצבים שבהם חישוב הגרדיאנט קשה, יקר, או רועש מדי. הם גם נוטים להיות חזקים יותר במציאת אופטימום גלובלי, בעוד ששיטות מבוססות גרדיאנט נוטות להתכנס לאופטימום מקומי. נחקור מספר מקרים שבהם מייעל ללא גרדיאנט יכול לעזור להימנע ממישורי שממה. עם זאת, שיטות ללא גרדיאנט דורשות משאבי חישוב גבוהים יותר, במיוחד עבור בעיות עם מרחבי חיפוש רב-ממדיים.

הנה דוגמה שמשתמשת במייעל COBYLA במקום:

# 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
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

מישורי שממה

למעשה, נוף העלות יכול להיות מסובך למדי, כפי שמראים הגבעות והעמקים בדוגמה למטה. שיטת האופטימיזציה מנווטת אותנו בנוף העלות, מחפשת את המינימום, כפי שמוצג על ידי הנקודות והקווים השחורים. ניתן לראות ששניים מתוך שלושת החיפושים מסתיימים במינימום מקומי של הנוף, ולא בגלובלי.

מניפולד עקומה מסובכת עם פסגות ועמקים רבים.

ללא קשר לסוג שיטת האופטימיזציה בה משתמשים, אם נוף העלות הוא שטוח יחסית, עשוי להיות קשה לשיטה לקבוע את הכיוון המתאים לחיפוש. תרחיש זה מכונה מישור שממה, שבו נוף העלות הופך שטוח יותר ויותר (ולכן קשה יותר לקבוע את הכיוון למינימום). עבור מגוון רחב של מעגלים קוונטיים פרמטריים, ההסתברות שהגרדיאנט לאורך כל כיוון סביר הוא לא-אפסי עד לדיוק קבוע פוחתת אקספוננציאלית ככל שמספר הקיוביטים גדל.

דיאגרמה של מישור גיאוגרפי לעומת שיפוע של הר, כדי להסביר מדוע גרדיאנט עוזר לנו למצוא מינימום ומדוע מישור שממה מעכב את מאמצינו.

בעוד שתחום זה עדיין נמצא במחקר פעיל, יש לנו מספר המלצות לשיפור ביצועי האופטימיזציה:

  • אתחול יכול לעזור ללולאת האופטימיזציה להימנע מהיתקעות במרחב פרמטרים שבו הגרדיאנט קטן.
  • ניסוי עם אנזאץ' יעיל לחומרה: מכיוון שאנו משתמשים במערכת קוונטית רועשת כ-oracle של קופסה שחורה, איכות ההערכות יכולה להשפיע על ביצועי המייעל. שימוש באנזאץ' יעיל לחומרה, כגון EfficientSU2, עשוי להימנע מיצירת גרדיאנטים קטנים אקספוננציאלית.
  • ניסוי עם דיכוי שגיאות ומיתון שגיאות: הפרימיטיבים של Qiskit Runtime מספקים ממשק פשוט לניסוי עם ערכים שונים עבור optimization_level ו-resilience_setting, בהתאמה. זה יכול להפחית את השפעת הרעש ולהפוך את תהליך האופטימיזציה ליעיל יותר.
  • ניסוי עם מייעלים ללא גרדיאנט: בשונה מאלגוריתמי אופטימיזציה מבוססי גרדיאנט, מייעלים כגון COBYLA אינם מסתמכים על מידע גרדיאנט לאופטימיזציה של הפרמטרים, ולכן פחות סביר שיושפעו ממישור השממה.

סיכום

בשיעור זה למדתם כיצד להגדיר את לולאת האופטימיזציה שלכם:

  • אתחול לולאת אופטימיזציה
  • הבנת פשרות בעת שימוש במייעלים מקומיים וגלובליים
  • חקירת מישורי שממה וכיצד להימנע מהם

עומס העבודה הוריאציוני ברמה גבוהה שלנו הושלם:

מעגל קוונטי כעת עם גם אוניטרי להכנת מצב הייחוס וגם אוניטרי שני לשינוי המצב באמצעות פרמטרים וריאציוניים.

בהמשך, נחקור אלגוריתמים וריאציוניים ספציפיים עם מסגרת זו בראש.