انتقل إلى المحتوى الرئيسي

حلقات التحسين

في هذا الدرس، سنتعلم كيفية استخدام محسِّن لاستكشاف الحالات الكمية المُعاملة لـansatz بشكل تكراري:

  • تمهيد حلقة التحسين
  • فهم المقايضات عند استخدام المحسِّنات المحلية والعالمية
  • استكشاف المستويات المجدبة وكيفية تجنبها

على المستوى العالي، تُعدّ المحسِّنات محورية في استكشاف فضاء البحث لدينا. يستخدم المحسِّن تقييمات دالة التكلفة لاختيار المجموعة التالية من المعاملات في الحلقة التغايرية، ويكرر العملية حتى يصل إلى حالة مستقرة. عند تلك النقطة، تُعاد مجموعة مثلى من قيم المعاملات θ\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

المستويات المجدبة

في الواقع، قد تكون مشهد التكلفة معقداً جداً، كما يُظهر ذلك التلال والوديان في المثال أدناه. تنتقل طريقة التحسين بيننا في مشهد التكلفة بحثاً عن الحد الأدنى، كما يُظهره النقاط والخطوط السوداء. يمكننا أن نرى أن اثنتَين من عمليات البحث الثلاث تنتهيان عند حد أدنى محلي للمشهد وليس عالمياً.

منحنى معقد متعدد القمم والقيعان.

بغض النظر عن نوع طريقة التحسين المستخدمة، إذا كان مشهد التكلفة مسطحاً نسبياً، قد يكون من الصعب على الطريقة تحديد الاتجاه المناسب للبحث. يُشار إلى هذا السيناريو بـالمستوى المجدب، حيث يصبح مشهد التكلفة أكثر انبساطاً تدريجياً (وبالتالي يصعب تحديد اتجاه الحد الأدنى). لمجموعة واسعة من الدوائر الكمية المُعاملة، يتناقص احتمال أن يكون التدرج على أي اتجاه معقول غير صفري بدقة ثابتة بشكل أسّي مع زيادة عدد الكيوبتات.

مخطط يقارن هضبة جغرافية بسفح جبل لتوضيح لماذا يساعدنا التدرج في إيجاد حد أدنى وتعيقنا الهضبة.

بينما لا يزال هذا المجال قيد البحث النشط، لدينا بعض التوصيات لتحسين أداء التحسين:

  • التمهيد يمكن أن يساعد حلقة التحسين على تجنب الوقوع في فضاء معاملات يكون فيه التدرج صغيراً.
  • تجربة ansatz الملائمة للعتاد: بما أننا نستخدم نظاماً كمياً صاخباً كأوراكل صندوق أسود، يمكن أن تؤثر جودة تلك التقييمات على أداء المحسِّن. قد يؤدي استخدام ansatz ملائمة للعتاد، مثل EfficientSU2، إلى تجنب توليد تدرجات صغيرة بشكل أسّي.
  • تجربة قمع الأخطاء وتخفيفها: تُتيح primitives Qiskit Runtime واجهة بسيطة لتجربة قيم مختلفة لـoptimization_level وresilience_setting على التوالي. هذا يمكن أن يُقلّل تأثير الضوضاء ويجعل عملية التحسين أكثر كفاءة.
  • تجربة المحسِّنات بدون تدرج: على عكس خوارزميات التحسين بالتدرج، لا تعتمد المحسِّنات مثل COBYLA على معلومات التدرج لتحسين المعاملات وبالتالي تتأثر بالمستوى المجدب بشكل أقل.

الملخص

بهذا الدرس، تعلمت كيفية تعريف حلقة التحسين:

  • تمهيد حلقة التحسين
  • فهم المقايضات عند استخدام المحسِّنات المحلية والعالمية
  • استكشاف المستويات المجدبة وكيفية تجنبها

اكتمل عبء العمل التغايري على المستوى العالي:

دائرة كمية بوحدة وحدوية لتحضير الحالة المرجعية ووحدة وحدوية ثانية لتغيير الحالة باستخدام المعاملات التغايرية.

بعد ذلك، سنستكشف خوارزميات تغايرية محددة مع وضع هذا الإطار في الاعتبار.