跳转至

VQE算法完整数据流向图

算法架构概览

┌─────────────────────────────────────────────────────────────────────────┐
│                         VQE 算法完整数据流                                │
│                                                                          │
│  经典优化器 ←→ 参数传递 ←→ 量子电路 ←→ 态矢量演化 ←→ 哈密顿量期望        │
│                                                                          │
└─────────────────────────────────────────────────────────────────────────┘

详细数据流向图

🔄 完整迭代循环

graph TB
    Start([开始VQE优化]) --> Init[初始化参数<br/>θ₀ ∈ ℝⁿ]

    Init --> Loop{优化器循环<br/>maxiter=50}

    Loop --> |迭代k| OptGen[经典优化器生成新参数<br/>θₖ = θₖ₋₁ + αₖ∇L]

    OptGen --> |np.float64向量| ParamInject[Qibo电路参数注入<br/>circuit.set_parameters θₖ]

    ParamInject --> |参数映射| GateUpdate[更新门参数<br/>RY(q, θₖᵢ)]

    GateUpdate --> |θₖ注入| StatePrep[态矢量初始化<br/>|0⟩ⁿ]

    StatePrep --> |Hadamard层| CircuitExec[执行参数化电路<br/>U(θₖ)]

    CircuitExec --> |量子态演化| StateGen[生成量子态<br/>|ψ(θₖ)⟩ = U(θₖ)|0⟩]

    StateGen --> |态矢量| ExpectCalc[计算期望值<br/>E = ⟨ψ|H|ψ⟩]

    ExpectCalc --> |Scalar标量| Feedback[反馈能量值给优化器<br/>L(θₖ) = E]

    Feedback --> |计算梯度| GradCalc[梯度计算<br/>∇L = ∂E/∂θ]

    GradCalc --> |收敛检查| Check{收敛?}

    Check --> |否| Loop
    Check --> |是| End([返回最优参数<br/>θ* 和基态能量 E₀])

    style OptGen fill:#e1f5ff
    style ParamInject fill:#fff4e1
    style CircuitExec fill:#f0e1ff
    style ExpectCalc fill:#ffe1f0
    style Feedback fill:#e1ffe1

六大核心步骤详解

📍 步骤1: 经典优化器生成参数向量

graph LR
    A[优化器状态] --> B[生成候选参数<br/>θₖ]
    B --> C[数据类型: np.float64<br/>形状: (n_params,)]
    C --> D[内存地址追踪<br/>hex(id)]

代码实现:

# SciPy优化器内部实现
def optimizer_step():
    # BFGS算法计算搜索方向
    search_direction = -H_inverse @ gradient

    # 线搜索找到最优步长
    step_size = line_search(loss_function, theta, search_direction)

    # 生成新参数向量
    theta_new = theta + step_size * search_direction

    return theta_new  # np.float64数组

数据特征: - 输入: 当前参数 θₖ₋₁, 梯度 ∇Lₖ₋₁ - 输出: 新参数 θₖ - 数据类型: numpy.ndarray[float64] - 内存管理: 复用同一内存地址(优化)


📍 步骤2: Qibo Circuit.set_parameters() 参数注入

graph TB
    A[输入: np.float64向量<br/>θₖ] --> B[参数解析器]
    B --> C{参数格式}
    C -->|扁平数组| D[按顺序分配]
    C -->|字典| E[按门对象分配]
    C -->|元组列表| F[多参数门处理]

    D --> G[遍历trainable_gates]
    E --> G
    F --> G

    G --> H[set_parameters内部逻辑]
    H --> I[提取参数值<br/>theta_i = θₖ[i]]
    H --> J[更新门参数<br/>gate.theta = theta_i]
    H --> K[缓存新参数<br/>gate._parameters]

    J --> L[精度验证]
    L --> M[返回参数引用<br/>get_parameters]

    style B fill:#fff4e1
    style H fill:#ffe1f0
    style L fill:#e1ffe1

Qibo内部实现 (简化):

def set_parameters(self, params):
    """
    参数注入到量子门

    参数追踪:
        输入: np.float64数组
        中间: 提取单个float64值
        输出: 门的theta属性 (float64)
    """
    params = list(params)  # 转为列表
    param_index = 0

    for gate in self.trainable_gates:
        # 获取门参数数量
        n_params = len(gate.parameters)

        # 提取参数值
        if n_params == 1:
            # 单参数门 (RY, RX, RZ)
            gate.set_parameters(params[param_index])
            param_index += 1
        else:
            # 多参数门 (fSim, U3)
            gate_params = params[param_index:param_index + n_params]
            gate.set_parameters(gate_params)
            param_index += n_params

    return None

审计数据 (实测):

输入参数:   np.float64[28]
内存地址:   0x1dc0d32b520
执行耗时:   77.90 μs (平均)
精度损失:   0.00e+00 (完全无损)


📍 步骤3: 计算期望值 ⟨ψ|H|ψ⟩

graph TB
    A[电路执行<br/>circuit] --> B[生成量子态<br/>|ψ(θ)⟩]
    B --> C[态矢量表示<br/>2ⁿ维复数组]

    C --> D[哈密顿量作用<br/>H|ψ(θ)⟩]
    D --> E[矩阵-向量乘法<br/>16x16 @ 16x1]

    E --> F[内积计算<br/>⟨ψ|H|ψ⟩]
    F --> G[复数运算<br/>ψ† · Hψ]

    G --> H[提取实部<br/>E = Re⟨ψ|H|ψ⟩]
    H --> I[返回标量能量值<br/>float64]

    style C fill:#e1f5ff
    style E fill:#fff4e1
    style I fill:#ffe1f0

Qibo实现:

def expectation(state, hamiltonian):
    """
    计算期望值 ⟨ψ|H|ψ⟩

    数据流:
        输入: 态矢量 |ψ⟩ (complex128[2ⁿ])
        中间: H|ψ⟩ (complex128[2ⁿ])
        输出: 能量标量 E (float64)
    """
    # 1. 哈密顿量作用于态矢量
    H_psi = hamiltonian @ state  # 矩阵乘法

    # 2. 计算内积
    expectation = np.vdot(state, H_psi)  # ⟨ψ|H|ψ⟩

    # 3. 提取实部(厄米算符保证为实数)
    energy = np.real(expectation)

    return float64(energy)  # 返回标量

实测性能:

电路执行时间: 1.599毫秒 (平均)
态矢量维度: complex128[16]
哈密顿量维度: 16×16
能量值类型: float64


📍 步骤4: 反馈Scalar标量给优化器

graph LR
    A[能量标量<br/>E(θₖ) ∈ ℝ] --> B[损失函数<br/>L(θₖ) = E(θₖ)]
    B --> C[优化器接收<br/>scipy.optimize]
    C --> D[存储历史值<br/>loss_history]

    D --> E[计算变化量<br/>ΔE = |Eₖ - Eₖ₋₁|]
    E --> F{台阶效应检测}

    F -->|ΔE < 1e-10| G[标记:微小变化]
    F -->|ΔE ≥ 1e-10| H[标记:正常变化]

    G --> I[梯度信噪比<br/>SNR分析]
    H --> I

    I --> J[优化器决策<br/>继续/停止]

    style B fill:#ffe1f0
    style F fill:#fff4e1
    style I fill:#e1f5ff

数据流向代码:

def vqe_loss(params, circuit, hamiltonian):
    """
    VQE损失函数(优化器回调)

    返回:
        Scalar标量 (float64): 能量期望值
    """
    # 1. 参数注入
    circuit.set_parameters(params)

    # 2. 电路执行
    final_state = circuit()

    # 3. 期望值计算
    energy = hamiltonian.expectation(final_state)

    # 4. 返回标量(优化器接收)
    return float(energy)  # Scalar: np.float64

实测台阶效应:

总变化次数: 724
极小变化 (<1e-10): 255次 (35.2%)  ← 台阶效应
零变化 (<1e-15): 0次               ← 未卡住
信噪比 (SNR): 0.07                  ← 噪声较大


📍 步骤5: 梯度计算与更新

graph TB
    A[优化器触发<br/>梯度计算] --> B{梯度计算方法}

    B -->|数值梯度| C[有限差分法<br/>∇f ≈ (f(x+h)-f(x))/h]
    B -->|解析梯度| D[参数平移规则<br/>PSR]
    B -->|自动微分| E[反向传播<br/>Autograd]

    C --> F[扰动参数<br/>θ ± π/2]
    F --> G[重新计算能量<br/>E± = E(θ ± π/2)]
    G --> H[计算梯度分量<br/>∂E/∂θᵢ = (E₊ - E₋)/2]

    D --> F
    E --> I[自动微分图<br/>computational graph]

    H --> J[梯度向量<br/>∇E = [∂E/∂θ₁, ..., ∂E/∂θₙ]]
    I --> J

    J --> K[BFGS更新<br/>拟牛顿法]
    K --> L[Hessian近似<br/>Bₖ₊₁ = Bₖ + ΔB]
    L --> M[新参数<br/>θₖ₊₁ = θₖ - αₖBₖ∇E]

    style C fill:#e1f5ff
    style D fill:#fff4e1
    style E fill:#f0e1ff
    style L fill:#ffe1f0

BFGS算法更新规则:

def bfgs_update(theta_k, gradient_k, H_inverse_k):
    """
    BFGS拟牛顿法更新参数

    参数:
        theta_k: 当前参数向量 θₖ
        gradient_k: 当前梯度 ∇L(θₖ)
        H_inverse_k: 逆Hessian近似 Hₖ⁻¹

    返回:
        theta_k+1: 更新后参数 θₖ₊₁
    """
    # 1. 计算搜索方向
    search_direction = -H_inverse_k @ gradient_k

    # 2. 线搜索找到最优步长
    alpha = line_search(vqe_loss, theta_k, search_direction)

    # 3. 更新参数
    theta_k_plus_1 = theta_k + alpha * search_direction

    # 4. 更新Hessian近似
    s = theta_k_plus_1 - theta_k  # 参数变化
    y = gradient_k_plus_1 - gradient_k  # 梯度变化
    H_inverse_k_plus_1 = update_hessian(H_inverse_k, s, y)

    return theta_k_plus_1, H_inverse_k_plus_1

梯度计算开销:

数值梯度: 需要 n+1 次电路执行 (n=参数数)
PSR梯度: 需要 2n 次电路执行
BFGS梯度: 使用拟牛顿近似,降低计算量


📍 步骤6: 重新迭代计算

graph TB
    A[新参数 θₖ₊₁] --> B{收敛检查}

    B -->|未收敛| C[重新注入参数]
    C --> D[电路演化<br/>U(θₖ₊₁)]
    D --> E[计算新能量<br/>E(θₖ₊₁)]

    E --> F[能量下降?<br/>E(θₖ₊₁) < E(θₖ)]
    F -->|是| G[接受更新]
    F -->|否| H[线搜索回退]

    G --> I[更新历史]
    H --> I

    I --> J{迭代次数<br/>< 50?}
    J -->|是| B
    J -->|否| K[收敛成功]

    B -->|能量变化<br/>< 1e-6| K

    K --> L[返回最优参数<br/>θ* = θₖ]
    L --> M[返回基态能量<br/>E₀ = E(θ*)]

    style D fill:#e1f5ff
    style E fill:#fff4e1
    style K fill:#e1ffe1

收敛判断标准:

def check_convergence(optimization_result):
    """
    收敛检查
    """
    # 标准判断条件
    converged = False

    # 1. 能量变化阈值
    if abs(energy_change) < 1e-6:
        converged = True

    # 2. 梯度范数阈值
    if np.linalg.norm(gradient) < 1e-5:
        converged = True

    # 3. 最大迭代次数
    if iteration >= maxiter:
        converged = True  # 强制停止

    return converged

实测收敛过程:

迭代次数: 19次
总函数评估: 725次
梯度评估: 25次
最终能量: -4.0000000000 (精确匹配)


完整数据流示例

单次迭代的完整数据流

┌────────────────────────────────────────────────────────────────────┐
│                    VQE单次迭代完整数据流                             │
├────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  【步骤1】优化器生成参数                                              │
│    输入: θₖ₋₁ = [2.35, 5.97, 4.60, ..., 1.91]  (28个float64)        │
│    梯度: ∇L = [0.01, -0.02, 0.00, ..., 0.01]                       │
│    输出: θₖ = [2.36, 5.95, 4.60, ..., 1.92]                        │
│    类型: numpy.ndarray[float64]                                     │
│    地址: 0x1dc0d32b700                                             │
│                                                                      │
│  ↓ set_parameters(θₖ)                                               │
│                                                                      │
│  【步骤2】参数注入到电路                                              │
│    RY(0, 2.36) → RY(1, 5.95) → RY(2, 4.60) → ...                 │
│    精度检查: Δ = 0.00e+00 (无损)                                     │
│    耗时: 77.90 μs                                                    │
│                                                                      │
│  ↓ circuit()                                                        │
│                                                                      │
│  【步骤3】电路演化与期望值                                            │
│    |ψ(θₖ)⟩ = U(θₖ)|0⟩⁴                                             │
│    维度: complex128[16]                                              │
│    E = ⟨ψ(θₖ)|H|ψ(θₖ)⟩ = -3.912345                                │
│    耗时: 1.599 ms                                                    │
│                                                                      │
│  ↓ return E                                                         │
│                                                                      │
│  【步骤4】反馈标量                                                    │
│    损失值: L(θₖ) = -3.912345                                      │
│    变化: ΔE = |L(θₖ) - L(θₖ₋₁)| = 0.001234                         │
│    台阶检测: ΔE > 1e-10 ✓ (正常)                                    │
│                                                                      │
│  ↓ scipy.optimize                                                  │
│                                                                      │
│  【步骤5】梯度更新                                                    │
│    ∇L(θₖ) ≈ [0.008, -0.015, ..., 0.012]                            │
│    Hessian更新: Hₖ⁻¹ → Hₖ₊₁⁻¹                                       │
│    搜索方向: dₖ = -Hₖ⁻¹∇L                                           │
│    步长: αₖ = 0.5 (线搜索)                                          │
│                                                                      │
│  ↓ 更新参数                                                         │
│                                                                      │
│  【步骤6】下次迭代                                                    │
│    θₖ₊₁ = θₖ + αₖdₖ                                               │
│    收敛检查: |ΔE| < 1e-6? ✗ (继续)                                  │
│                                                                      │
└────────────────────────────────────────────────────────────────────┘

内存与性能优化

内存管理策略

graph LR
    A[优化器参数池] -->|复用| B[固定内存地址]
    B --> C[避免频繁分配]

    D[电路态缓存] -->|惰性求值| E[按需计算]
    E --> F[释放临时态]

    G[哈密顿量] -->|预计算| H[稀疏矩阵]
    H --> I[快速矩阵-向量乘]

    style B fill:#e1ffe1
    style E fill:#fff4e1
    style H fill:#e1f5ff

优化技巧: 1. 内存复用: 优化器在同一地址更新参数 2. 惰性求值: 仅在需要时执行电路 3. JIT编译: numba加速态矢量演化 4. 稀疏哈密顿量: 利用对称性简化计算


关键性能指标总结

步骤 操作 平均耗时 占比 数据类型
1 优化器生成参数 <0.01 ms <1% float64[28]
2 set_parameters 0.08 ms 4.77% float64 → gate
3 电路演化+期望 1.60 ms 95.23% complex128
4 反馈标量 <0.01 ms <1% float64
5 梯度计算 0.05 ms 3% float64[28]
6 收敛检查 <0.01 ms <1% bool

总单次迭代: ~1.74 ms 50次迭代总耗时: ~1.22 秒 最终能量精度: 0.00e+00 (机器精度)


文档版本: 1.0 创建日期: 2026-01-12 审计工具: Qibo 0.2.21 + Parameter Probe Middleware