量子伴随自动微分

适用版本 · ArcQML 0.1.0

本页目录

8.1 前向定义

对于按执行顺序排列的多个量子门,ArcQML 的 run 从初态开始逐门演化得到最终态,并计算 Hamiltonian 的期望值。第 k 个门对应的状态演化和最终目标函数定义为:

ψk=Ukψk1,f=Re ⁣(ψmHψm).\lvert\psi_k\rangle =U_k\lvert\psi_{k-1}\rangle, \qquad f=\operatorname{Re}\!\left( \langle\psi_m\rvert H\lvert\psi_m\rangle \right).

若初态或任一 Circuit Parameter 需要梯度,且全局 no_grad 未开启,run 会保存最终态、Hamiltonian 作用于最终态的结果、已绑定操作和参数槽位映射,并创建一个自定义 F64 Tensor autograd 节点。否则它只执行前向,不保存伴随上下文。

8.2 单态伴随反向公式

反向开始时,forward_state 取最终态,adjoint_state 取 Hamiltonian 作用于最终态的结果并乘以标量上游梯度。随后按相反顺序遍历 Operation:先对 forward_state 施加当前门的共轭转置以恢复该门的输入态,再计算门矩阵关于参数的导数作用于输入态的结果,并按下式累加参数梯度:

fp=2Re ⁣[λkUkpψk1].\frac{\partial f}{\partial p} =2\operatorname{Re}\!\left[ \langle\lambda_k\rvert \frac{\partial U_k}{\partial p} \lvert\psi_{k-1}\rangle \right].

随后,对 adjoint_state 施加当前门的共轭转置并继续逆序传播。这里的伴随态是在逆序扫描中传播的中间量。共享参数会多次命中同一 parent_index,所以各处梯度贡献会相加。若初态需要梯度,则返回的 C64 初态梯度为:

ψ0f=2λ0.\nabla_{\psi_0}f=2\lvert\lambda_0\rangle.

参数梯度则按照 Parameter 的 F32 或 F64 dtype 构造成标量 Tensor。该过程只需保存最终态和已绑定门信息,不需要保存每一层完整状态。

8.3 batch 的上游梯度与 VJP

batch run 的输出不是标量而是 [B] 向量,因此它本身不能直接调用无参 backward()。通常应先用 mse_loss 或二元 logits 交叉熵等经典损失函数将其归约为标量。若上层图传回 grad_output,batch 伴随节点要求它是 shape [B] 的 F64 Tensor,并把每个上游梯度乘到对应 batch 行的 adjoint_state 中。

因此 batch 模式实现的是向量-雅可比积(VJP):外部经典网络或损失决定每个样本输出的上游权重,量子伴随器再将其回传到共有 Circuit 参数和可微初态。

8.4 no_grad 与训练图内存

用 no_grad() 或 Python 的 with arcqml.no_grad(): 包围 run 时,records_gradients 为 false,运行不保留伴随上下文,返回普通前向 Tensor。验证、推理、基准测试和只读状态分析应采用此模式;需要反向时,不应先把预测转为 f64 或 NumPy 数组,因为那会离开 Tensor 图。