4. 量子噪声信道建模与仿真
在真实量子硬件上,量子比特并非孤立系统,它会与周围环境发生不可避免的耦合,导致退相干、能量弛豫和门操作误差。要在算法层面评估噪声鲁棒性,第一步就是把物理噪声抽象为可计算、可复现的量子信道模型。本节围绕比特翻转、相位翻转、去极化、振幅阻尼四类典型信道,说明它们的数学形式、物理含义,以及如何用 Qiskit 或 Cirq 构建可复现的噪声仿真环境。
一、从物理噪声到量子信道
量子信道是作用在密度矩阵上的完全正定保迹映射(CPTP map)。若把噪声看作以一定概率发生的随机过程,则可用算符和表示:
ρ' = Σ_k E_k ρ E_k†, 且 Σ_k E_k† E_k = I
其中 {E_k} 称为 Kraus 算符。不同噪声对应不同的 Kraus 集合。理解这一点后,仿真就变成“选择 Kraus 算符 + 设定概率参数”的过程。下面先给出四类信道的定义与参数约定,再进入代码实现。
二、四类典型信道模型
比特翻转信道(Bit Flip):以概率 p 将 |0⟩ 变为 |1⟩、|1⟩ 变为 |0⟩,等价于以概率 p 施加 Pauli-X。Kraus 算符为 E₀=√(1−p)I,E₁=√p X。它模拟的是比特态本身的翻转错误。
相位翻转信道(Phase Flip):以概率 p 施加 Pauli-Z,使 |+⟩ 变为 |−⟩,改变的是相位而非布居数。Kraus 算符为 E₀=√(1−p)I,E₁=√p Z。它与比特翻转在布洛赫球上分别对应绕 X 轴和 Z 轴的收缩。
去极化信道(Depolarizing):以概率 p 随机施加 X、Y、Z 之一,使量子态向完全混合态 I/2 收缩。其等效形式为 ρ' = (1−p)ρ + (p/3)(XρX + YρY + ZρZ)。去极化信道是硬件上最常用的“平均误差”模型,单比特门误差率常直接映射为去极化参数。
振幅阻尼信道(Amplitude Damping):描述能量从 |1⟩ 弛豫到 |0⟩ 的过程,参数 γ 对应时间 t 内的弛豫概率,γ = 1 − exp(−t/T₁)。Kraus 算符为 E₀=[[1,0],[0,√(1−γ)]],E₁=[[0,√γ],[0,0]]。它只把 |1⟩ 向 |0⟩ 衰减,因此是非对称信道,常用于模拟 T₁ 能量弛豫。
四类信道的核心区别可用下图概括:比特翻转改变布居数,相位翻转改变相干性,去极化同时压缩三者,振幅阻尼则单向衰减激发态。
三、用 Qiskit 构建可复现噪声环境
Qiskit 提供 qiskit_aer.noise 模块,可直接把上述信道注册为噪声模型。以下示例构建一个包含比特翻转、相位翻转、去极化和振幅阻尼的复合噪声模型,并固定随机种子以保证复现性。
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit_aer.noise import (
NoiseModel, pauli_error, depolarizing_error,
amplitude_damping_error, phase_damping_error
)
# 1. 比特翻转:p=0.02
bit_flip = pauli_error([('X', 0.02), ('I', 0.98)])
# 2. 相位翻转:p=0.03
phase_flip = pauli_error([('Z', 0.03), ('I', 0.97)])
# 3. 去极化:单比特门 p=0.01,双比特门 p=0.05
depol_1q = depolarizing_error(0.01, 1)
depol_2q = depolarizing_error(0.05, 2)
# 4. 振幅阻尼:γ=0.04(对应 T1 弛豫)
amp_damp = amplitude_damping_error(0.04)
# 组装噪声模型
noise_model = NoiseModel()
noise_model.add_all_qubit_quantum_error(bit_flip, ['x'])
noise_model.add_all_qubit_quantum_error(phase_flip, ['z'])
noise_model.add_all_qubit_quantum_error(depol_1q, ['u1', 'u2', 'u3'])
noise_model.add_all_qubit_quantum_error(depol_2q, ['cx'])
noise_model.add_all_qubit_quantum_error(amp_damp, ['id'])
# 固定种子,保证每次运行结果一致
sim = AerSimulator(noise_model=noise_model, seed_simulator=42)
# 测试电路:制备 Bell 态并测量
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
result = sim.run(transpile(qc, sim), shots=4096).result()
counts = result.get_counts()
print(counts)
运行后典型输出(示例,非实测)可能为 {'00': 1980, '11': 1930, '01': 95, '10': 91}。理想 Bell 态只应出现 00 和 11,各约 2048 次;出现 01/10 说明噪声已引入比特翻转或去极化错误。通过对比不同噪声参数下的 counts 分布,即可量化信道对纠缠保真度的影响。
四、用 Cirq 构建等价噪声环境
Cirq 通过 cirq.depolarize、cirq.bit_flip、cirq.phase_flip、cirq.amplitude_damp 等信道对象,在电路层插入噪声。其优势是噪声与门操作在同一电路描述中,便于逐门控制。
import cirq
q0, q1 = cirq.LineQubit.range(2)
# 构建带噪声的 Bell 态电路
circuit = cirq.Circuit([
cirq.H(q0),
cirq.depolarize(p=0.01).on(q0), # 单比特去极化
cirq.CNOT(q0, q1),
cirq.depolarize(p=0.05).on(q0, q1), # 双比特去极化
cirq.amplitude_damp(gamma=0.04).on(q0), # 振幅阻尼
cirq.bit_flip(p=0.02).on(q1), # 比特翻转
cirq.measure(q0, q1, key='m')
])
# 固定随机种子,保证采样可复现
sim = cirq.DensityMatrixSimulator(seed=1234)
result = sim.run(circuit, repetitions=4096)
print(result.histogram(key='m'))
Cirq 的 DensityMatrixSimulator 直接演化密度矩阵,能精确反映信道对相干性的影响;若使用 cirq.Simulator 配合 cirq.kraus,则按采样方式近似。两者结果在 shots 足够大时趋于一致。
五、参数设置与结果判读要点
构建可复现噪声环境时,需注意以下关键点:
- 参数来源要明确:p 或 γ 应来自硬件标定(如 T₁、T₂、门误差率),而非随意设定。例如 γ = 1 − exp(−t_gate/T₁),t_gate 为门时间。
- 噪声位置要对应物理过程:单比特门误差用单比特去极化,双比特门用双比特去极化,空闲时段用振幅阻尼或相位阻尼。
- 随机种子必须固定:Qiskit 用
seed_simulator,Cirq 用seed,否则每次 counts 波动会干扰对比。 - 结果判读看分布偏移:理想分布与含噪分布的 TVD(全变分距离)或保真度可作为鲁棒性指标。TVD 越小,信道影响越弱。
pauli_error 与 depolarizing_error 参数含义不同。前者直接给出 Pauli 算符概率,后者 p 表示“发生非恒等操作的总概率”,且三轴均分。混用时需换算,否则会高估或低估噪声强度。
综上,四类信道各有明确的 Kraus 表示和物理对应。在 Qiskit 或 Cirq 中,只要固定随机种子、按物理过程放置噪声、并明确参数来源,就能构建可复现的噪声仿真环境,为后续的鲁棒性评估提供稳定基线。