Rust in Everything
基于 tenferro-ad 0.8.0

复数

量子多体和张量网络的代码经常是复数的。复数的求导结果要选一个表示,tenferro 选的和 PyTorch 一样,和 JAX 差一个共轭。这一部分只有一页,把三家的 grad、vjp、jvp 放在同一组输入上对照,再看这个差别在优化循环、复数输出和运算族(SVD、einsum)上的后果。求导规则本身见 tenferro 卷的 自动微分。

  1. 复数求导:Σ|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 差一个共轭"]

💬 关联讨论

发起讨论
加载中...