4. 量子模型噪声建模与仿真环境搭建
要对量子模型的噪声鲁棒性做出可信分析,第一步不是写算法,而是把“噪声”变成可配置、可复现的仿真对象。本节围绕典型量子计算框架(以 Qiskit 与 Aer 模拟器为代表,Cirq、PennyLane 思路相通),完成三件事:搭建含噪仿真后端、把噪声模型参数化落地、部署一个可反复调用的基准量子模型。只有环境稳定、参数明确,后续章节的鲁棒性对比才有意义。
一、含噪仿真环境的基本构成
一个含噪仿真环境由四层组成:量子线路(待测模型)、噪声模型(描述错误如何发生)、仿真后端(执行演化与采样)、结果统计(从采样中提取指标)。噪声模型并非“加一个随机数”那么简单,它需要与真实硬件的错误率、门时长、退相干时间等物理量对应。常见噪声通道包括:
- 退极化噪声(Depolarizing):以概率 p 将量子态替换为完全混合态,常作为单/双比特门的粗粒度错误模型;
- 热弛豫噪声(Thermal Relaxation):由 T1(能量弛豫)与 T2(相位退相干)刻画,与门持续时间相关;
- 相位阻尼(Phase Damping):只损失相位信息、不改变布居,适合描述纯退相干;
- 读出错误(Readout Error):测量时 0/1 被翻转的概率,用 2×2 混淆矩阵表示;
- 相干过旋转/串扰:门角度偏差或邻近比特影响,可用过旋转通道近似。
这些通道在框架中通常以“指令—噪声映射”的方式挂载:把某个量子门或空闲时段绑定到某个噪声通道,从而在不改动线路逻辑的前提下注入错误。
二、噪声模型参数化配置
参数化的核心是把物理量翻译成框架可接受的参数。以 Qiskit 的 NoiseModel 为例,典型做法是先构造各通道,再通过 add_all_qubit_quantum_error 或 add_quantum_error 绑定到具体门。下面是一段可直接运行的示例配置(参数为教学假设值,非实测):
from qiskit_aer.noise import NoiseModel, depolarizing_error, thermal_relaxation_error, ReadoutError
from qiskit_aer.noise import coherent_unitary_error
import numpy as np
# 教学假设参数:单比特门 50ns,双比特门 300ns,T1=80us,T2=60us
t1, t2 = 80e3, 60e3 # 单位 ns
t_1q, t_2q = 50, 300
nm = NoiseModel(basis_gates=['id','rz','sx','x','cx'])
# 1) 单比特门:退极化 + 热弛豫
p1 = 8e-4
nm.add_all_qubit_quantum_error(depolarizing_error(p1, 1), ['sx','x'])
nm.add_all_qubit_quantum_error(
thermal_relaxation_error(t1, t2, t_1q), ['sx','x'])
# 2) 双比特门:退极化 + 热弛豫
p2 = 1.2e-2
nm.add_all_qubit_quantum_error(depolarizing_error(p2, 2), ['cx'])
nm.add_all_qubit_quantum_error(
thermal_relaxation_error(t1, t2, t_2q).tensor(
thermal_relaxation_error(t1, t2, t_2q)), ['cx'])
# 3) 读出错误:0->1 概率 2%,1->0 概率 5%
ro = ReadoutError([[0.98, 0.02],[0.05, 0.95]])
nm.add_all_qubit_readout_error(ro)
配置时有三点必须注意。第一,门时长要与热弛豫参数匹配:T1、T2 以 ns 为单位时,门时长也必须用 ns,否则退相干强度会被放大或缩小几个数量级。第二,噪声叠加顺序:同一门上同时挂退极化和热弛豫,等价于两个通道串联,总错误率并非简单相加,需通过仿真观察。第三,读出错误独立于门噪声,它作用在测量指令上,不要误加到门列表里。
三、基准量子模型的部署
基准模型要满足“小、可解释、对噪声敏感”三个条件,便于观察噪声影响。推荐使用 3 比特 GHZ 态制备线路:H 门作用于 q0,再依次 CX(q0,q1)、CX(q1,q2),最后全测量。理想情况下测量结果只应出现 000 与 111,各约 50%;噪声会引入 001、010 等错误比特串,其比例直接反映噪声强度。
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.measure([0,1,2], [0,1,2])
sim = AerSimulator(noise_model=nm, seed_simulator=42)
tqc = transpile(qc, sim, basis_gates=nm.basis_gates)
result = sim.run(tqc, shots=4096).result()
counts = result.get_counts()
print(counts)
部署时务必用 transpile 把线路编译到噪声模型声明的基组上,否则未声明的门不会获得噪声绑定,仿真结果会偏乐观。固定 seed_simulator 可保证同一配置下结果可复现,这是后续做参数扫描对比的前提。
四、结果判读与配置校验
运行后应观察三类信号:一是理想比特串(000/111)的占比,它随噪声增大而下降;二是错误比特串的分布是否对称,若明显偏向某一侧,往往提示读出矩阵设置不当;三是把噪声模型置空(NoiseModel())再跑一次,确认理想结果接近 50%/50%,以此验证线路本身无误。下图展示了从参数配置到结果判读的完整信号链与校验路径。
若空噪声对照下 000/111 仍明显偏离 50%,说明线路或测量映射有误,应先修线路再谈噪声;若对照正常而含噪结果错误串严重不对称,优先检查读出矩阵是否写反([[P(0|0),P(1|0)],[P(0|1),P(1|1)]] 的行列约定)。完成以上校验,环境即可作为后续鲁棒性分析的稳定基线。
basis_gates 传给 transpile,编译出的门可能不在噪声模型声明范围内,导致部分门“无噪声”执行,结果系统性偏乐观。