量子机器学习入门:变分量子电路与量子核

FreeGuideOnline 最新 2026-06-20

量子机器学习:从经典到量子的桥梁

量子机器学习将量子计算与经典机器学习结合,旨在利用量子叠加、纠缠等特性加速模型训练、提升表达能力。本教程面向具备基础线性代数和经典机器学习知识的学习者,无需预先掌握量子力学。我们将聚焦两个核心范式:变分量子电路(Variational Quantum Circuit, VQC)量子核(Quantum Kernel),它们是当前最活跃、最适合近中期量子设备的入口。

环境准备:工具与数学前置

建议安装 PennyLane、Qiskit 或 Cirq。本文示例采用 PennyLane,因其支持自动微分且语法接近 NumPy。关键数学对象包括:量子态用复数向量表示,量子门用幺正矩阵表示,测量得到期望值。初学者只需理解:量子电路 = 参数化变换 + 测量

import pennylane as qml
from pennylane import numpy as np

变分量子电路:可训练的量子模型

核心思想:参数化量子门 + 经典优化器

变分量子电路是一种混合算法:经典计算机调整参数 (\theta),量子设备执行参数化演化 (U(\theta)),然后测量期望值作为损失,梯度通过参数移位规则或反向传播计算。结构通常为:编码层 → 变分层 → 测量层

数据编码:将经典向量映射为量子态

需要把经典数据 (x \in \mathbb{R}^d) 注入电路。常用方法:

  • 角度编码:将特征值作为单量子比特旋转角,例如 (R_x(x_1)R_y(x_2))。适用于低维数据。
  • 振幅编码:将归一化数据作为态振幅,可指数压缩,但电路深浅取决于制备效率。
  • IQP 式编码:使用 (U(x) = \prod_i \exp(i x_i P)),其中 (P) 是泡利串,常用于量子核。
def angle_encoding(x):
    for i, val in enumerate(x):
        qml.RX(val, wires=i)

变分形式:设计可调谐的量子变换

变分层由含可训练参数的单比特旋转门与固定纠缠门交替构成。常用的硬件高效 Ansatz 包括:

  • 层结构:每层先在每个量子比特上施加 (R_y(\theta))、(R_z(\phi)),然后相邻比特间施加 CNOT。
  • 强纠缠层:所有比特全连接纠缠,表达力更强,但门深度增加。
def variational_layer(params):
    for i in range(n_qubits):
        qml.RY(params[i,0], wires=i)
        qml.RZ(params[i,1], wires=i)
    for i in range(n_qubits-1):
        qml.CNOT(wires=[i, i+1])

测量与代价函数

测量基底通常选择泡利 Z,获取期望值 (\langle Z_i \rangle)。对于二分类,可将一个输出比特的 (Z) 期望映射到 ([-1, 1]),或使用多个输出构造交叉熵。代价函数常用均方误差或直接利用量子观测值计算损失。

端到端示例:二分类任务

构造两比特 VQC,输入二维数据,输出预测标签。

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

@qml.qnode(dev)
def vqc(params, x):
    angle_encoding(x)
    variational_layer(params)
    return qml.expval(qml.PauliZ(0))

def cost(params, X, y):
    preds = [vqc(params, x) for x in X]
    return np.mean((np.array(preds) - y) ** 2)

# 使用标准梯度下降优化器
opt = qml.GradientDescentOptimizer(stepsize=0.1)
params = np.random.randn(1, n_qubits, 2)  # 单层
for step in range(100):
    params = opt.step(lambda p: cost(p, X_train, y_train), params)

常见陷阱:贫瘠高原(barren plateau)导致梯度指数级消失。可通过局部测量、浅层电路、门参数初始化策略(如限制为小角度)缓解。

量子核方法:高维特征空间中的线性分类

理论动机:量子特征映射

量子核将经典数据映射到量子希尔伯特空间,内积通过量子测量直接估计: [ K(x, z) = |\langle 0 | U^\dagger(z) U(x) |0\rangle|^2 ] 其中 (U(x)) 是编码电路。该核直接使用量子设备评估,然后接入经典支持向量机(SVM),实现量子与经典的分离。

构建量子核

需要设计一个编码电路 (U(x)),使得不同输入对应不同的叠加状态。常用方法是将特征编码为泡利旋转,并重复多次来增加核的非线性。

def encoding_circuit(x):
    for i in range(n_qubits):
        qml.RX(x[i], wires=i)
    # 可加入固定的纠缠,增强核的表达力
    for i in range(n_qubits-1):
        qml.CZ(wires=[i, i+1])

量子核测量:准备态 (U(x)U^\dagger(z)|0\rangle),并测量全零的概率。

dev_k = qml.device("default.qubit", wires=n_qubits)

@qml.qnode(dev_k)
def kernel_circuit(x1, x2):
    encoding_circuit(x1)
    qml.adjoint(encoding_circuit)(x2)
    return qml.probs(wires=range(n_qubits))

def quantum_kernel(x1, x2):
    return kernel_circuit(x1, x2)[0]  # 全 0 概率

用量子核训练 SVM

计算训练集的核矩阵 (K_{ij} = K(x_i, x_j)),将其作为预处理后的特征输入经典 SVM 库(如 scikit-learn 的 SVC 设 kernel='precomputed')。

from sklearn.svm import SVC

def kernel_matrix(X1, X2):
    n, m = X1.shape[0], X2.shape[0]
    K = np.zeros((n, m))
    for i in range(n):
        for j in range(m):
            K[i,j] = quantum_kernel(X1[i], X2[j])
    return K

# 训练
K_train = kernel_matrix(X_train, X_train)
svm = SVC(kernel='precomputed')
svm.fit(K_train, y_train)

# 测试
K_test = kernel_matrix(X_test, X_train)
pred = svm.predict(K_test)

量子核的优势与挑战

优势:不需要在量子端执行迭代优化,无贫瘠高原问题;适合噪声中等规模量子(NISQ)设备;理论上有望实现经典难模拟的核。挑战:需要计算 (O(N^2)) 次测量,小型实验可行但随着数据集增大而成为瓶颈;需要选择合适的编码电路,否则核可能退化为经典可模拟。

变分量子电路与量子核的对比

特性 变分量子电路 量子核 SVM
训练方式 量子-经典协同优化(变分) 经典优化(SVM),量子仅计算核
量子调用 每次梯度计算需多次电路运行 核矩阵计算、后续分类无需量子
梯度问题 可能遭遇贫瘠高原 无梯度危机
数据适应性 支持批处理和在线学习 静态核,离线计算
硬件需求 适合快速重复测量的设备 适合高保真态制备和测量

进阶主题与资源

  • 量子神经网络架构搜索:自动设计变分电路结构。
  • 误差缓解:零噪声外推、测量误差缓解,提升实际硬件准确率。
  • 迁移学习混合模型:经典特征提取器 + 量子分类器。
  • 推荐库:PennyLane(教程丰富)、Qiskit Machine Learning、TensorFlow Quantum。

继续学习:尝试用真实量子设备(通过 IBM Quantum 或 Amazon Braket)运行上述示例,感受硬件噪声的影响与应对策略。


本教程仅为量子机器学习入门铺路,后续可深入探索振幅放大、量子生成模型等更前沿领域。动手实践是理解变分量子电路与量子核的最佳方式。