Tensor 与自动微分
适用版本 · ArcQML 0.1.0
本页目录
4.1 Tensor 的数据与元数据
Tensor 是用户直接操作的数值对象。它把 Storage、版本号、TensorMeta 和 AutogradMeta 组合在共享句柄中。TensorMeta 包含 shape、dtype、device、layout、strides 和 offset;公开查询包括 shape、ndim、numel、dtype、device、layout、is_contiguous、strides 和 offset。
| dtype | 典型用途 | 自动微分可作为叶子变量 |
|---|---|---|
| F32 | 单精度实数参数或数据 | 可以。 |
| F64 | 量子参数、期望值、损失和默认 zeros | 可以。 |
| C64 | 状态振幅、复数线性代数与自定义酉 | 可以。 |
| I64 | 整数标签或索引数据 | 不可以。 |
| Bool | 布尔数据 | 不可以。 |
Tensor::clone() 只复制句柄,仍共享底层 Storage、版本号和自动微分元数据;deep_clone() 才复制存储、版本和自动微分状态。storage_mut() 取得写锁,并在 guard 释放时递增共享版本号;这个版本号用于在反向前检测前向数据被原地修改的情形。
4.2 自动微分图与梯度生命周期
只有叶子 Tensor 可以开启 requires_grad;可求导叶子 dtype 仅限 F32、F64、C64。由可微操作产生的输出会在全局梯度开关开启且至少一个父节点需要梯度时记录图。默认只持久保存叶子梯度;中间 Tensor 必须显式 retain_grad() 才会保留。
backward() 只为标量输出自动构造上游梯度 1。非标量输出必须使用 backward_with_grad(gradient),且上游梯度与输出在形状、dtype 等方面兼容。默认 backward 会释放本次计算图;若要再次反向,使用 backward_with_grad_retain_graph。任何梯度都以累积方式写入,因此训练迭代必须显式调用 zero_grad。
4.3 Parameter 的语义
Parameter 是 Tensor 的语义包装,是框架中可训练参数的主要数值对象。Parameter::new 要求底层 Tensor 是叶子且 dtype 为 F32、F64 或 C64,并会将其 requires_grad 置为 true;默认 trainable 为 true。Circuit 参数表则进一步限制为标量 F32/F64,因此量子门角度训练不接受 C64 参数。
freeze() 将 trainable 设为 false,优化器随后会跳过该参数;它不会同时关闭底层 Tensor 的 requires_grad,因此该参数仍可能接收梯度。unfreeze() 会恢复 trainable=true,并确保底层 Tensor 开启梯度记录。换言之,requires_grad 控制是否参与反向传播,trainable 控制优化器是否更新参数。