2. 变分量子线路ansatz深度与纠缠层数的调参选择

问题设定与硬件高效ansatz结构

本节固定量子比特数 n=4,目标哈密顿量取横场伊辛模型的一维链形式(示例设定):

H = -J Σ_{i=0}^{n-2} Z_i Z_{i+1} - h Σ_{i=0}^{n-1} X_i,   J=1.0, h=0.8

我们要比较的 ansatz 是硬件高效型 TwoLocal 结构:每层由单比特旋转层 RY(θ) 加纠缠层组成,纠缠层采用环形 CX 连接(0-1,1-2,2-3,3-0),以模拟超导芯片上可实现的近邻耦合。可调结构参数有两个:

  • reps:旋转+纠缠块的重复次数,决定线路深度;
  • entanglement:纠缠层模式,取 "linear"(3 个 CX)或 "full"(6 个 CX,全连接对)。

参数总量由结构直接决定:num_params = n × (reps + 1),与纠缠模式无关——这一点是理解“表达力 vs 参数预算”折中的关键。

4 比特 TwoLocal ansatz:结构参数网格 结构示意(reps=2, entanglement=linear) q0q1 q2q3 RYRY RYRY RYRY RYRY 蓝框=可训练 RY 旋转层 橙线=CX 纠缠层(linear 模式) 网格:reps × entanglement reps entanglement CX 数 参数数 1linear38 1full68 2linear612 2full1212 3linear916 3full1816 参数数 = n×(reps+1) = 4×(reps+1),与纠缠模式无关 选择判据(给定优化预算) ① 训练损失收敛到目标阈值以下;② 参数数不超过预算上限;③ 同等损失下优先更浅/更少 CX 的结构。

可运行实现:构建、训练与网格比较

下面用 Qiskit 的 TwoLocal 与 StatevectorSampler 构建线路,用参数化期望值作为损失,采用 COBYLA 优化器在固定迭代预算下训练。所有结构参数在同一个循环里遍历,保证比较条件一致。

import numpy as np
from qiskit import QuantumCircuit
from qiskit.circuit.library import TwoLocal
from qiskit.quantum_info import SparsePauliOp, Statevector
from scipy.optimize import minimize

n = 4
J, h = 1.0, 0.8

# 目标哈密顿量:横场伊辛链
terms = []
for i in range(n - 1):
    z = ["I"] * n
    z[i] = z[i + 1] = "Z"
    terms.append(("".join(z), -J))
for i in range(n):
    x = ["I"] * n
    x[i] = "X"
    terms.append(("".join(x), -h))
H = SparsePauliOp.from_list(terms)

def build_ansatz(reps, entanglement):
    return TwoLocal(
        num_qubits=n,
        rotation_blocks=["ry"],
        entanglement_blocks=["cx"],
        entanglement=entanglement,
        reps=reps,
        insert_barriers=False,
    )

def loss_fn(params, ansatz):
    qc = ansatz.assign_parameters(params)
    psi = Statevector(qc)
    return float(np.real(psi.expectation_value(H)))

def run_grid(reps_list, ent_list, maxiter=200, seed=7):
    rng = np.random.default_rng(seed)
    results = []
    for reps in reps_list:
        for ent in ent_list:
            ansatz = build_ansatz(reps, ent)
            n_params = ansatz.num_parameters
            x0 = rng.uniform(-0.1, 0.1, n_params)
            res = minimize(
                loss_fn, x0, args=(ansatz,),
                method="COBYLA",
                options={"maxiter": maxiter, "tol": 1e-6},
            )
            results.append({
                "reps": reps,
                "entanglement": ent,
                "cx_count": ansatz.count_ops().get("cx", 0),
                "num_params": n_params,
                "loss": res.fun,
                "nfev": res.nfev,
            })
    return results

if __name__ == "__main__":
    rows = run_grid([1, 2, 3], ["linear", "full"])
    print(f"{'reps':>4} {'ent':>7} {'CX':>4} {'params':>7} {'loss':>10} {'nfev':>6}")
    for r in rows:
        print(f"{r['reps']:>4} {r['entanglement']:>7} {r['cx_count']:>4} "
              f"{r['num_params']:>7} {r['loss']:>10.4f} {r['nfev']:>6}")

运行方式:保存为 ansatz_grid.py,执行 python ansatz_grid.py。输出是一张 6 行的表,每行对应一个结构组合。注意 loss 是期望值(越小越好),nfev 是优化器实际调用损失函数的次数,用来判断是否在预算内收敛。

结果判读与结构选择

由于初始参数是随机采样、优化器是局部搜索,不同结构的结果会有波动,因此判读时不要只看单次最低损失,而应结合以下三点:

  • 收敛性:nfev 接近 maxiter 说明优化未充分收敛,此时损失偏高不代表结构表达力不足,应先放宽预算再比较。
  • 表达力:在相同 reps 下,full 纠缠的 CX 数约为 linear 的两倍,通常能更快降低损失,但线路更深、噪声敏感度更高。
  • 参数预算:reps 每增加 1,参数数增加 4。若预算上限为 12 个参数,则 reps=2 是上限;此时 linear 与 full 参数数相同,应优先比较损失与 CX 数。
建议对每个结构用 3~5 个不同随机种子重复训练,取损失的中位数与最小值,避免把单次偶然的低损失误判为结构优势。

结构选择决策表(示例)

预算上限候选结构参数数CX 数选择建议
8reps=1, linear83预算最紧时首选,线路最浅
8reps=1, full86若 linear 损失不达标,再试 full
12reps=2, linear126损失与深度折中,推荐默认
12reps=2, full1212损失优先、可接受更深线路时选用
16reps=3, linear169预算充足时提升表达力

最终选择逻辑:先按预算筛掉参数超限的结构,再在剩余候选中比较训练损失;若损失差距小于重复实验的波动范围,则选 CX 数更少、reps 更小的结构,以降低硬件执行误差与训练成本。