- 动机
- 实现
- 相乘
- 问题
动机
最近在使用图神经网络进行捆绑推荐(Bundle Recommendation),在进行异构图的聚合时需要对节点的度进行归一化,因此需要乘以度的逆矩阵 D − 1 D^{-1} D−1。由于我的是异构图的聚合,因此矩阵的行列并不一致,需要求出来度向量放到对角阵中,矩阵相乘的维度需要对应好。
实现
Bundle一共是75000个,Item是23000个,节点隐藏层特征为100。
- Bundle-Item matrix:
75000×23000维,行代表Bundle索引,列代表Item索引
- Item Embedding:
23000×100维,行代表Item索引,列代表隐藏特征维度
- 需要求得的是度矩阵的逆( D − 1 D^{-1} D−1)
因为Bundle-Item matrix代表的是Bundle与Item之间的连接,直接对行求和即为度:
B_I = torch.randn(5, 3)
I = torch.randn(3, 2)
D = np.diag(np.ones(5)).astype(np.float32)
D_inverse = torch.from_numpy(np.linalg.inv(D))
结果:
B_I: tensor([[ 1.4271, -0.6621, -0.7314],
[-1.2664, -0.2166, -0.1994],
[-1.6585, -0.2914, 0.6031],
[-1.0393, 1.0568, -0.3974],
[-2.0148, -0.7474, -0.5893]])
I: tensor([[ 0.2795, 0.5510],
[-1.7180, -0.7539],
[-0.2392, 0.2913]])
D_inverse: tensor([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
相乘
然后进行矩阵运算,torch.mutual并不支持三个矩阵相乘,因此:
bundle_embedding = torch.matmul(D_inverse, torch.matmul(B_I, I))
结果为:
B_I*I: tensor([[ 1.7112, 1.0723],
[ 0.0659, -0.5925],
[-0.1071, -0.5184],
[-2.0109, -1.4851],
[ 0.8620, -0.7183]])
(D-1)*B_I*I: tensor([[ 1.7112, 1.0723],
[ 0.0659, -0.5925],
[-0.1071, -0.5184],
[-2.0109, -1.4851],
[ 0.8620, -0.7183]])
(D-1)*B_I*I size: torch.Size([5, 2])
问题
后来发现矩阵其实挺大的,给内存里造成了不小的压力。对于稀疏矩阵的存储方式,csr_matrix存储密度大但不易手工构建,coo_matrix存储密度相对小但易于手工构建,于是换成了coo_matrix类型,然后使用 tocsr() 方法将coo_matrix转换为csr_matrix类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)