张量和张量网络分解

简介

诸如 QR 分解和 SVD 等分解方法在张量网络算法中非常普遍,因为它们允许利用网络的稀疏性,从而降低计算成本。从 cuQuantum Python v23.03 开始,我们在张量张量网络级别都提供了这些功能。张量级别的分解例程在模块 cuquantum.cutensornet.tensor 中实现,具有以下特性

从 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_methodcuquantum.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 算法