
本文介绍如何安全、可靠地按比例缩放 Qiskit NoiseModel 中单量子比特门和双量子比特门(如 CX)的错误概率,避免因直接序列化/反序列化导致的 NoiseError: 'error gate for instruction not recognized' 异常。
本文介绍如何安全、可靠地按比例缩放 qiskit `noisemodel` 中单量子比特门和双量子比特门(如 cx)的错误概率,避免因直接序列化/反序列化导致的 `noiseerror: 'error gate for instruction not recognized'` 异常。
在使用 Qiskit Aer 进行含噪声量子电路仿真时,常需基于真实设备的噪声特性(如 FakeManila)构建定制化噪声模型。一个典型需求是全局缩放所有错误强度(例如统一设为原始值的 10%),以模拟更理想或更可控的硬件环境。虽然从 FakeBackend 提取噪声模型非常便捷:
from qiskit.providers.fake_provider import FakeManila from qiskit.providers.aer.noise import NoiseModel manila_backend = FakeManila() nm_1 = NoiseModel.from_backend(manila_backend)
但直接修改 _local_quantum_errors 中 cx 等多量子比特门的错误对象并调用 .from_dict() 是不安全的——因为 QuantumError.from_dict() 在重建复合门错误(尤其是包含 Kraus 或 MixedUnitary 类型的 CX 错误)时,可能丢失底层门指令元信息,从而触发 NoiseError: 'error gate for instruction not recognized'。
✅ 正确做法是:跳过反序列化,改用 Qiskit 提供的原生错误构造器(如 depolarizing_error)创建新错误对象,确保其类型与原始错误兼容且语义明确。
✅ 推荐方案:按门类型与量子比特数构造缩放后的错误
Qiskit 的 depolarizing_error(p, num_qubits) 是最常用且鲁棒的选择,它生成标准的 n-量子比特去极化信道,其错误强度 p 可直接按比例缩放。注意:
- 单量子比特门(
x,y,z,h,s,t等)对应num_qubits=1 - 双量子比特门(如
cx)对应num_qubits=2
以下代码实现了对 FakeManila 噪声模型中所有支持门的 10% 错误缩放:
from qiskit.providers.fake_provider import FakeManila
from qiskit.providers.aer.noise import NoiseModel, depolarizing_error
manila_backend = FakeManila()
nm_1 = NoiseModel.from_backend(manila_backend)
scaling_factor = 0.1 # 缩放至原始强度的 10%
# 缩放所有单量子比特门(遍历常见门与默认 qubit 0;实际中建议遍历所有已注册 qubit 元组)
single_qubit_gates = ['x', 'y', 'z', 'h', 's', 't']
for gate in single_qubit_gates:
if gate in nm_1._local_quantum_errors:
# 获取任意一个已注册的单比特配置(如 (0,)),提取其原始错误强度 p
for qubits, error in nm_1._local_quantum_errors[gate].items():
if hasattr(error, 'p'): # 确保是可缩放的 depolarizing 类型
new_p = error.p * scaling_factor
new_error = depolarizing_error(new_p, 1)
nm_1._local_quantum_errors[gate][qubits] = new_error
break # 仅处理首个配置作为示例;生产环境应遍历全部
# 缩放特定 CX 门(如 (3,4)),同理
if 'cx' in nm_1._local_quantum_errors:
cx_errors = nm_1._local_quantum_errors['cx']
for qubits, error in cx_errors.items():
if hasattr(error, 'p'):
new_p = error.p * scaling_factor
new_error = depolarizing_error(new_p, 2) # 注意:num_qubits=2
nm_1._local_quantum_errors['cx'][qubits] = new_error
⚠️ 注意事项与最佳实践
-
不要依赖私有属性
_local_quantum_errors:它是内部实现细节,未来版本可能变更。理想方式是通过NoiseModel.add_quantum_error()重构整个模型(但当前需手动遍历原始 backend 的properties()获取完整错误映射)。 -
并非所有错误都是
depolarizing_error:FakeBackend可能包含amplitude_damping_error、thermal_relaxation_error或Kraus自定义错误。上述方法仅适用于p属性存在的DepolarizingError。若需处理混合类型,请先用error.to_dict()['type']判断类型,再选择对应构造器(如amplitude_damping_error(γ * scaling_factor))。 -
验证缩放效果:可通过
nm_1.get_quantum_error('x', (0,))检查p值是否已更新,或运行小规模电路对比噪声统计。 -
扩展性建议:对大规模后端(如
FakeLagos),应封装为函数,自动遍历backend.properties().gates获取所有门与 qubit 组合。
通过该方法,你不仅能规避 NoiseError 异常,还能确保噪声模型的物理一致性与仿真稳定性,为噪声鲁棒性研究、误差缓解算法测试等任务提供可控基准。










