变分量子算法的优化与贫瘠高原

系统讲解变分量子算法的优化理论与贫瘠高原问题:从参数化电路与经典优化器的统一框架讲起,逐项拆解代价函数梯度的参数移位规则与有限差分、贫瘠高原的定义与成因、梯度方差随量子比特数指数衰减的推导、局部代价函数与结构化 ansatz 等缓解手段、COBYLA/SPSA/Adam 的选型与收敛诊断、非凸地形与局域极小,并给出 Qiskit 与 PennyLane 的可运行代码示例。

引言

VQE、QAOA、变分分类器——这些统称为**变分量子算法(VQA)**的方法,结构惊人地一致:一个带参数的量子电路当「假设函数」,一台经典计算机当「优化器」,两者反复迭代直到代价函数收敛。这条路线之所以在 NISQ 时代成为主流,是因为它只用浅线路,把深线路的容错负担换成了「经典优化」这个可外包的负担。

但这条路线有一个著名的暗礁:贫瘠高原(barren plateau)。当线路足够深、纠缠足够强时,代价函数的梯度会随量子比特数指数级消失,优化器看到的是一片平坦的荒漠。本文从 VQA 的统一框架讲起,推导贫瘠高原的梯度方差衰减,逐项分析成因与缓解手段,讨论优化器选型与收敛诊断,最后给出 Qiskit 与 PennyLane 的代码。

前置:混合量子经典计算 、QAOA 、量子机器学习 。


目录


1. 变分量子算法的统一框架

VQA 由三部分组成:

1. 参数化量子电路(ansatz)U(θ)
   把初态映射为 |ψ(θ)⟩ = U(θ)|0...0⟩,θ 有 m 个可调参数
2. 代价函数 C(θ)
   通常为期望值 C(θ) = ⟨ψ(θ)| H |ψ(θ)⟩
   或分类损失、保真度等更一般的目标
3. 经典优化器
   迭代 θ ← θ - η∇C(θ),梯度可由量子设备估计
迭代循环:
  初始化 θ_0
  repeat:
      量子设备:制备 |ψ(θ)⟩,测量若干次 → 估计 C(θ) 或 ∇C(θ)
      经典设备:根据估计更新 θ
  until 收敛
→ 量子设备只做「前向传播」,经典设备做「反向传播」

心智:VQA 把「深线路」换成了「多次浅线路调用 + 经典优化」——这正是 NISQ 时代的核心权衡。代价是优化问题本身可能很难(非凸、梯度消失),且每次梯度估计都要多次采样,量子资源被「迭代次数 × 采样次数」放大。


2. 代价函数与参数化电路

两类参数化门:单比特旋转门 R_x(θ) = exp(-iθX/2) 等,参数直接是旋转角、梯度解析可算;双比特纠缠门 CNOT / CZ / iSWAP 通常无参数,负责产生纠缠、扩大可达态空间。

硬件高效 ansatz:交替堆叠「单比特旋转层 + 纠缠层」,层数 L 可调,参数数 m ≈ L·n。它匹配硬件连通性,但缺乏物理动机,是贫瘠高原的重灾区。

问题启发 ansatz:UCCSD 从 Hartree-Fock 参考态出发用费米子激发算符构造,参数数 O(n^4)(截断后);QAOA 交替代价层与混合层,参数只有 2p 个,物理意义清晰。

ansatz 类型参数规模优点缺点
硬件高效O(L·n)匹配连通性易贫瘠高原、可解释性差
UCCSDO(n^4) 截断物理动机强线路深、参数多
QAOA2p参数少、结构清晰需大量层数才精确
自适应(ADAPT)动态增长参数少且高效每步需测梯度排序

心智:ansatz 的设计是 VQA 的第一性决策——它同时决定了「能表达什么解」和「优化是否可行」。硬件高效 ansatz 看似灵活,实则是贫瘠高原的重灾区;结构化、有物理动机的 ansatz 才是可持续的路线。


3. 梯度的计算:参数移位规则与有限差分

参数移位规则(parameter-shift rule):对形如 U(θ) = exp(-iθP/2)(P 为泡利算符)的门,代价函数的梯度可精确写成两个移位期望值之差:

∂C/∂θ_j = [ C(θ_j + π/2) - C(θ_j - π/2) ] / 2
推导要点:
  U(θ) = cos(θ/2)·I - i·sin(θ/2)·P,∂U/∂θ = -(i/2)·P·U
  代入 C(θ) = ⟨0|U†HU|0⟩ 展开,三角恒等式给出上式
→ 无需额外线路,只需把该参数 ±π/2 各跑一次

代价:每个参数需 2 次额外的量子线路评估,m 个参数每轮梯度需 2m 次线路加有限采样,远高于经典反向传播。

有限差分(不推荐,仅作兜底):∂C/∂θ_j ≈ [C(θ_j+h) - C(θ_j-h)]/(2h),有 O(h^2) 系统偏差,采样噪声被 1/h 放大;h 太小被噪声淹没,太大则偏差显著。

# PennyLane:参数移位规则是默认梯度
import pennylane as qml
from pennylane import numpy as np

dev = qml.device("default.qubit", wires=2)

@qml.qnode(dev, diff_method="parameter-shift")
def cost(params):
    qml.RY(params[0], wires=0)
    qml.CNOT(wires=[0, 1])
    qml.RY(params[1], wires=1)
    return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1))

params = np.array([0.3, 0.7], requires_grad=True)
print(qml.grad(cost)(params))   # 内部用参数移位规则

心智:参数移位规则是「量子版的解析梯度」——它把梯度精确表达为两次移位线路之差,避免有限差分的偏差与噪声放大。代价是每个参数两倍线路开销,这也是 VQA 量子资源消耗的主要来源。


4. 贫瘠高原的定义与现象

现象:当 ansatz 用随机参数初始化、且线路足够深时,代价函数的梯度在所有方向上指数级趋近于零,且梯度的方差随量子比特数 n 指数衰减。

形式化:对随机初始化的 θ,
  E[∂C/∂θ_j] = 0(无偏,代价函数在随机点处近似平坦)
  Var[∂C/∂θ_j] ∝ exp(-c·n),c > 0 为常数
→ 梯度信号幅度 ~ exp(-c·n/2)
  要分辨它,需采样次数 ~ exp(c·n)
→ 优化器「看到」一片没有信息的平原

与经典梯度消失的区别:经典深度学习的梯度消失由激活函数饱和或深链式法则引起,可用残差连接、归一化缓解;量子贫瘠高原由随机电路的「设计性」引起,是电路作为整体的性质,与具体损失无关。

如何观测:固定 n 随机采 θ,计算 ∂C/∂θ_j 的方差,对 n = 4, 6, 8, 10, 12 重复;方差在半对数图上近似线性下降,即指数衰减——这是判定「是否身处贫瘠高原」的标准做法。

心智:贫瘠高原是「设计性」的,不是「训练性」的——它在随机初始化时就存在,与代价函数的具体形状无关。判定方法是画出梯度方差对 n 的半对数曲线:若近似直线下降,就已经在高原上。


5. 梯度方差指数衰减的推导

设定:代价函数 C(θ) = ⟨ψ(θ)|H|ψ(θ)⟩,H 为全局可观测量(如 Z_1 ⊗ ... ⊗ Z_n),ansatz 是 2-设计的随机电路。

关键结果(McClean 等,2018):
  若 ansatz 在参数分布上形成 2-设计,且 H 的展开不含单位算符项
  则 E_θ[∂C/∂θ] = 0,且
     Var_θ[∂C/∂θ] = f(n) · ||H||^2 / (2^(2n) - 1)
→ 方差以 2^(-2n) 衰减,即梯度幅度 ~ 2^(-n)

直觉:单参数 θ_j 只影响一个小角度旋转,其贡献被线路其余
      部分的随机化稀释;2-设计下任何局部算子的期望都以
      1/dim = 2^(-n) 的因子收缩

全局与局部可观测量的关键区别:

全局可观测量(Z^⊗n):梯度方差 ~ 2^(-2n) → 指数衰减
局部可观测量(单比特 Z_1):梯度方差 ~ 常数 → 与 n 无关
→ 这是「局部代价函数」缓解贫瘠高原的数学依据
可观测量类型梯度方差随 n 的标度结论
全局(Z^⊗n)exp(-c·n)贫瘠高原
局部(单比特 Z)常数无贫瘠高原
少数比特局域随支撑集增大而衰减折中

心智:贫瘠高原的数学根源是「全局可观测量在高维空间中的期望被稀释」——这正是「局部代价函数」为什么能救场:把 Z^⊗n 换成若干个单比特 Z_i 之和,梯度方差就不再随 n 指数衰减。


6. 贫瘠高原的成因

成因一:随机电路的 2-设计性
  深层随机电路在参数分布上接近 Haar 随机(2-设计)
  → 输出态在希尔伯特空间均匀分布,区分性信号被抹平

成因二:纠缠增长与线路深度
  层数 L 越大、纠缠越强 → 越接近 2-设计
  存在临界深度 L*,超过后梯度方差指数衰减

成因三:全局可观测量与全局代价函数
  C = ⟨Z_1 ⊗ ... ⊗ Z_n⟩ 需估计全部比特的关联
  → 方差 ~ 2^(-2n),最直接的「放大器」

成因四:硬件噪声
  噪声本身也贡献随机化,即使 ansatz 理论上不是 2-设计
  → 噪声诱导的贫瘠高原是 NISQ 上更现实的威胁

心智:贫瘠高原的四个成因可归结为一句话——「电路越随机、可观测量越全局,梯度越平」。硬件噪声还额外扮演「加速随机化」的角色,使 NISQ 设备上的贫瘠高原比理论预期更早出现。


7. 缓解手段

手段一:局部代价函数。把全局可观测量拆成局部项之和:C_global = ⟨Z_1 ⊗ ... ⊗ Z_n⟩ 换成 C_local = Σ_i ⟨Z_i⟩,梯度方差不再随 n 指数衰减。代价是局部代价函数的最小值不一定是全局目标的最优,需保证「局部最优 → 全局目标也优」。

手段二:结构化 / 分层 ansatz。只让参数出现在浅层或特定层,使用问题启发的 ansatz(QAOA、UCCSD),或分层训练(逐层加深度),避免整体接近 2-设计。

手段三:初始化策略。身份块初始化(把参数初始化在 U(θ) = I 附近)、小参数初始化(θ ~ N(0, σ^2),σ 小)、经典 warm start,让优化从「有梯度」的区域开始。

手段四:梯度缩放与自然梯度。用参数移位规则估计梯度后乘缩放因子补偿衰减;量子自然梯度(QNG)用 Fubini-Study 度量的逆预条件梯度,改善病态地形,但度量估计本身成本高。

手段针对成因效果代价
局部代价函数全局可观测量方差不再指数衰减可能改变最优解
结构化 ansatz随机化远离 2-设计表达能力受限
身份块初始化初始化点起步有梯度可能仍会衰减
梯度缩放 / QNG病态地形改善收敛度量估计昂贵
浅线路深度直接避开表达力不足

心智:缓解手段的核心是「不让电路变成随机 2-设计,也不让可观测量是全局的」——局部代价函数与结构化 ansatz 是最有效的两条,初始化策略是辅助。但没有免费午餐:所有缓解都在「表达能力」与「可优化性」之间做权衡。


8. 优化器选型与收敛诊断

无梯度优化器(NISQ 常用):

COBYLA:约束优化的线性近似,对噪声鲁棒、广泛用于 VQE
        缺点:收敛慢,参数多时表现差
Nelder-Mead:单纯形法,实现简单,但高维退化、易早停
SPSA(同时扰动随机近似):
  每次迭代只扰动所有参数的一个随机方向
    θ± = θ ± c_k · Δ_k(Δ_k 为随机 ±1 向量)
    梯度估计 = [C(θ+) - C(θ-)] / (2 c_k) · Δ_k^(-1)
  优点:每次迭代仅需 2 次评估,与参数数无关
  缺点:收敛慢、噪声敏感

有梯度优化器:Adam / SGD 需要参数移位规则提供梯度,收敛快但梯度估计噪声被放大、需大量采样;BFGS / L-BFGS-B 收敛快、精度高,但对噪声敏感,适合模拟器。

收敛诊断:看代价函数曲线是否单调下降、梯度范数是否指数衰减(贫瘠高原信号)、多次随机重启结果方差是否过大(局域极小信号)、参数是否在「无信息」区域乱走。出现「梯度范数小 + 多次重启结果分散」几乎可确诊贫瘠高原。

from scipy.optimize import minimize
import numpy as np

def cost_fn(params):
    return float(cost(params))   # cost 为上面的 PennyLane qnode

res = minimize(cost_fn, np.random.uniform(0, 2 * np.pi, 2),
               method="COBYLA", options={"maxiter": 200, "tol": 1e-6})
print(res.fun, res.x)

心智:优化器选型是「噪声鲁棒性」与「收敛速度」的权衡——NISQ 上首选无梯度方法(COBYLA、SPSA)以规避梯度估计的采样开销,模拟器上可用 Adam/BFGS 追求精度。诊断贫瘠高原的黄金组合是「梯度范数曲线 + 多次随机重启」。


9. 局域极小与非凸地形

VQA 的优化地形高度非凸:参数空间维度 m = O(n·L),代价函数是三角函数的多项式组合,存在大量局域极小与鞍点。

贫瘠高原:梯度处处极小(全局平坦)→ 无法优化
局域极小:局部平坦但存在下降方向 → 可能靠重启逃脱
两者症状相似(都表现为优化停滞),但应对不同

缓解局域极小的策略:多次随机重启取最优;warm start 从经典解附近出发;过参数化(参数数 m 远大于问题所需时,经验上局域极小减少);分层训练或逐步增加深度;参数扰动跳出(模拟退火、遗传算法)。

过参数化的启示:经典深度学习里过参数化反而更易训练,量子 VQA 也观察到类似现象——m 小于临界值 m* 时存在大量局域极小,m 超过 m* 后局域极小消失、优化变容易。但过参数化会加剧贫瘠高原(更多参数 → 更接近 2-设计),「可训练性」与「表达力」在此也相互拉扯。

心智:局域极小与贫瘠高原都会让优化停滞,但本质不同——前者是「地形坑洼」,可靠重启与 warm start 缓解;后者是「地形整体被压平」,必须从代价函数与 ansatz 结构入手。分清二者,才能选对药方。


10. 与 VQE 和 QAOA 的关系

VQE:C(θ) = ⟨ψ(θ)|H|ψ(θ)⟩,H 为分子哈密顿量。若 H 是全局的且 ansatz 深,贫瘠高原风险高;若用 UCCSD 等结构化 ansatz 加参考态初始化,风险显著降低。实践教训是:ansatz 与初值比优化器更重要。

QAOA:C(γ, β) = ⟨ψ(γ,β)|H_C|ψ(γ,β)⟩,线路结构固定(代价层 + 混合层交替),参数数只有 2p,远少于硬件高效 ansatz。p 趋于无穷时可达绝热路径,但固定 p 时梯度方差随 p 增长而衰减,同样存在「深度诱导的贫瘠高原」。缓解靠小 p 起步逐步增深、经典启发式初值、利用问题结构(如 MaxCut 的对称性)。

算法参数数贫瘠高原风险主要缓解
VQE(硬件高效)O(n·L)高结构化 ansatz、参考态初始化
VQE(UCCSD)O(n^4)中截断、ADAPT
QAOA(小 p)2p低逐步增 p、经典初值
变分分类器O(n·L)高局部损失、数据重上传

心智:VQE 与 QAOA 都逃不开贫瘠高原,只是触发条件不同——VQE 靠结构化 ansatz 与好初值把风险压下去,QAOA 靠「参数少 + 逐步增深」回避。共同教训是:在变分算法里,ansatz 结构与初始化的重要性往往超过优化器本身。


11. Qiskit 与 PennyLane 代码实践

用 Qiskit 搭建一个 VQE 并观察梯度方差:

import numpy as np
from qiskit import QuantumCircuit
from qiskit.circuit import ParameterVector
from qiskit.quantum_info import SparsePauliOp
from qiskit.primitives import StatevectorEstimator

n = 4
theta = ParameterVector("θ", 2 * n)

def ansatz(params):
    qc = QuantumCircuit(n)
    for i in range(n):
        qc.ry(params[i], i)            # 单比特旋转层
    for i in range(n - 1):
        qc.cx(i, i + 1)                # 纠缠层
    for i in range(n):
        qc.ry(params[n + i], i)
    return qc

H = SparsePauliOp("Z" * n)             # 全局可观测量
estimator = StatevectorEstimator()

def cost(params):
    qc = ansatz(params)
    return estimator.run([(qc, H)]).result()[0].data.evs

def param_shift_grad(cost, params, j, shift=np.pi / 2):
    """参数移位规则:对第 j 个参数做 ±π/2 移位"""
    p_plus = np.array(params, dtype=float)
    p_minus = np.array(params, dtype=float)
    p_plus[j] += shift
    p_minus[j] -= shift
    return 0.5 * (cost(p_plus) - cost(p_minus))

# 观察梯度方差随 n 的衰减(贫瘠高原实验)
for nn in [2, 4, 6, 8]:
    grads = [param_shift_grad(cost, np.random.uniform(0, 2 * np.pi, 2 * nn), 0)
             for _ in range(50)]
    print(f"n={nn}: Var[grad] = {np.var(grads):.3e}")
# 预期:方差随 n 指数下降 → 半对数图上近似直线

PennyLane 的局部代价函数对比:

import pennylane as qml
from pennylane import numpy as np

def make_cost(n, local=True):
    dev = qml.device("default.qubit", wires=n)

    @qml.qnode(dev, diff_method="parameter-shift")
    def cost(params):
        for i in range(n):
            qml.RY(params[i], wires=i)
        for i in range(n - 1):
            qml.CNOT(wires=[i, i + 1])
        for i in range(n):
            qml.RY(params[n + i], wires=i)
        if local:      # 局部代价:梯度方差与 n 无关
            return sum(qml.expval(qml.PauliZ(i)) for i in range(n)) / n
        return qml.expval(qml.PauliZ(0) @ qml.PauliZ(n - 1))  # 全局:衰减

    return cost

for n in [4, 6, 8, 10]:
    cl, cg = make_cost(n, True), make_cost(n, False)
    vl = np.var([qml.grad(cl)(np.random.uniform(0, 2 * np.pi, 2 * n))[0]
                 for _ in range(40)])
    vg = np.var([qml.grad(cg)(np.random.uniform(0, 2 * np.pi, 2 * n))[0]
                 for _ in range(40)])
    print(f"n={n}: local Var={vl:.3e}  global Var={vg:.3e}")

心智:代码实践的关键是「亲手画出梯度方差对 n 的曲线」——把全局与局部代价函数放在一起对比,就能直观看到贫瘠高原的指数衰减与局部代价函数的救场效果。这比任何文字描述都更有说服力。


速查表

主题结论
VQA 三要素参数化电路 + 代价函数 + 经典优化器
梯度计算参数移位规则:±π/2 两次评估,精确无偏
梯度成本每参数 2 次线路评估,是量子资源主要消耗
贫瘠高原梯度方差 ∝ exp(-c·n),随机初始化即存在
数学根源全局可观测量在高维空间中的期望被稀释
判定方法梯度方差对 n 的半对数图近似直线
主要缓解局部代价函数、结构化 ansatz、好初始化
局部代价梯度方差与 n 无关(单比特 Z 之和)
优化器NISQ 用 COBYLA/SPSA,模拟器用 Adam/BFGS
局域极小靠重启、warm start、过参数化缓解
与深度关系超过临界深度 L* 即进入高原
噪声影响噪声诱导的贫瘠高原比理论更早出现

一句话记忆:变分量子算法用「参数化电路 + 经典优化器」的迭代循环,把深线路的容错负担换成经典优化负担;代价函数的梯度可由参数移位规则精确给出,但每个参数需两倍线路开销;当 ansatz 足够深、足够随机(接近 2-设计)且代价函数是全局可观测量时,梯度方差会随量子比特数指数衰减——这就是贫瘠高原,它在随机初始化时就存在、与具体损失无关;数学根源是全局可观测量在高维希尔伯特空间中的期望被稀释,因此「局部代价函数 + 结构化 ansatz + 好初始化」是最有效的三味药;局域极小与贫瘠高原症状相似但本质不同,前者可靠重启逃脱、后者必须改结构;在 VQA 里,ansatz 结构与初始化的重要性往往超过优化器本身。(延伸见 混合量子经典计算 、QAOA 。)


延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「quantum」更多文章

  1. 开放量子系统与退相干建模:密度矩阵、Kraus 与 Lindblad 方程
  2. 量子基准测试与性能指标:保真度、量子体积与 CLOPS
  3. 量子编译器与电路转译:从逻辑线路到硬件脉冲