要得到一个包含D
维正定矩阵C
(在我的情况下是多元高斯的微分熵(的行列式的可微项,我可以使用:
torch.log2(torch.potrf(C).diag()).sum() + D / 2.0 * (np.log2(2 * np.pi * np.e))
potrf(C)
执行Cholesky分解,其对角元素的对数值和对数行列式除以2。
我想对一小批矩阵调用potrf
,这样对形状为(N, D, D)
的张量调用potrf
就会产生N
不同的Cholesky分解。
目前,我只能在Python循环中重复调用potrf()
,这是对GPU并行计算能力的不良利用,因此运行速度比CPU慢约3倍。
有可能在GPU上与PyTorch并行启动Cholesky分解吗?
PyTorch中现在提供了批量Cholesky分解
连同批反转((等
对于Pytorch的旧版本
您正在寻找批量Cholesky分解。它目前还没有在Pytorch中实现,但有一个悬而未决的问题,并计划在未来添加它。
我只知道Pytorch 0.4中提供的Batch LU因子分解。你可以用它来获得类似的东西:
det(D) = det(P)det(L)det(U)
其中p的行列式是CCD_ 9,p和U的行列式是对角元素的乘积。
从版本1.8开始,PyTorch对numpy风格的torch.linalg
操作有原生支持,包括Cholesky分解:
torch.linalg.cholesky(input)
注意:当CUDA设备上有输入时,此功能会使该设备与CPU同步。