Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于注意力机制代码的疑问 #2

Open
lairongxuan opened this issue Aug 23, 2021 · 4 comments
Open

关于注意力机制代码的疑问 #2

lairongxuan opened this issue Aug 23, 2021 · 4 comments

Comments

@lairongxuan
Copy link

lairongxuan commented Aug 23, 2021

re_agcn_model.py中,ReAgcn类的get_attention()方法,从源代码上看,这是计算paper中的公式(3)。所以是否可以这么理解:

paper中提到的attention,其实就是通过公式(3)选择合适的 ?

如果是这么理解,那么这里注意力得分的计算方法与传统self-attention或Multi_head attention差别较大,之间是否有什么联系?

def get_attention(self, val_out, dep_embed, adj):
        batch_size, max_len, feat_dim = val_out.shape
        val_us = val_out.unsqueeze(dim=2)
        val_us = val_us.repeat(1,1,max_len,1)
        val_cat = torch.cat((val_us, dep_embed), -1)
        atten_expand = (val_cat.float() * val_cat.float().transpose(1,2))
        attention_score = torch.sum(atten_expand, dim=-1)
        attention_score = attention_score / feat_dim ** 0.5
        # softmax
        exp_attention_score = torch.exp(attention_score)
        exp_attention_score = torch.mul(exp_attention_score.float(), adj.float())
        sum_attention_score = torch.sum(exp_attention_score, dim=-1).unsqueeze(dim=-1).repeat(1,1,max_len)
        attention_score = torch.div(exp_attention_score, sum_attention_score + 1e-10)
        return attention_score
@yuanheTian
Copy link
Contributor

re_agcn_model.py中,ReAgcn类的get_attention()方法,从源代码上看,这是计算paper中的公式(3)。所以是否可以这么理解:

paper中提到的attention,其实就是通过公式(3)选择合适的 ?

如果是这么理解,那么这里注意力得分的计算方法与传统self-attention或Multi_head attention差别较大,之间是否有什么联系?

def get_attention(self, val_out, dep_embed, adj):
        batch_size, max_len, feat_dim = val_out.shape
        val_us = val_out.unsqueeze(dim=2)
        val_us = val_us.repeat(1,1,max_len,1)
        val_cat = torch.cat((val_us, dep_embed), -1)
        atten_expand = (val_cat.float() * val_cat.float().transpose(1,2))
        attention_score = torch.sum(atten_expand, dim=-1)
        attention_score = attention_score / feat_dim ** 0.5
        # softmax
        exp_attention_score = torch.exp(attention_score)
        exp_attention_score = torch.mul(exp_attention_score.float(), adj.float())
        sum_attention_score = torch.sum(exp_attention_score, dim=-1).unsqueeze(dim=-1).repeat(1,1,max_len)
        attention_score = torch.div(exp_attention_score, sum_attention_score + 1e-10)
        return attention_score

您好,感谢您关注我们的文章。

关于您提到的问题,我们的回答如下:

paper中提到的attention,其实就是通过公式(3)选择合适的p_{i,j}^{(l)} ?
==> paper 中提到的 attention 是按照公式(3)计算得到;公式(3)只是在计算,并没有选择的过程。在这个计算中,有些 p_{i,j}^{(l)} 的值会比较高,有些会比较小。这就使得那些得到较高权重(attention)的边对模型的预测有更大的贡献,从宏观上实现了对不同边的选择。

如果是这么理解,那么这里注意力得分的计算方法与传统self-attention或Multi_head attention差别较大,之间是否有什么联系?
==> 我们提出的模型中 attention 的概念,使用的是更广义的“权重”的概念,与 self-attention,multi-head attention 这种具体的模型做法没有必然的联系。

希望上述回答能够帮到您。

谢谢,
Yuanhe

@lairongxuan
Copy link
Author

re_agcn_model.py中,ReAgcn类的get_attention()方法,从源代码上看,这是计算paper中的公式(3)。所以是否可以这么理解:
paper中提到的attention,其实就是通过公式(3)选择合适的 ?
如果是这么理解,那么这里注意力得分的计算方法与传统self-attention或Multi_head attention差别较大,之间是否有什么联系?

def get_attention(self, val_out, dep_embed, adj):
        batch_size, max_len, feat_dim = val_out.shape
        val_us = val_out.unsqueeze(dim=2)
        val_us = val_us.repeat(1,1,max_len,1)
        val_cat = torch.cat((val_us, dep_embed), -1)
        atten_expand = (val_cat.float() * val_cat.float().transpose(1,2))
        attention_score = torch.sum(atten_expand, dim=-1)
        attention_score = attention_score / feat_dim ** 0.5
        # softmax
        exp_attention_score = torch.exp(attention_score)
        exp_attention_score = torch.mul(exp_attention_score.float(), adj.float())
        sum_attention_score = torch.sum(exp_attention_score, dim=-1).unsqueeze(dim=-1).repeat(1,1,max_len)
        attention_score = torch.div(exp_attention_score, sum_attention_score + 1e-10)
        return attention_score

您好,感谢您关注我们的文章。

关于您提到的问题,我们的回答如下:

paper中提到的attention,其实就是通过公式(3)选择合适的p_{i,j}^{(l)} ?
==> paper 中提到的 attention 是按照公式(3)计算得到;公式(3)只是在计算,并没有选择的过程。在这个计算中,有些 p_{i,j}^{(l)} 的值会比较高,有些会比较小。这就使得那些得到较高权重(attention)的边对模型的预测有更大的贡献,从宏观上实现了对不同边的选择。

如果是这么理解,那么这里注意力得分的计算方法与传统self-attention或Multi_head attention差别较大,之间是否有什么联系?
==> 我们提出的模型中 attention 的概念,使用的是更广义的“权重”的概念,与 self-attention,multi-head attention 这种具体的模型做法没有必然的联系。

希望上述回答能够帮到您。

谢谢,
Yuanhe

非常感谢解答,基本与我理解的一致。

另外还有一个问题,您公开的代码并不能跑通,且bug出现在关键代码上,属于逻辑bug,所以按着我自己的理解改写了一下代码,但是没有跑到paper里的效果,不清楚是哪里出了问题。

所以,请问可否把您的超参数也公开,参考参考,也顺带验证我的代码问题出在哪。非常感谢。如有不便,请原谅我的冒昧!

@yuanheTian
Copy link
Contributor

您好,

我们对代码进行了测试,该代码是没有问题的,没有遇到bug。您如果对代码进行了修改,您有可能得到不同的实验结果。

关于超参数,您可以参考我们的论文 Appendix A 中的相关内容。值得指出的是,该参数为我们的环境下的较为合适的一套参数。如果您使用不同的环境训练模型,最优超参数可能会与文章中提到的不同。

关于模型结果的复现。您可以通过 github 主页的链接,从 Google Drive 下载我们提前训练好的模型。该模型可以在测试集上复现论文中提到的分数。

希望以上可以帮到您。

谢谢

@lairongxuan
Copy link
Author

您好,

我们对代码进行了测试,该代码是没有问题的,没有遇到bug。您如果对代码进行了修改,您有可能得到不同的实验结果。

关于超参数,您可以参考我们的论文 Appendix A 中的相关内容。值得指出的是,该参数为我们的环境下的较为合适的一套参数。如果您使用不同的环境训练模型,最优超参数可能会与文章中提到的不同。

关于模型结果的复现。您可以通过 github 主页的链接,从 Google Drive 下载我们提前训练好的模型。该模型可以在测试集上复现论文中提到的分数。

希望以上可以帮到您。

谢谢

好的,感谢,我再试试

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants