You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qiskit中为电路添加噪声模型并结合COBYLA训练自编码器?

含噪电路上训练量子自编码器的Qiskit实现方案

我正在使用Qiskit开展量子计算项目,尝试在含噪电路上训练量子自编码器。目前已完成噪声模型定义、量子电路构建、自编码器电路创建、SamplerQNN初始化及优化器定义,但不清楚如何将噪声模型有效应用到目标电路,并结合COBYLA优化器完成训练。


核心步骤:噪声模型与训练流程的集成

1. 补全噪声模型的定义

首先需要将自定义标签的门(x1/cx1/ccx1)关联到对应的噪声错误,完善噪声模型:

from qiskit.circuit.library import XGate, CXGate, CCXGate
from qiskit_aer.noise import NoiseModel, pauli_error

x_noise = XGate(label="x1")
cx_noise = CXGate(label="cx1")
ccx_noise = CCXGate(label="ccx1")
noise_bit_flip = NoiseModel()

p_gate1 = 0.05
# 定义单比特门的比特翻转错误
single_qubit_error = pauli_error([('X', p_gate1), ('I', 1 - p_gate1)])
# 定义双比特门的比特翻转错误
two_qubit_error = pauli_error([('XX', p_gate1**2), ('IX', p_gate1*(1-p_gate1)), 
                               ('XI', p_gate1*(1-p_gate1)), ('II', (1-p_gate1)**2)])
# 定义三比特门的比特翻转错误(简化版,可按需调整)
three_qubit_error = pauli_error([('XXX', p_gate1**3), ('IIX', p_gate1*(1-p_gate1)**2),
                                 ('IXI', p_gate1*(1-p_gate1)**2), ('XII', p_gate1*(1-p_gate1)**2),
                                 ('III', (1-p_gate1)**3)])

# 将错误绑定到对应标签的门
noise_bit_flip.add_quantum_error(single_qubit_error, "x1", [0])
noise_bit_flip.add_quantum_error(two_qubit_error, "cx1", [0, 1])
noise_bit_flip.add_quantum_error(three_qubit_error, "ccx1", [0,1,2])

2. 创建带噪声的Sampler实例

Qiskit的SamplerQNN通过Sampler后端获取概率分布,需将噪声模型绑定到Sampler:

from qiskit.primitives import Sampler

# 初始化带噪声的Sampler,指定噪声模型和采样次数
noisy_sampler = Sampler(backend_options={"noise_model": noise_bit_flip, "shots": 1024})

3. 初始化带噪声的SamplerQNN

修改SamplerQNN的初始化逻辑,传入带噪声的Sampler:

from qiskit_machine_learning.neural_networks import SamplerQNN

# 假设identity_interpret已定义,用于输出映射
def identity_interpret(x):
    return x

qnn = SamplerQNN(
    circuit=qc,
    input_params=[],
    weight_params=ae.parameters,
    interpret=identity_interpret,
    output_shape=2,
    sampler=noisy_sampler  # 绑定带噪声的Sampler
)

4. 结合COBYLA优化器完成训练

原有代价函数和优化器逻辑无需大幅修改,此时qnn.forward会自动调用带噪声的Sampler计算概率:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import COBYLA
from IPython.display import clear_output
import time

def cost_func_digits(params_values):
    probabilities = qnn.forward([], params_values)
    cost = np.sum(probabilities[:, 1])

    # 实时绘制代价函数变化
    clear_output(wait=True)
    objective_func_vals.append(cost)
    plt.title("Objective function value against iteration")
    plt.xlabel("Iteration")
    plt.ylabel("Objective function value")
    plt.plot(range(len(objective_func_vals)), objective_func_vals)
    plt.show()

    return cost

opt = COBYLA(maxiter=150)
objective_func_vals = []
plt.rcParams["figure.figsize"] = (12, 6)

# 初始化参数(维度需与ae.parameters数量一致)
initial_point = np.random.rand(len(ae.parameters))
start = time.time()
opt_result = opt.minimize(fun=cost_func_digits, x0=initial_point)

关键注意事项

  • 门标签严格匹配:确保全加器电路中使用的门确实带有x1/cx1/ccx1标签,否则噪声不会被应用到目标门。
  • 采样次数平衡:含噪模拟下,采样次数(shots)越多概率统计越准确,但训练耗时会增加,需根据需求调整。
  • 参数初始化:initial_point的维度必须与自编码器的可训练参数数量一致,建议使用随机初始化或硬件友好的初始值。

内容的提问来源于stack exchange,提问作者Comfy Sink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:30:35