liuxiyang641 / RAGAT

RAGAT: Relation Aware Graph Attention Network for Knowledge Graph Completion
56 stars 16 forks source link

关于注意力机制部分代码请教 #7

Closed Jim-Hou closed 2 years ago

Jim-Hou commented 2 years ago

学长您好,我在阅读您的论文时,理解您是在CompGCN的基础上,给关系、尾节点cross过后的嵌入通过软注意力学习了一个权重,再按权重聚合到头节点上。请问这部分思想的代码实现位置是agg_multi_head()这里吗,这个函数中的写法我没有太看懂,主要是对SpecialSpmmFinal()不太理解,可否大致解释一下呢? 另外,我看您在FB-237的MRR值达到了0.365,使用的是二头。我没有复现您的模型进行测试,想问您如果去掉多头,MRR值大约是多少呢? 感谢!

liuxiyang641 commented 2 years ago

你好,抱歉我刚刚看到这个issue。

  1. SpecialSpmmFinal()这个方法的作用应该是按照edge_index中的索引,把具有相同索引(也就是相同头实体)的info_emb_weighted相加,得到的输出是计算attention时使用的softmax函数的分子部分和embedding相乘之后的聚合结果。 由于每个实体对于不同邻居的分母是一样的,所以在之后统一除以分母emb_agg.div(weight_rowsum)
  2. 如果去掉多头之后,效果会下降大概下降0.003左右,我找到了一个实验记录可以做参考,但是不保证是一定正确的,下面的是在测试集上的效果
    MRR: 0.362, MR: 195, HIT@1: 0.270, HIT@3: 0.399, HIT@10: 0.547
Jim-Hou commented 2 years ago

谢谢学长!我了解您的代码了,似乎实际上是把softmax函数分开写了。 我的模型是基于CompGCN基础上做的改进,对于dropout值的调试我很困惑,我看您代码里,在注意力部分使用了dropout,同时在传出RAGAT层之前进行了dropout,传出到models里后又进行了一次dropout,这样是您测试出来的最优结果嘛?这么多dropout是可以减少过拟合,提高鲁棒性吗?因为我的模型仅仅是在传出models后做了一次dropout。 另外,我看您的代码里,在计算compute_norm之后,再进行了注意力机制的计算,我理解那个compute_norm就是GCN里面关于节点度的归一化处理。而注意力里面使用的softmax,本质上也是对相同头实体的邻居节点进行了归一化,这两者是否有些重复?还是说有意为之呢? 谢谢!!!

liuxiyang641 commented 2 years ago

你好,

  1. dropout我认为在注意力中使用是合理的,但是我没有做过把传出到GNN layer之前的dropout删除的实验,我建议你可以在自己的代码里实现下比较效果。
  2. compute_norm()函数只有在不使用attention的时候才会使用,在利用attention的时候norm都是设置为None的。
Jim-Hou commented 2 years ago

好的,十分感谢!

liuxiyang641 commented 2 years ago

如果没有问题的话我就关闭issue了。

Jim-Hou commented 2 years ago

okok