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 参数预算”折中的关键。
可运行实现:构建、训练与网格比较
下面用 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 数 | 选择建议 |
|---|---|---|---|---|
| 8 | reps=1, linear | 8 | 3 | 预算最紧时首选,线路最浅 |
| 8 | reps=1, full | 8 | 6 | 若 linear 损失不达标,再试 full |
| 12 | reps=2, linear | 12 | 6 | 损失与深度折中,推荐默认 |
| 12 | reps=2, full | 12 | 12 | 损失优先、可接受更深线路时选用 |
| 16 | reps=3, linear | 16 | 9 | 预算充足时提升表达力 |
最终选择逻辑:先按预算筛掉参数超限的结构,再在剩余候选中比较训练损失;若损失差距小于重复实验的波动范围,则选 CX 数更少、reps 更小的结构,以降低硬件执行误差与训练成本。