3. 混合量子-经典架构设计
混合量子-经典架构的核心问题不是“量子处理器能不能算”,而是“哪些计算应该交给量子处理器、哪些必须留在经典侧,以及两侧如何交换数据与控制信号”。量子处理器(QPU)擅长处理希尔伯特空间中的态制备、纠缠演化与测量采样,但受限于相干时间、门保真度、测量次数和量子比特数;经典处理器(CPU/GPU)擅长参数更新、梯度估计、数据预处理、优化器迭代与结果统计。二者分工的本质,是把一个训练任务拆成“量子可执行子程序”和“经典可执行子程序”,再通过明确的接口把它们串起来。
一、分工模式:谁负责什么
在典型的变分量子机器学习(VQML)中,量子侧通常承担参数化量子电路(PQC)的态制备与测量,输出的是关于可观测量 ⟨O⟩ 的期望值或采样计数;经典侧则负责损失函数计算、梯度估计、参数更新、收敛判断以及数据编码前的特征工程。以一个小型分类任务为例:经典侧先把 4 维特征归一化并编码为旋转角,量子侧执行 3 层 RY-CNOT 电路并测量 Z 基,经典侧根据测量结果计算交叉熵损失,再用梯度下降更新 12 个旋转参数。这里量子侧不保存参数历史,经典侧不直接操作量子态,二者通过“参数向量—测量结果”这一对接口耦合。
分工模式可以进一步细分为三类:量子主计算型(量子侧完成大部分态演化,经典侧只做后处理)、经典主控型(经典侧决定电路结构、参数和测量基,量子侧作为可调用加速器)、交替迭代型(两侧在每一轮训练中反复交换信息,最常见)。选择哪种模式,取决于任务对量子资源的需求、经典侧可用的优化算法以及硬件是否支持批量提交。
二、数据流与控制流
数据流描述“数据从哪里来、经过什么变换、到哪里去”。在混合训练中,数据流通常为:经典数据集 → 特征预处理 → 角度编码/振幅编码 → 量子态演化 → 测量采样 → 期望值/概率分布 → 损失与梯度 → 参数更新。控制流描述“谁在什么时候决定下一步做什么”,包括:经典侧判断是否继续迭代、选择下一组参数、决定测量基或电路深度、触发量子任务提交、处理超时与重试。
一个容易被忽略的细节是:量子测量具有随机性,单次采样不能直接作为损失输入。工程上通常采用 shots 次重复测量取均值,例如 shots=4096 时,期望值估计的标准误差约为 1/√shots。这意味着数据流中必须包含“采样—统计—估计”这一层,否则梯度会被噪声淹没。控制流则要决定:是每轮都重新提交量子任务,还是把多组参数打包成批任务一次提交。
三、同步与异步执行策略
同步执行是最直观的策略:经典侧提交一组参数,阻塞等待量子侧返回测量结果,再计算损失并更新参数,然后进入下一轮。它的优点是逻辑简单、状态一致、易于调试;缺点是量子硬件排队和编译延迟会直接拖慢整个训练循环。假设单次量子任务提交到返回需要 2 秒,训练 200 轮就需要约 400 秒,其中大部分时间经典侧处于空闲。
异步执行则把“提交”和“消费”解耦:经典侧维护一个参数队列,量子侧以批任务方式并行执行多组电路,结果通过回调或轮询写入结果缓冲区,经典侧从缓冲区取结果继续优化。例如,把 8 组不同参数打包成一个 batch 提交,量子侧一次编译执行,经典侧在等待期间可以准备下一批参数或做数据增强。异步策略能显著提升吞吐,但引入了新的问题:结果与参数的对应关系必须严格标记,否则会出现“参数—结果错配”;同时,异步梯度可能基于稍旧的参数计算,需要控制滞后步数。
四、一个可参考的配置样例
下面给出一个混合训练循环的伪代码配置,展示参数打包、批量提交与结果回收的基本结构。示例参数为教学假设,不代表真实硬件实测值。
# 混合训练循环(异步批量提交示例)
shots = 4096
batch_size = 8 # 每批提交8组参数
max_iter = 200
lr = 0.05
tol = 1e-4
params = init_params(n_layers=3, n_qubits=4) # 12个旋转参数
buffer = {} # key: task_id, value: (params, expectation)
for step in range(max_iter):
batch = sample_neighbors(params, batch_size) # 生成候选参数
task_ids = qpu.submit_batch(circuit, batch, shots) # 非阻塞提交
# 经典侧在等待期间做数据准备或下一批参数生成
prepare_next_batch()
results = qpu.collect(task_ids, timeout=30) # 回收结果
grads = estimate_gradient(results, batch) # 参数移位或SPSA
params = params - lr * grads
loss = compute_loss(results)
if abs(loss - prev_loss) < tol:
break
prev_loss = loss
在这段流程中,submit_batch 与 collect 的分离是异步的关键;task_ids 保证结果可追溯;timeout 用于处理量子任务超时。若改为同步,只需把 submit_batch 和 collect 合并为一次阻塞调用,逻辑更简单但吞吐下降。
五、设计时需要检查的几个点
- 接口一致性:参数向量的顺序、维度、编码方式必须与量子电路中的门序列严格对应,任何错位都会导致训练不收敛。
- 测量噪声与 shots:shots 越大,期望值估计越稳,但单轮耗时越长;需要在方差和延迟之间取平衡。
- 梯度估计方法:参数移位规则精确但需要 2N 次电路执行;SPSA 只需 2 次但方差较大,适合量子资源紧张的场景。
- 异步滞后控制:若使用异步梯度,应限制参数版本落后不超过 1~2 步,否则优化方向可能失真。
- 失败重试:量子任务可能因校准、排队或硬件错误失败,控制流中应包含重试与降级策略。
总体而言,混合量子-经典架构设计的关键,是把量子侧当作一个“有延迟、有噪声、可批量调用”的加速器,把经典侧当作“调度、优化与统计”的主控。数据流决定信息如何流动,控制流决定训练如何推进,同步与异步则决定这套流水线在实际硬件上的吞吐与稳定性。