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

مساعد تعلم الضوضاء

Package versions

The code on this page was developed using the following requirements. We recommend using these versions or newer.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

تستخدم تقنيتا تخفيف الأخطاء PEA وPEC مكونًا لتعلم الضوضاء يعتمد على نموذج ضوضاء Pauli-Lindblad، وهو ما يُدار عادةً أثناء التنفيذ بعد إرسال مهمة واحدة أو أكثر عبر qiskit-ibm-runtime دون أي وصول محلي إلى نموذج الضوضاء المُعايَر. غير أنه اعتبارًا من الإصدار 0.27.1 من qiskit-ibm-runtime، جرى إنشاء فئة NoiseLearner ومعها فئة NoiseLearnerOptions للحصول على نتائج تجارب تعلم الضوضاء هذه. يمكن تخزين هذه النتائج محليًا كـ NoiseLearnerResult واستخدامها كمدخل في التجارب اللاحقة. توفر هذه الصفحة نظرة عامة على طريقة استخدامه والخيارات المتاحة.

نظرة عامة

تُجري فئة NoiseLearner تجارب تُوصِّف عمليات الضوضاء بناءً على نموذج ضوضاء Pauli-Lindblad لدائرة كمومية واحدة أو أكثر. تمتلك هذه الفئة طريقة run() تُنفِّذ تجارب التعلم، وتأخذ كمدخل إما قائمة من الدوائر الكمومية أو PUB، وتعيد NoiseLearnerResult يحتوي على قنوات الضوضاء المُتعلَّمة وبيانات تعريفية عن المهام المُرسَلة. في ما يلي مقتطف كود يوضح كيفية استخدام البرنامج المساعد.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.transpiler import CouplingMap
from qiskit.transpiler import generate_preset_pass_manager

from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2
from qiskit_ibm_runtime.noise_learner import NoiseLearner
from qiskit_ibm_runtime.options import (
NoiseLearnerOptions,
ResilienceOptionsV2,
EstimatorOptions,
)

# Build a circuit with two entangling layers
num_qubits = 27
edges = list(CouplingMap.from_line(num_qubits, bidirectional=False))
even_edges = edges[::2]
odd_edges = edges[1::2]

circuit = QuantumCircuit(num_qubits)
for pair in even_edges:
circuit.cx(pair[0], pair[1])
for pair in odd_edges:
circuit.cx(pair[0], pair[1])

# Choose a backend to run on
service = QiskitRuntimeService()
backend = service.least_busy()

# Transpile the circuit for execution
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
circuit_to_learn = pm.run(circuit)

# Instantiate a NoiseLearner object and execute the noise learning program
learner = NoiseLearner(mode=backend)
job = learner.run([circuit_to_learn])
noise_model = job.result()

النتيجة NoiseLearnerResult.data هي قائمة من كائنات LayerError التي تحتوي على نموذج الضوضاء لكل طبقة تشابك منفردة تنتمي إلى الدائرة (أو الدوائر) المستهدفة. يخزِّن كل LayerError معلومات الطبقة في صورة دائرة كمومية ومجموعة من تسميات الكيوبتات، إلى جانب PauliLindbladError لنموذج الضوضاء الذي جرى تعلمه للطبقة المعطاة.

print(
f"Noise learner result contains {len(noise_model.data)} entries"
f" and has the following type:\n {type(noise_model)}\n"
)
print(
f"Each element of `NoiseLearnerResult` then contains"
f" an object of type:\n {type(noise_model.data[0])}\n"
)
print(
f"And each of these `LayerError` objects possess"
f" data on the generators for the error channel: \n{noise_model.data[0].error.generators}\n"
)
print(f"Along with the error rates: \n{noise_model.data[0].error.rates}\n")
Noise learner result contains 2 entries and has the following type:
<class 'qiskit_ibm_runtime.utils.noise_learner_result.NoiseLearnerResult'>

Each element of `NoiseLearnerResult` then contains an object of type:
<class 'qiskit_ibm_runtime.utils.noise_learner_result.LayerError'>

And each of these `LayerError` objects possess data on the generators for the error channel:
['IIIIIIIIIIIIIIIIIIIIIIIIIIX', 'IIIIIIIIIIIIIIIIIIIIIIIIIIY',
'IIIIIIIIIIIIIIIIIIIIIIIIIIZ', 'IIIIIIIIIIIIIIIIIIIIIIIIIXI',
'IIIIIIIIIIIIIIIIIIIIIIIIIXX', 'IIIIIIIIIIIIIIIIIIIIIIIIIXY',
'IIIIIIIIIIIIIIIIIIIIIIIIIXZ', 'IIIIIIIIIIIIIIIIIIIIIIIIIYI',
'IIIIIIIIIIIIIIIIIIIIIIIIIYX', 'IIIIIIIIIIIIIIIIIIIIIIIIIYY',
'IIIIIIIIIIIIIIIIIIIIIIIIIYZ', 'IIIIIIIIIIIIIIIIIIIIIIIIIZI',
'IIIIIIIIIIIIIIIIIIIIIIIIIZX', 'IIIIIIIIIIIIIIIIIIIIIIIIIZY',
'IIIIIIIIIIIIIIIIIIIIIIIIIZZ', 'IIIIIIIIIIIIIIIIIIIIIIIIXII',
'IIIIIIIIIIIIIIIIIIIIIIIIXXI', 'IIIIIIIIIIIIIIIIIIIIIIIIXYI',
'IIIIIIIIIIIIIIIIIIIIIIIIXZI', 'IIIIIIIIIIIIIIIIIIIIIIIIYII',
'IIIIIIIIIIIIIIIIIIIIIIIIYXI', 'IIIIIIIIIIIIIIIIIIIIIIIIYYI',
'IIIIIIIIIIIIIIIIIIIIIIIIYZI', 'IIIIIIIIIIIIIIIIIIIIIIIIZII',
'IIIIIIIIIIIIIIIIIIIIIIIIZXI', 'IIIIIIIIIIIIIIIIIIIIIIIIZYI',
'IIIIIIIIIIIIIIIIIIIIIIIIZZI', 'IIIIIIIIIIIIIIIIIIIIIIIXIII',
'IIIIIIIIIIIIIIIIIIIIIIIXXII', 'IIIIIIIIIIIIIIIIIIIIIIIXYII',
'IIIIIIIIIIIIIIIIIIIIIIIXZII', 'IIIIIIIIIIIIIIIIIIIIIIIYIII',
'IIIIIIIIIIIIIIIIIIIIIIIYXII', 'IIIIIIIIIIIIIIIIIIIIIIIYYII',
'IIIIIIIIIIIIIIIIIIIIIIIYZII', 'IIIIIIIIIIIIIIIIIIIIIIIZIII',
'IIIIIIIIIIIIIIIIIIIIIIIZXII', 'IIIIIIIIIIIIIIIIIIIIIIIZYII',
'IIIIIIIIIIIIIIIIIIIIIIIZZII', 'IIIIIIIIIIIIIIIIIIIIIIXIIII',
'IIIIIIIIIIIIIIIIIIIIIIXXIII', 'IIIIIIIIIIIIIIIIIIIIIIXYIII',
'IIIIIIIIIIIIIIIIIIIIIIXZIII', 'IIIIIIIIIIIIIIIIIIIIIIYIIII',
'IIIIIIIIIIIIIIIIIIIIIIYXIII', 'IIIIIIIIIIIIIIIIIIIIIIYYIII',
'IIIIIIIIIIIIIIIIIIIIIIYZIII', 'IIIIIIIIIIIIIIIIIIIIIIZIIII',
'IIIIIIIIIIIIIIIIIIIIIIZXIII', 'IIIIIIIIIIIIIIIIIIIIIIZYIII',
'IIIIIIIIIIIIIIIIIIIIIIZZIII', 'IIIIIIIIIIIIIIIIIIIIIXIIIII',
'IIIIIIIIIIIIIIIIIIIIIXXIIII', 'IIIIIIIIIIIIIIIIIIIIIXYIIII',
'IIIIIIIIIIIIIIIIIIIIIXZIIII', 'IIIIIIIIIIIIIIIIIIIIIYIIIII',
'IIIIIIIIIIIIIIIIIIIIIYXIIII', 'IIIIIIIIIIIIIIIIIIIIIYYIIII',
'IIIIIIIIIIIIIIIIIIIIIYZIIII', 'IIIIIIIIIIIIIIIIIIIIIZIIIII',
'IIIIIIIIIIIIIIIIIIIIIZXIIII', 'IIIIIIIIIIIIIIIIIIIIIZYIIII',
'IIIIIIIIIIIIIIIIIIIIIZZIIII', 'IIIIIIIIIIIIIIIIIIIIXIIIIII',
'IIIIIIIIIIIIIIIIIIIIYIIIIII', 'IIIIIIIIIIIIIIIIIIIIZIIIIII',
'IIIIIIIIIIIIIIIIIIIXIIIIIII', 'IIIIIIIIIIIIIIIIIIIXXIIIIII',
'IIIIIIIIIIIIIIIIIIIXYIIIIII', 'IIIIIIIIIIIIIIIIIIIXZIIIIII',
'IIIIIIIIIIIIIIIIIIIYIIIIIII', 'IIIIIIIIIIIIIIIIIIIYXIIIIII',
'IIIIIIIIIIIIIIIIIIIYYIIIIII', 'IIIIIIIIIIIIIIIIIIIYZIIIIII', ...]

Along with the error rates:
[8.80e-04 6.50e-04 3.10e-04 5.60e-04 0.00e+00 0.00e+00 0.00e+00 3.00e-04
6.00e-05 1.30e-04 7.00e-05 3.90e-04 0.00e+00 0.00e+00 3.00e-05 3.70e-04
0.00e+00 5.00e-05 7.50e-04 5.50e-04 5.00e-05 0.00e+00 7.60e-04 5.00e-04
5.60e-04 5.60e-04 2.50e-04 5.00e-05 7.00e-05 2.00e-04 1.40e-04 8.00e-05
2.80e-04 0.00e+00 1.70e-04 4.20e-04 3.00e-05 1.00e-05 1.30e-04 4.40e-04
1.00e-04 2.60e-04 7.10e-04 1.10e-04 2.60e-04 1.00e-04 6.80e-04 1.02e-03
4.60e-04 5.30e-04 3.00e-04 0.00e+00 0.00e+00 3.40e-04 0.00e+00 0.00e+00
2.70e-04 0.00e+00 5.00e-05 6.70e-04 0.00e+00 2.20e-04 0.00e+00 4.40e-04
4.30e-04 8.30e-04 1.42e-03 0.00e+00 0.00e+00 1.44e-03 8.70e-04 0.00e+00
0.00e+00 1.05e-03 6.80e-04 5.90e-04 5.10e-04 3.10e-04 5.60e-04 0.00e+00
4.00e-05 0.00e+00 5.50e-04 1.00e-05 2.00e-05 0.00e+00 1.10e-04 0.00e+00
1.20e-04 0.00e+00 2.20e-04 7.00e-05 4.00e-05 3.80e-04 2.80e-04 4.00e-05
7.00e-05 3.00e-04 1.20e-04 6.00e-04 5.80e-04 1.80e-04 5.00e-04 1.20e-04
2.00e-05 2.00e-05 4.80e-04 2.00e-05 0.00e+00 1.40e-04 4.00e-04 3.00e-05
0.00e+00 0.00e+00 4.40e-04 1.10e-04 5.00e-05 6.00e-04 2.30e-04 5.00e-05
1.10e-04 5.30e-04 3.60e-04 6.80e-04 6.70e-04 2.80e-04 4.90e-04 1.30e-04
6.00e-05 7.20e-04 3.00e-05 9.00e-05 1.10e-04 3.30e-04 6.00e-05 1.30e-04
7.60e-04 1.30e-04 1.50e-04 1.30e-04 0.00e+00 3.10e-04 2.50e-04 5.10e-04
0.00e+00 6.00e-05 2.50e-04 2.40e-04 8.00e-05 0.00e+00 0.00e+00 2.70e-04
0.00e+00 8.00e-05 0.00e+00 7.80e-04 7.00e-05 0.00e+00 0.00e+00 2.50e-04
1.70e-04 2.00e-05 4.50e-04 3.10e-04 2.00e-05 1.70e-04 4.60e-04 1.30e-04
3.20e-04 3.50e-04 3.80e-04 2.70e-04 2.00e-04 8.00e-05 1.00e-05 4.10e-04
0.00e+00 0.00e+00 0.00e+00 2.36e-03 0.00e+00 7.00e-05 1.20e-04 9.40e-04
0.00e+00 1.90e-04 1.38e-03 7.50e-04 1.90e-04 0.00e+00 1.14e-03 7.30e-04
5.70e-04 4.20e-04 6.20e-04 0.00e+00 2.20e-04 5.00e-05 1.20e-04 0.00e+00
0.00e+00 1.90e-04 6.00e-05 1.10e-04 2.10e-04 1.50e-04 1.20e-04 2.90e-04
4.60e-04 2.10e-04 4.00e-05 3.00e-05 1.70e-04 3.10e-04 1.00e-04 1.70e-04
3.00e-05 3.90e-04 0.00e+00 6.00e-04 5.60e-04 1.40e-04 3.50e-04 1.00e-04
1.20e-04 9.00e-05 3.20e-04 2.00e-05 1.70e-04 3.00e-05 4.00e-04 1.50e-04
0.00e+00 1.60e-04 1.90e-04 9.00e-05 6.00e-05 4.50e-04 3.10e-04 6.00e-05
9.00e-05 3.70e-04 2.80e-04 6.50e-04 5.30e-04 3.30e-04 8.00e-05 8.00e-05
5.00e-05 2.50e-04 3.50e-04 4.00e-05 0.00e+00 0.00e+00 1.70e-04 1.30e-04
0.00e+00 0.00e+00 7.00e-05 1.70e-04 1.00e-05 4.20e-04 2.00e-04 1.00e-05
1.70e-04 4.80e-04 1.40e-03 4.70e-04 4.00e-04 3.90e-04 4.40e-04 2.00e-04
1.90e-04 7.20e-04 1.80e-04 1.00e-04 0.00e+00 5.70e-04 1.90e-04 2.00e-04
8.70e-04 1.20e-04 1.70e-04 0.00e+00 0.00e+00 3.80e-04 2.40e-04 4.80e-04
6.00e-05 0.00e+00 9.00e-05 6.50e-04 2.00e-05 8.00e-05 1.40e-04 5.80e-04
1.30e-04 0.00e+00 2.00e-05 1.00e-05 1.60e-04 1.00e-05 1.80e-04 4.40e-04
8.00e-05 1.40e-04 4.40e-04 3.90e-04 1.40e-04 8.00e-05 3.90e-04 4.10e-04
8.80e-04 7.30e-04 1.90e-04]

يحتوي الخاصية LayerError.error في نتيجة تعلم الضوضاء على المولِّدات ومعدلات الأخطاء لنموذج Pauli Lindblad المُعايَر، الذي يأخذ الصورة

Λ(ρ)=expjrj(PjρPjρ),\Lambda(\rho) = \exp{\sum_j r_j \left(P_j \rho P_j^\dagger - \rho\right)},

حيث rjr_j هي LayerError.rates وPjP_j هي عوامل باولي المحددة في LayerError.generators.

خيارات تعلم الضوضاء

يمكنك الاختيار من بين عدة خيارات عند إنشاء كائن NoiseLearner. تُغلَّف هذه الخيارات في فئة qiskit_ibm_runtime.options.NoiseLearnerOptions وتشمل إمكانية تحديد الحد الأقصى للطبقات المُراد تعلمها، وعدد عمليات العشوائية، واستراتيجية twirling، من بين أمور أخرى. راجع توثيق API الخاص بـ NoiseLearnerOptions للحصول على معلومات أكثر تفصيلًا.

في ما يلي مثال بسيط يوضح كيفية استخدام NoiseLearnerOptions في تجربة NoiseLearner:

# Build a GHZ circuit
circuit = QuantumCircuit(10)
circuit.h(0)
circuit.cx(range(0, 9), range(1, 10))
# Choose a backend to run on
service = QiskitRuntimeService()
backend = service.least_busy()

# Transpile the circuit for execution
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
circuit_to_run = pm.run(circuit_to_learn)

# Instantiate a noise learner options object
learner_options = NoiseLearnerOptions(
max_layers_to_learn=3, num_randomizations=32, twirling_strategy="all"
)

# Instantiate a NoiseLearner object and execute the noise learning program
learner = NoiseLearner(mode=backend, options=learner_options)
job = learner.run([circuit_to_run])
noise_model = job.result()

إدخال نموذج الضوضاء إلى primitive

يمكن أيضًا استخدام نموذج الضوضاء المُتعلَّم من الدائرة الكمومية كمدخل لـ primitive الخاص بـ EstimatorV2 المُنفَّذ في Qiskit IBM Runtime. يمكن تمرير هذا النموذج إلى الـ primitive بعدة طرق مختلفة. توضح الأمثلة الثلاثة التالية كيفية تمرير نموذج الضوضاء إلى خاصية estimator.options مباشرةً، أو عبر كائن ResilienceOptionsV2 قبل إنشاء Estimator primitive، أو بتمرير قاموس بالتنسيق المناسب.

# pass the noise model to the `estimator.options` attribute directly
estimator = EstimatorV2(mode=backend)
estimator.options.resilience.layer_noise_model = noise_model
# Specify options via a ResilienceOptionsV2 object
resilience_options = ResilienceOptionsV2(layer_noise_model=noise_model)
estimator_options = EstimatorOptions(resilience=resilience_options)
estimator = EstimatorV2(mode=backend, options=estimator_options)
# Specify options via a dictionary
options_dict = {
"resilience_level": 2,
"resilience": {"layer_noise_model": noise_model},
}

estimator = EstimatorV2(mode=backend, options=options_dict)

بمجرد تمرير نموذج الضوضاء إلى كائن EstimatorV2، يمكن استخدامه لتشغيل أحمال العمل وتنفيذ تخفيف الأخطاء كالمعتاد.

الخطوات التالية

Recommendations