复数
量子多体和张量网络的代码经常是复数的。复数的求导结果要选一个表示,tenferro 选的和 PyTorch 一样,和 JAX 差一个共轭。这一部分只有一页,把三家的 grad、vjp、jvp 放在同一组输入上对照,再看这个差别在优化循环、复数输出和运算族(SVD、einsum)上的后果。求导规则本身见 tenferro 卷的 自动微分。
- 复数求导:
Σ|z|²的梯度 tenferro 和 PyTorch 给2z、JAX 给2·conj(z);vjp 差一个共轭,jvp 相同;直接拿 JAX 的梯度做下降会发散;tenferro 的grad接受复数输出,算的是实部的梯度;核范数和Σ|Ax|²的梯度守同一约定;取实部用cast。
flowchart TB z["复数输入 z"] --> j["jvp 三家相同"] z --> r["grad 和 vjp"] r --> tp["tenferro 和 PyTorch"] r --> jx["JAX 差一个共轭"]
💬 关联讨论
发起讨论加载中...