量子ノイズとエラー緩和
備考
Toshinari Itoko (2024年6月28日)
元の講義のPDFをダウンロードしてください。コードスニペットは静的な画像として提供されているため、一部が非推奨になっている可能性があります。
この実験を実行するおおよそのQPU時間は1分40秒です。
1. はじめに
このレッスンでは、量子コンピューターにおけるノイズとその緩和方法について学びます。まず、ノイズを様々な方法でシミュレートできるシミュレーター(実際の量子コンピューターのノイズプロファイルを使用するものを含む)を用いて、ノイズの影響を調べます。次に、ノイズが本質的に存在する実際の量子コンピューターに移行します。ゼロノイズ外挿(ZNE)やゲートトワーリングなどの組み合わせを含む、エラー緩和の効果を見ていきます。
まず、いくつかのパッケージを読み込みます。
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib qiskit qiskit-aer qiskit-ibm-runtime
# !pip install qiskit qiskit_aer qiskit_ibm_runtime
# !pip install jupyter
# !pip install matplotlib pylatexenc
import qiskit
qiskit.__version__
'2.0.2'
import qiskit_aer
qiskit_aer.__version__
'0.17.1'
import qiskit_ibm_runtime
qiskit_ibm_runtime.__version__
'0.40.1'
2. エラー緩和なしのノイジーシミュレーション
Qiskit Aer は量子コンピューティング向けの古典的シミュレーターです。理想的な実行だけでなく、量子回路のノイジーな実行もシミュレートできます。このノートブックでは、Qiskit Aer を使ってノイジーシミュレーションを実行する方法を示します:
- ノイズモデルを構築する
- ノイズモデルを使ったノイジーサンプラー(シミュレーター)を構築する
- ノイジーサンプラー上で量子回路を実行する
noise_model = NoiseModel()
...
noisy_sampler = Sampler(options={"backend_options": {"noise_model": noise_model}})
job = noisy_sampler.run([circuit])
2.1 テスト回路の構築
Xゲートを d 回(d=0 ... 100)繰り返し、Z オブザーバブルを測定する単純な1量子ビット回路を考えます。
from qiskit.circuit import QuantumCircuit
MAX_DEPTH = 100
circuits = []
for d in range(MAX_DEPTH + 1):
circ = QuantumCircuit(1)
for _ in range(d):
circ.x(0)
circ.barrier(0)
circ.measure_all()
circuits.append(circ)
display(circuits[3].draw(output="mpl"))
from qiskit.quantum_info import SparsePauliOp
obs = SparsePauliOp.from_list([("Z", 1.0)])
obs
SparsePauliOp(['Z'],
coeffs=[1.+0.j])
2.2 ノイズモデルの構築
ノイジーシミュレーションを行うには、NoiseModel を指定する必要があります。このセクションでは NoiseModel の構築方法を示します。
まず、ノイズモデルに追加する量子(または読み出し)エラーを定義する必要があります。
from qiskit_aer.noise.errors import (
coherent_unitary_error,
amplitude_damping_error,
ReadoutError,
)
from qiskit.circuit.library import RXGate
# Coherent (unitary) error: Over X-rotation error
# https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.coherent_unitary_error.html#qiskit_aer.noise.coherent_unitary_error
OVER_ROTATION_ANGLE = 0.05
coherent_error = coherent_unitary_error(RXGate(OVER_ROTATION_ANGLE).to_matrix())
# Incoherent error: Amplitude dumping error
# https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.amplitude_damping_error.html#qiskit_aer.noise.amplitude_damping_error
AMPLITUDE_DAMPING_PARAM = 0.02 # in [0, 1] (0: no error)
incoherent_error = amplitude_damping_error(AMPLITUDE_DAMPING_PARAM)
# Readout (measurement) error: Readout error
# https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.ReadoutError.html#qiskit_aer.noise.ReadoutError
PREP0_MEAS1 = 0.03 # P(1|0): Probability of preparing 0 and measuring 1
PREP1_MEAS0 = 0.08 # P(0|1): Probability of preparing 1 and measuring 0
readout_error = ReadoutError(
[[1 - PREP0_MEAS1, PREP0_MEAS1], [PREP1_MEAS0, 1 - PREP1_MEAS0]]
)
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel()
noise_model.add_quantum_error(coherent_error.compose(incoherent_error), "x", (0,))
noise_model.add_readout_error(readout_error, (0,))
2.3 ノイズモデルを使ったノイジーサンプラーの構築
from qiskit_aer.primitives import SamplerV2 as Sampler
noisy_sampler = Sampler(options={"backend_options": {"noise_model": noise_model}})
2.4 ノイジーサンプラー上で量子回路を実行する
job = noisy_sampler.run(circuits, shots=400)
result = job.result()
result[0].data.meas.get_counts()
{'0': 389, '1': 11}