一旦您的量子生成模型,无论是量子电路玻恩机 (QCBM) 还是量子生成对抗网络 (QGAN) 的生成器部分,完成训练,下一步就是生成新的数据点。这个过程主要基于量子力学的测量公设。执行训练好的量子电路会准备一个特定的量子态 $\psi(\theta)$,对这个态进行测量会根据态本身确定的概率分布给出结果。取样的测量过程从量子生成模型取样包含以下基本步骤:准备量子态: 执行训练好的量子电路。对于 QCBM,这是定义玻恩机的电路 $U(\theta)$。对于 QGAN,这是生成器电路 $G(\theta)$。参数 $\theta$ 被固定为训练期间获得的值。如果模型需要输入(例如某些 QGAN 的潜在噪声向量),则在执行前提供此输入。进行测量: 对电路的输出量子比特进行测量。通常,测量是在计算基($Z$ 基)下完成的。测量 $n$ 个量子比特会得到一个 $n$ 比特的经典字符串 $x$。重复: 重复步骤 1 和 2 多次(通常称为“shot”或“发射次数”)。每次重复产生一个样本 $x$。这些样本的集合趋近于量子电路学到的概率分布 $p_{\text{model}}(x)$。对于准备态 $|\psi(\theta)\rangle$ 的 QCBM,测量计算基态 $|x\rangle$(由比特串 $x$ 表示)的概率由玻恩规则给出: $$ P(x) = |\langle x | \psi(\theta) \rangle|^2 $$ 因此,重复准备 $|\psi(\theta)\rangle$ 并在计算基下测量,可以直接产生按 $P(x)$ 分布的样本 $x$。对于 QGAN,生成器 $G(\theta)$ 的作用是将一个初始态(通常是 $|0\rangle^{\otimes n}$ 或有时取决于随机输入)转换成一个量子态 $|\psi_G(\theta)\rangle$,其测量概率接近目标数据分布。取样包括执行 $G(\theta)$ 并测量其输出量子比特。判别器不参与取样过程本身,只参与训练生成器。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial"]; edge [fontname="Arial"]; Input [label="初始态 |0...0⟩\n(或 QGAN 的潜在输入)", shape=ellipse, style=filled, fillcolor="#e9ecef"]; Circuit [label="训练好的量子电路\nQCBM: U(θ) 或 QGAN: G(θ)"]; Measurement [label="测量量子比特\n(计算基)", shape=invhouse, style=filled, fillcolor="#a5d8ff"]; Sample [label="生成的样本 x\n(经典比特串)", shape=ellipse, style=filled, fillcolor="#b2f2bb"]; Input -> Circuit; Circuit -> Measurement; Measurement -> Sample; subgraph cluster_process { label = "单个样本生成"; style=filled; color="#f8f9fa"; Circuit; Measurement; Sample; } Repeat [label="重复 N 次“shot”\n(用于 N 个样本)", shape=cds, style=dashed]; Sample -> Repeat [style=dashed]; Repeat -> Input [style=dashed, label="新的执行"]; }流程图,描绘了从训练好的量子生成模型生成单个样本并重复以获取多个样本的过程。实际考量高效且准确地生成样本涉及几个实际点:发射次数您执行电路和测量(即“发射次数”)的次数,影响着您的样本集合与真实潜在分布 $p_{\text{model}}(x)$ 的接近程度。通常,更多次的“发射”会带来更好的接近效果,但会增加计算成本(时间和资源)。选择“发射次数”通常需要根据后续任务的要求和可用的量子资源进行权衡。计算基取样虽然量子测量可以在各种基下进行,但生成模型取样几乎总是使用计算($Z$)基。这是因为目标通常是生成经典数据样本(例如表示图像或数值数据的比特串),而计算基提供了从量子测量结果到经典比特串的直接映射。硬件执行与测量误差在真实的量子硬件上运行时,取样过程会受到噪声影响。门误差: 量子门应用中的不完善,意味着准备好的量子态 $|\psi(\theta)\rangle$ 可能与理想态有所偏差。退相干: 与环境的相互作用可能在测量前破坏量子态。读出误差: 测量过程本身可能存在缺陷,将 $|0\rangle$ 错误地分类为 $|1\rangle$ 或反之。这些误差意味着从硬件获得的样本经验分布 $p_{\text{empirical}}(x)$ 可能与理想目标分布 $p_{\text{model}}(x)$ 明显不同。读出误差缓解技术通常在测量后应用,以校正样本计数并获得对预期分布的更准确估计。取样与评估的关联通过此过程生成的样本对于评估量子生成模型的性能很重要。在上一节中讨论的衡量指标,例如使用经典散度度量或最大均值差异 (MMD) 等特定测试来比较生成样本的分布与原始数据分布,都直接需要从训练好的模型中获得具有代表性的样本集。这里是一个使用类似 Qiskit 结构的取样代码示例:# 示例:使用类似 Qiskit 的语法 # 假设 'trained_circuit' 是 QCBM 或 QGAN 生成器的量子电路, # 且参数 theta 已经优化。 from qiskit import QuantumCircuit, transpile from qiskit_aer import AerSimulator # 使用模拟器 # 或者从 qiskit_ibm_provider import IBMProvider 来连接真实硬件 # 定义所需的样本数量 num_samples = 2048 # 假设 trained_circuit 是一个 QuantumCircuit 对象 # 为所有量子比特添加测量操作 trained_circuit.measure_all() # 选择后端(模拟器或真实硬件) # simulator = AerSimulator() # backend = simulator # 另外,对于硬件: # provider = IBMProvider() # backend = provider.get_backend('ibm_brisbane') # 示例后端 # 对于模拟 simulator = AerSimulator() compiled_circuit = transpile(trained_circuit, simulator) job = simulator.run(compiled_circuit, shots=num_samples) result = job.result() counts = result.get_counts(compiled_circuit) # 对于硬件 # compiled_circuit = transpile(trained_circuit, backend) # job = backend.run(compiled_circuit, shots=num_samples) # result = job.result() # 此调用可能会阻塞直到任务完成 # counts = result.get_counts(compiled_circuit) # 可选:如果使用硬件,应用测量误差缓解 # 'counts' 是一个字典:{'0010': 150, '1101': 45, ...} # 键是测量的比特串(样本),值是频率。 print(f"后端原始计数: {counts}") # 如有需要,将计数字典转换为样本列表 generated_samples = [] for bitstring, count in counts.items(): generated_samples.extend([bitstring] * count) print(f"已生成 {len(generated_samples)} 个样本。") # 这些样本现在可以用于评估或后续任务。 # 例如,将比特串 '0110' 转换为图像或特征等数据点。这种执行电路和测量的过程是获取量子生成模型所学信息的标准方法,将量子态表示转换回模仿原始数据集的经典数据样本。理解此取样过程的细节,特别是关于噪声和“发射次数”方面,对于有效使用和评估这些量子模型十分重要。