图神经网络中的归一化

图神经网络中的归一化,第1张

Pytorch中的矩阵乘法
        • 动机
        • 实现
        • 相乘
        • 问题


动机

最近在使用图神经网络进行捆绑推荐(Bundle Recommendation),在进行异构图的聚合时需要对节点的度进行归一化,因此需要乘以度的逆矩阵 D − 1 D^{-1} D1。由于我的是异构图的聚合,因此矩阵的行列并不一致,需要求出来度向量放到对角阵中,矩阵相乘的维度需要对应好。


实现

Bundle一共是75000个,Item是23000个,节点隐藏层特征为100。

  • Bundle-Item matrix:

75000×23000维,行代表Bundle索引,列代表Item索引

  • Item Embedding:

23000×100维,行代表Item索引,列代表隐藏特征维度

  • 需要求得的是度矩阵的逆( D − 1 D^{-1} D1

因为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类型。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/718520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存