要获得一个包含D
维正定矩阵C
(在我的情况下,多元高斯微分熵)的行列式的可微分项,我可以使用:
torch.log2(torch.potrf(C).diag()).sum() + D / 2.0 * (np.log2(2 * np.pi * np.e))
potrf(C)
执行Cholesky分解,其对角元素的对数值加到对数行列式除以2。
我想在一小批矩阵上调用potrf
,以便在形状为potrf
的张量上调用(N, D, D)
会产生N
不同的Cholesky分解。
目前,我只能在Python循环中重复调用potrf()
,这对GPU的并行计算功能的使用不佳,因此运行速度比CPU慢3倍。
是否可以使用PyTorch在GPU上并行启动Cholesky分解?
答案 0 :(得分:1)
批处理Cholesky分解现在可以在PyTorch中使用,从1.0开始,以及批处理inverse()等。
(下面是旧答案)
您正在寻找Batch Cholesky分解。目前尚未在Pytorch中实现,但是有一个open issue,并计划在将来添加。
我只知道Pytorch 0.4中有一个Batch LU factorization。您可以使用它来获得类似的内容:
det(D) = det(P)det(L)det(U)
其中P的行列式为(-1)^t
,P和U的行列式是对角元素的乘积。
答案 1 :(得分:0)
从 1.8 版开始,PyTorch 原生支持 numpy 样式的 torch.linalg
操作,包括 Cholesky 分解:
torch.linalg.cholesky(input)
<块引用>
注意:当在 CUDA 设备上给定输入时,此函数会将该设备与 CPU 同步。