4. 分类任务与损失函数设计
变分量子分类器(VQC)的训练效果,很大程度上取决于三件事是否对齐:任务如何形式化、损失函数如何定义、量子线路输出如何被测量并转成可优化的标量。这三者构成一条从数据到梯度的闭环,任何一环定义不当,都会让优化器在错误的信号上收敛。本节围绕这条闭环展开,先给出二分类与多分类的形式化约定,再讨论交叉熵与均方误差的适用场景,最后落到量子测量与期望值估计的具体实现。
一、分类任务的形式化约定
在 VQC 中,我们通常把输入样本 x 编码为量子态 |φ(x)⟩,经过含参线路 U(θ) 得到输出态 |ψ(x;θ)⟩ = U(θ)|φ(x)⟩,再通过测量得到可优化的数值。为了让损失函数有明确定义,需要先约定标签与输出的表示方式。
二分类:标签取 y ∈ {0, 1},模型输出一个标量 p ∈ [0,1],表示样本属于类别 1 的预测概率。最自然的量子实现是单量子比特测量:对输出态在计算基下测量,得到 P(1) 作为 p。若使用多比特线路,也可以把某个可观测量 Z 的期望值映射到概率,即 p = (1 - ⟨Z⟩)/2,其中 ⟨Z⟩ ∈ [-1,1]。这里约定:⟨Z⟩ = +1 对应类别 0,⟨Z⟩ = -1 对应类别 1,全文与图示保持一致。
多分类:标签取 y ∈ {0,1,…,K-1},模型输出一个长度为 K 的概率向量 p = (p₀,…,p_{K-1}),满足 Σp_k = 1。量子侧常见做法有两种:一是用 K 个测量基或 K 个可观测量分别估计各类的得分,再经 softmax 归一化;二是用 ⌈log₂K⌉ 个量子比特的计算基测量结果直接对应类别索引,把频率作为概率。前者更灵活,后者更省测量次数,但需要类别数与比特数匹配。
二、常用损失函数的选择
交叉熵是分类任务的首选。二分类形式为 L = -[y·log p + (1-y)·log(1-p)];多分类形式为 L = -Σ_k y_k·log p_k,其中 y_k 是 one-hot 标签。交叉熵对“预测概率偏离真实类别”的惩罚随偏离程度非线性增大,梯度信号在预测错误时更强,适合概率输出经过 softmax 或 sigmoid 的场景。
均方误差形式为 L = (1/N)·Σ_i (p_i - y_i)²。它在回归任务中常用,在分类中也可用,但对概率输出的梯度在饱和区会变小,收敛通常慢于交叉熵。不过在 VQC 中有一个现实考量:均方误差可以直接写成期望值之差,例如 L = (⟨Z⟩ - z_target)²/2,其中 z_target = +1 或 -1,这种形式与参数化量子线路的期望值估计天然契合,实现简单、测量开销低。因此实践中常见“二分类用期望值型 MSE 快速验证,收敛后再换交叉熵精调”的组合策略。
| 损失函数 | 输出要求 | 梯度特性 | 典型适用 |
|---|---|---|---|
| 二元交叉熵 | 概率 p∈[0,1] | 错误预测时梯度大 | 二分类主选 |
| 多类交叉熵 | 概率向量 Σp=1 | 配合 softmax 稳定 | 多分类主选 |
| 均方误差 | 标量或向量 | 饱和区梯度衰减 | 期望值型快速验证 |
三、量子测量与期望值估计
量子线路本身输出的是态,损失函数需要的是标量,这一步由测量完成。对可观测量 O,其期望值估计为 ⟨O⟩ = Σ_i λ_i·P(λ_i),其中 λ_i 是 O 的特征值,P(λ_i) 是测得该特征值的概率。实际执行时采用多次采样取平均:准备态 |ψ(x;θ)⟩,测量 shots 次,统计各结果频率,再按特征值加权求和。
以单比特 Z 测量为例,若 shots = 1024,测得 0 的次数为 610、1 的次数为 414,则 ⟨Z⟩ ≈ (610 - 414)/1024 ≈ 0.191。这个估计带有统计噪声,标准差约为 1/√shots,即约 0.031。shots 越大,估计越准,但线路执行次数线性增加。训练时通常取 shots = 1024~4096 平衡噪声与开销;推理阶段可提高到 8192 以上以稳定判决。
多分类时,若用 K 个可观测量分别估计得分,需要对每个可观测量单独测量,测量开销随 K 增长。一种折中是把类别编码到计算基,一次测量得到类别索引的频率分布,再作为概率向量输入交叉熵。需要注意,频率估计的噪声会直接进入损失,因此小 shots 下交叉熵可能出现明显抖动,此时可对概率做裁剪(如 clip(p, 1e-6, 1-1e-6))避免 log(0)。
四、一个可执行的训练片段
下面给出二分类的损失与期望值估计示例(参数与数值为教学示例,非实测结果)。假设使用 PennyLane 风格接口,线路输出单比特态,测量 PauliZ 期望值。
import numpy as np
def binary_cross_entropy(p, y, eps=1e-6):
p = np.clip(p, eps, 1 - eps)
return -(y * np.log(p) + (1 - y) * np.log(1 - p))
def mse_from_expectation(z_exp, y):
z_target = 1.0 if y == 0 else -1.0 # 约定:+1→类别0,-1→类别1
return 0.5 * (z_exp - z_target) ** 2
# 示例:某样本测得 0 共 610 次、1 共 414 次,shots=1024
shots, n0, n1 = 1024, 610, 414
z_exp = (n0 - n1) / shots # ≈ 0.191
p1 = (1 - z_exp) / 2 # ≈ 0.404
loss_ce = binary_cross_entropy(p1, y=1)
loss_mse = mse_from_expectation(z_exp, y=1)
print(round(z_exp, 3), round(p1, 3), round(loss_ce, 3), round(loss_mse, 3))
按上述示例数值,z_exp ≈ 0.191、p1 ≈ 0.404,若真实标签为 1,交叉熵约为 0.906,MSE 约为 0.654。两者都在惩罚“预测偏向类别 0”这一错误,但交叉熵的数值更大、梯度更陡,这正是分类任务优先选交叉熵的原因。实际训练中,建议先用 MSE 跑通线路与梯度链路,确认损失能稳定下降,再切换到交叉熵做精细优化。
把上述环节串起来,VQC 分类的训练闭环就是:样本编码 → 含参线路 → 测量采样 → 期望值/概率估计 → 损失计算 → 参数梯度回传 → 更新 θ。形式化约定、损失选择与测量估计三者一致,优化器才能收到正确的下降信号。