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

أنساتز والأشكال التغايرية

تقوم جميع الخوارزميات التغايرية على فكرة محورية وهي تحليل الفروق بين الحالات، التي ترتبط ببعضها بشكل مناسب من خلال تحويل حسن السلوك (مثلاً: مستمر وقابل للتفاضل) من مجموعة من المعاملات أو المتغيرات — ومن هنا جاءت التسمية.

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

كما سنستكشف كيفية الموازنة بين السرعة والدقة عند استكشاف فضاء البحث هذا.

رسم تخطيطي يوضح المكونات الأساسية �لمناقشة الأنساتز، بما في ذلك الأنساتز الاستدلالي والأنساتز الخاص بالمسألة.

الدوائر الكمومية المُعلمَنة

تعمل الخوارزميات التغايرية عن طريق استكشاف ومقارنة مجموعة من الحالات الكمومية ψ(θ)|\psi(\vec{\theta})\rangle، التي تعتمد على مجموعة منتهية مكوّنة من kk معامل θ=(θ0,,θk1)\vec{\theta} = (\theta^0, \ldots, \theta^{k-1}). يمكن تحضير هذه الحالات باستخدام دائرة كمومية مُعلمَنة، حيث تُعرَّف البوابات بمعاملات قابلة للضبط. ويمكن إنشاء هذه الدائرة المُعلمَنة دون ربط زوايا محددة في البداية:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit rustworkx
from qiskit.circuit import QuantumCircuit, Parameter

theta = Parameter("θ")

qc = QuantumCircuit(3)
qc.rx(theta, 0)
qc.cx(0, 1)
qc.x(2)

qc.draw("mpl")

ناتج خلية الكود السابقة

from math import pi

angle_list = [pi / 3, pi / 2]
circuits = [qc.assign_parameters({theta: angle}) for angle in angle_list]

for circuit in circuits:
display(circuit.draw("mpl"))

ناتج خلية الكود السابقة

ناتج خلية الكود السابقة

الشكل التغايري والأنساتز

لتحسين الحالة تدريجياً من حالة المرجع ρ|\rho\rangle إلى الحالة المستهدفة ψ(θ)|\psi(\vec\theta)\rangle، نحتاج إلى تعريف شكل تغايري UV(θ)U_V(\vec{\theta}) يمثل مجموعة من الحالات المُعلمَنة لاستكشافها بواسطة الخوارزمية التغايرية:

0URUR0=ρUV(θ)UA(θ)0=UV(θ)UR0=UV(θ)ρ=ψ(θ)\begin{aligned} |0\rangle \xrightarrow{U_R} U_R|0\rangle & = |\rho\rangle \xrightarrow{U_V(\vec{\theta})} U_A(\vec{\theta})|0\rangle \\[1mm] & = U_V(\vec{\theta})U_R|0\rangle \\[1mm] & = U_V(\vec{\theta})|\rho\rangle \\[1mm] & = |\psi(\vec{\theta})\rangle \\[1mm] \end{aligned}

لاحظ أن الحالة المُعلمَنة تعتمد على كل من حالة المرجع ρ|\rho\rangle التي لا تعتمد على أي معاملات، والشكل التغايري UV(θ)U_V(\vec{\theta}) الذي يعتمد دائماً على معاملات. نسمي مزيج هذين الجزأين أنساتز: UA(θ):=UV(θ)URU_A(\vec\theta) := U_V(\vec\theta)U_R.

عند بناء الأنساتز لتمثيل مجموعة من الحالات المُعلمَنة التي ستستكشفها الخوارزمية التغايرية، نصطدم بمشكلة مهمة وهي: الأبعاد. إذ يحتوي نظام مكوّن من nn كيوبت (أي فضاء هيلبرت) على عدد ضخم من الحالات الكمومية المتمايزة في فضاء التهيئة. يستلزم التجوال الكامل فيه عدداً هائلاً من المعاملات. فمن الناحية الكمية، أبعاده D=22nD = 2^{2n}. ويزيد الأمر سوءاً أن تعقيد خوارزميات البحث وما شابهها يزداد أسياً مع هذه الأبعاد، وهو ما يُعرف في الأدبيات بـ"لعنة الأبعاد".

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

الأنساتز الاستدلالي والمقايضات

إذا لم يكن لديك أي معلومات خاصة بالمسألة تساعد في تقليص الأبعاد، يمكنك تجربة عائلة اعتباطية من الدوائر المُعلمَنة بعدد معاملات أقل من 22n2^{2n}. غير أن ثمة مقايضات ينبغي مراعاتها:

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

ثمة مقايضة جوهرية بين الجودة (أو حتى إمكانية الحل) والسرعة: كلما زادت المعاملات، زادت احتمالية الحصول على نتيجة دقيقة، لكن الخوارزمية ستستغرق وقتاً أطول.

الدوائر N-المحلية

من أكثر الأمثلة استخداماً للأنساتز الاستدلالي نجد الدوائر N-المحلية، لأسباب عدة:

  • تنفيذ فعّال: يتكوّن الأنساتز N-المحلي عادةً من بوابات محلية بسيطة يمكن تنفيذها بكفاءة على الحاسوب الكمومي باستخدام عدد صغير من الكيوبتات المادية. هذا يسهّل بناء الدوائر الكمومية وتحسينها.
  • يلتقط الارتباطات المهمة: يستطيع الأنساتز N-المحلي التقاط الارتباطات المهمة بين الكيوبتات في النظام الكمومي، حتى مع عدد قليل من البوابات. يتحقق ذلك لأن البوابات المحلية تتفاعل مع الكيوبتات المجاورة وتُنشئ تشابكاً بينها، وهو أمر بالغ الأهمية لمحاكاة الأنظمة الكمومية المعقدة.

تتكوّن هذه الدوائر من طبقات دوران وطبقات تشابك تتناوب مرة أو أكثر على النحو الآتي:

  • كل طبقة تتشكّل من بوابات بحجم أقصاه NN، حيث يجب أن يكون NN أصغر من عدد الكيوبتات.
  • في طبقة الدوران، تُرصّ البوابات فوق بعضها. يمكن استخدام عمليات دوران قياسية مثل RX أو CRZ.
  • في طبقة التشابك، يمكن استخدام بوابات مثل بوابات Toffoli أو CX مع إستراتيجية تشابك محددة.
  • يمكن لكلا النوعين من الطبقات أن يكونا مُعلمَنين أو لا، لكن يجب أن يحتوي أحدهما على الأقل على معاملات. وإلا، بدون معامل واحد على الأقل، لن تكون هناك أي تغايرات!
  • اختيارياً، تُضاف طبقة دوران إضافية في نهاية الدائرة.

على سبيل المثال، لنُنشئ دائرة NLocal من خمسة كيوبتات مع كتل دوران مكوّنة من بوابات RX وCRZ، وكتل تشابك مكوّنة من بوابات Toffoli تعمل على الكيوبتات [0,1,2][0,1,2]، [0,2,3][0,2,3]، [4,2,1][4,2,1] و[3,1,0][3,1,0] مع 22 تكرار لكل طبقة.

from qiskit.circuit.library import NLocal, CCXGate, CRZGate, RXGate
from qiskit.circuit import Parameter

theta = Parameter("θ")
ansatz = NLocal(
num_qubits=5,
rotation_blocks=[RXGate(theta), CRZGate(theta)],
entanglement_blocks=CCXGate(),
entanglement=[[0, 1, 2], [0, 2, 3], [4, 2, 1], [3, 1, 0]],
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")

ناتج خلية الكود السابقة

في المثال أعلاه، أكبر بوابة هي بوابة Toffoli التي تعمل على ثلاثة كيوبتات، مما يجعل الدائرة 33-محلية. أكثر أنواع الدوائر N-المحلية استخداماً هي الدوائر 22-المحلية مع بوابات دوران أحادية الكيوبت وبوابات تشابك ثنائية الكيوبت.

لنُنشئ دائرة 22-محلية باستخدام فئة TwoLocal في Qiskit. الصياغة مشابهة لـNLocal مع بعض الاختلافات. فمثلاً، معظم البوابات مثل RX وRZ وCNOT يمكن تمريرها كنصوص دون الحاجة إلى استيراد البوابات أو إنشاء نسخة Parameter.

from qiskit.circuit.library import TwoLocal

ansatz = TwoLocal(
num_qubits=5,
rotation_blocks=["rx", "rz"],
entanglement_blocks="cx",
entanglement="linear",
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")

ناتج خلية الكود السابقة

في هذه الحالة، استخدمنا توزيع التشابك الخطي، حيث يتشابك كل كيوبت مع التالي. لمعرفة المزيد عن الإستراتيجيات الأخرى، راجع توثيق TwoLocal.

Efficient SU2

efficient_su2 هي دائرة فعّالة للعتاد الصلب تتكوّن من طبقات عمليات أحادية الكيوبت تغطي SU(2) وتشابكات CX. هذا نمط استدلالي يمكن استخدامه لتحضير دوال موجة تجريبية لخوارزميات الكم التغايرية أو كدائرة تصنيف في تعلم الآلة.

from qiskit.circuit.library import efficient_su2

ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")

ناتج خلية الكود السابقة

الأنساتز الخاص بالمسألة

بينما يساعدنا الأنساتز الاستدلالي والفعّال للعتاد الصلب على حل المسائل بطريقة مبسطة، يمكننا استخدام معرفة خاصة بالمسألة لتقييد فضاء بحث الدائرة على نوع محدد. هذا سيساعدنا على اكتساب السرعة دون فقدان الدقة في عملية البحث.

التحسين

في مسألة القطع الأقصى (max-cut)، نريد تقسيم عقد الرسم البياني بطريقة تعظّم عدد الحواف بين العقد في المجموعتين المختلفتين. التقسيم الأمثل للمسألة أدناه واضح: العقدة 0 على اليسار يجب فصلها عن بقية العقد على اليمين بقطع.

import rustworkx as rx
from rustworkx.visualization import mpl_draw

n = 4
G = rx.PyGraph()
G.add_nodes_from(range(n))
# The edge syntax is (start, end, weight)
edges = [(0, 1, 1.0), (0, 2, 1.0), (0, 3, 1.0), (1, 2, 1.0), (2, 3, 1.0)]
G.add_edges_from(edges)

mpl_draw(
G, pos=rx.shell_layout(G), with_labels=True, edge_labels=str, node_color="#1192E8"
)

ناتج خلية الكود السابقة

لاستخدام خوارزمية QAOA لمسألة القطع الأقصى، نحتاج إلى هاميلتوني باولي يُشفّر التكلفة بحيث تتوافق القيمة التوقعية الدنيا للمؤثر مع أقصى عدد من الحواف بين عقدتين في مجموعتين مختلفتين.

لهذا المثال البسيط، المؤثر هو تركيب خطي من حدود مع مؤثرات Z على العقد المرتبطة بحافة (تذكر أن الكيوبت 0 في أقصى اليمين): ZZII+IZZI+ZIIZ+IZIZ+IIZZZZII + IZZI + ZIIZ + IZIZ + IIZZ. بعد بناء المؤثر، يمكن بناء الأنساتز لخوارزمية QAOA بسهولة باستخدام دائرة QAOAAnsatz من مكتبة دوائر Qiskit.

# Pre-defined ansatz circuit, operator class and visualization tools
from qiskit.circuit.library import QAOAAnsatz
from qiskit.quantum_info import SparsePauliOp

# Problem to Hamiltonian operator
hamiltonian = SparsePauliOp.from_list(
[("ZZII", 1), ("IZZI", 1), ("ZIIZ", 1), ("IZIZ", 1), ("IIZZ", 1)]
)
# QAOA ansatz circuit
ansatz = QAOAAnsatz(hamiltonian, reps=2)
# Draw
ansatz.decompose(reps=3).draw("mpl")

ناتج خلية الكود السابقة

الصورة السابقة توضح الأنساتز بالبوابات الأساسية للتوضيح. ومع ذلك، يمكن التعبير عنه بمستويات متعددة من التحليل بتغيير قيمة وسيط reps أو برسم الدائرة دون استخدام طريقة decompose. على سبيل المثال، يوضح التمثيل التالي بنية QAOA مباشرةً مع قيمة reps الافتراضية وهي reps=1.

ansatz.decompose(reps=2).draw("mpl")

ناتج خلية الكود السابقة

تعلم الآلة الكمومي

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

يمكن استخدام zz_feature_map لإنشاء دائرة مُعلمَنة. يمكننا تمرير نقاط بياناتنا إلى خريطة الميزات (xx) وشكل تغايري منفصل لتمرير الأوزان كمعاملات (θ\theta).

from qiskit.circuit.library import zz_feature_map, TwoLocal

data = [0.1, 0.2]

zz_feature_map_reference = zz_feature_map(feature_dimension=2, reps=2)
zz_feature_map_reference = zz_feature_map_reference.assign_parameters(data)

variation_form = TwoLocal(2, ["ry", "rz"], "cz", reps=2)
vqc_ansatz = zz_feature_map_reference.compose(variation_form)
vqc_ansatz.decompose().draw("mpl")

ناتج خلية الكود السابقة

ملخص

في هذا الدرس، تعلمت كيفية تعريف فضاء البحث بشكل تغايري:

  • تحضير الحالات بدائرة كمومية مُعلمَنة، حيث تُعرَّف البوابات بمعاملات قابلة للضبط
  • كيفية بناء أنساتز يوازن بين السرعة والدقة
  • الأنساتز الاستدلالي
  • الأنساتز الخاص بالمسألة

حِمل العمل التغايري عالي المستوى يبدو كالتالي:

رسم تخطيطي للدائرة يوضح وحدتين وحدويتين: إحداهما تُحضّر حالة المرجع والأخرى تُحضّر الأنساتز.

لكل معامل تغايري θ\vec\theta، ستُنتَج حالة كمومية مختلفة. للعثور على المعاملات المثلى، نحتاج إلى تعريف دالة تكلفة خاصة بالمسألة لتحديث معاملات الأنساتز بشكل تكراري.