图学习【参考资料2】-知识补充与node2vec代码注解( 二 )

# 可增加轮次提高精度--epoch# 当前参数精度大概在95%左右!python my_deepwalk.py --use_my_random_walk --epoch 35 #35 用自己实现的random walk训练DeepWalk模型 , 可在 ./tmp/deepwalk/walks/ 中查看构造的节点路径[INFO] 2022-11-11 14:28:28,099 [my_deepwalk.py:250]: Step 1200 DeepWalk Loss: 0.1981060.242671 s/step.[INFO] 2022-11-11 14:28:30,539 [my_deepwalk.py:250]: Step 1210 DeepWalk Loss: 0.1871830.309996 s/step.[INFO] 2022-11-11 14:28:33,171 [my_deepwalk.py:250]: Step 1220 DeepWalk Loss: 0.1895330.244672 s/step.[INFO] 2022-11-11 14:28:35,537 [my_deepwalk.py:250]: Step 1230 DeepWalk Loss: 0.2022930.232859 s/step.[INFO] 2022-11-11 14:28:37,920 [my_deepwalk.py:250]: Step 1240 DeepWalk Loss: 0.1893660.244727 s/step.[INFO] 2022-11-11 14:28:40,450 [my_deepwalk.py:250]: Step 1250 DeepWalk Loss: 0.1886010.254400 s/step.[INFO] 2022-11-11 14:28:42,875 [my_deepwalk.py:250]: Step 1260 DeepWalk Loss: 0.1913430.247985 s/step.[INFO] 2022-11-11 14:28:45,286 [my_deepwalk.py:250]: Step 1270 DeepWalk Loss: 0.1865490.255688 s/step.[INFO] 2022-11-11 14:28:47,653 [my_deepwalk.py:250]: Step 1280 DeepWalk Loss: 0.1886380.240493 s/step.[INFO] 2022-11-11 14:29:45,898 [link_predict.py:199]: Step 180 Train Loss: 0.398023 Train AUC: 0.960870[INFO] 2022-11-11 14:29:46,023 [link_predict.py:223]:Step 180 Test Loss: 0.399052 Test AUC: 0.960234[INFO] 2022-11-11 14:29:48,816 [link_predict.py:199]: Step 190 Train Loss: 0.396805 Train AUC: 0.960916[INFO] 2022-11-11 14:29:48,951 [link_predict.py:223]:Step 190 Test Loss: 0.397910 Test AUC: 0.960275[INFO] 2022-11-11 14:29:51,783 [link_predict.py:199]: Step 200 Train Loss: 0.396290 Train AUC: 0.960936[INFO] 2022-11-11 14:29:51,913 [link_predict.py:223]:Step 200 Test Loss: 0.397469 Test AUC: 0.960292 2.0 SkipGram模型训练【图学习【参考资料2】-知识补充与node2vec代码注解】NOTE:在得到节点路径后 , node2vec会使用SkipGram模型学习节点表示 , 给定中心节点 , 预测局部路径中还有哪些节点 。模型中用了negative sampling来降低计算量 。

图学习【参考资料2】-知识补充与node2vec代码注解

文章插图
参考 PGL/examples/node2vec/node2vec.py 中的 node2vec_model 函数
2.1 SkipGram模型实现代码参考--理解
  1. 这部分的话 , 官方代码已经给的很清晰了 , 这里主要是做一些解释补充--大都可以跟上边算法公式对应着看
  2. 这里采用组合损失--组合损失计算时 , 要注意在不必要的参数创建后 , 记得关闭梯度记录--否则会对他求梯度 , 这样不太好:如:ones_label,他只是一个中间量 , 用于存放结果的 , 不需要对他求梯度 , 因为不需要优化它
  3. 还有一点 , 静态图下 , 尽量使用layers下的运算方法 , 避免出现超出计算图的一些逻辑循环操作这一部分没什么好说的 , 大家理解就好--多看看源码哦!
import paddle.fluid.layers as ldef userdef_loss(embed_src, weight_pos, weight_negs):"""输入:embed_src- 中心节点向量 list (batch_size, 1, embed_size)weight_pos- 标签节点向量 list (batch_size, 1, embed_size)weight_negs - 负样本节点向量 list (batch_size, neg_num, embed_size)输出:loss - 正负样本的交叉熵 float"""################################### 请在这里实现SkipGram的loss计算过程### 负采样计算部分——Multi Sigmoids# 分别计算正样本和负样本的 logits(概率)pos_logits = l.matmul(embed_src, weight_pos, transpose_y=True)# [batch_size, 1, 1] -- matmul:矩阵相乘neg_logits = l.matmul(embed_src, weight_negs, transpose_y=True)# [batch_size, 1, neg_num]# 设置正样本标签 , 并计算正样本lossones_label = pos_logits * 0. + 1.ones_label.stop_gradient = True# 关闭梯度记录pos_loss = l.sigmoid_cross_entropy_with_logits(pos_logits, ones_label)# 交叉熵计算==对应公式2# 设置负样本标签 , 并计算负样本losszeros_label = neg_logits * 0.zeros_label.stop_gradient = Trueneg_loss = l.sigmoid_cross_entropy_with_logits(neg_logits, zeros_label)# 交叉熵计算==对应公式3# 总的Loss计算为正样本与负样本loss之和loss = (l.reduce_mean(pos_loss) + l.reduce_mean(neg_loss)) / 2# 得到总的loss##################################return loss

经验总结扩展阅读