比如想让两个n×m的矩阵 每行互相算向量内积得到一个n×1的数组,然后求和
比如同一行的是一对邻居节点 想最大化其embedding内积,就先把两个矩阵分别扩充为n×1×m和n×m×1
然后调torch.bmm 就得到n×1×1的张量 再squeeze
node_emb = self.node_embeddings[i](Variable(nodes_idx)).view(len(batch_indices), -1).unsqueeze(2)
# variable 默认的require grad需要求导为False
# 所以这里只是为了能在cuda上进行计算 将nodes_idx转变为一个tensor 但是不需要对其求导
neighs_idx = torch.LongTensor(neigh_idx_nets[i][batch_indices]).to(self.device)
neigh_emb = self.neigh_embeddings[i](Variable(neighs_idx)).unsqueeze(2).view(len(batch_indices), -1,
self.embedding_dim)
# self.neigh_embeddings[i](Variable(neighs_idx))这部分是把对应索引的embedding取出来 是一个二维张量
# 增加一个维度 变成(len(batch_indices), self.embedding_dim,1)
# reshape--view成(len(batch_indices), -1,self.embedding_dim)
# !!!这是一种常见的乘法!!!!
# 比如想让两个n×m的矩阵 每行互相算向量内积然后求和 同一行的是一对邻居节点 想最大化其表征内积
# 就先把两个矩阵分别扩充为n×1×m和n×m×1
# 然后调torch.bmm 就得到n×1×1的张量 再squeeze
loss_positive = nn.functional.logsigmoid(torch.bmm(neigh_emb, node_emb)).squeeze().mean()
网友评论