张量和张量网络分解¶
简介¶
诸如 QR 分解和 SVD 等分解方法在张量网络算法中非常普遍,因为它们允许利用网络的稀疏性,从而降低计算成本。从 cuQuantum Python v23.03 开始,我们在张量和张量网络级别都提供了这些功能。张量级别的分解例程在模块 cuquantum.cutensornet.tensor
中实现,具有以下特性
可以使用
cuquantum.cutensornet.tensor.decompose()
和cuquantum.cutensornet.tensor.QRMethod
执行 QR 分解。可以使用
cuquantum.cutensornet.tensor.decompose()
和cuquantum.cutensornet.tensor.SVDMethod
执行精确和截断的 SVD。分解选项可以通过
cuquantum.cutensornet.tensor.DecompositionOptions
指定。
从 cuQuantum Python v23.03 开始,张量网络级别的分解例程在实验性子包 cuquantum.cutensornet.experimental
中实现,主要 API 为 cuquantum.cutensornet.experimental.contract_decompose()
。给定一个输入张量网络,此函数可以执行完全收缩,然后进行 QR 或 SVD 分解。这可以通过 cuquantum.cutensornet.experimental.ContractDecomposeAlgorithm
指定。如果收缩和分解问题相当于量子电路模拟中常见的 三元操作数门分裂问题(有关详细信息,请参阅 门分裂算法),用户可以利用 QR 分解来加速收缩和 SVD 的执行。这可以通过同时设置 cuquantum.cutensornet.experimental.ContractDecomposeAlgorithm.qr_method
和 cuquantum.cutensornet.experimental.ContractDecomposeAlgorithm.svd_method
来实现。
注意
cuquantum.cutensornet.experimental
中的 API 可能会发生更改,并可能在未来的版本中集成到主包 cuquantum.cutensornet
中。 鼓励用户在 NVIDIA/cuQuantum GitHub Discussions 上留下反馈。
使用示例¶
import cupy
from cuquantum import contract
from cuquantum.cutensornet.tensor import decompose
from cuquantum.cutensornet.experimental import contract_decompose
# create a random rank-4 tensor
a = cupy.random.random((2,2,2,2)) + cupy.random.random((2,2,2,2)) * 1j
# perform QR decomposition such that A[i,j,k,l] = \sum_{x} Q[i,x,k] R[x,j,l]
q, r = decompose('ijkl->ixk,xjl', a) # QR by default
# check the unitary property of q
identity = contract('ixk,iyk->xy', q, q.conj())
identity_reference = cupy.eye(identity.shape[0])
assert cupy.allclose(identity, identity_reference)
# check if the contraction of the decomposition outputs yields the input
a_reference = contract('ixk,xjl->ijkl', q, r)
assert cupy.allclose(a, a_reference)
关于张量分解的更多示例,请参阅我们的 示例目录,以演示在不同设置中使用 QR 和 SVD。
对于张量网络分解,请参阅 此目录 获取更详细的示例。我们还提供了一个 Jupyter notebook,以演示如何使用这些新的 API 轻松实现基本的 MPS 算法。