pytorch-relation-extraction icon indicating copy to clipboard operation
pytorch-relation-extraction copied to clipboard

PCN中的mask矩阵问题

Open Maybewuss opened this issue 5 years ago • 5 comments

OpenNRE中的代码中mask矩阵的第一行为[0, 0, 0],但是在你的代码中是[0, 0, 1],我觉得可能是你写错了?

Maybewuss avatar Nov 26 '19 02:11 Maybewuss

是的,PCNN+ATT.py的里面的是正确的,PCNN+ONE.py里面的是有问题的。 谢谢指出问题,已经修改。

ShomyLiu avatar Nov 26 '19 02:11 ShomyLiu

还是mask,我又看了下OpenNRE,再看了下您的代码,对于mask_piece_pooling这个有点不解:

  1. mask在经过mask_embedding后被乘了一个负数,这地方我又两个疑问,第一,你的mask这里貌似没有进行求反,这里应该是给不属于当前分割段落的字符加上一个极小值,然后与x想加,这样求pooling的时候就会忽略这部分。

  2. 代码中除了没有求反以外,x = torch.max(x,1)[0] - 100 这里我也看的一头雾水,不明白这里是要做啥。 我觉得应该改成

    mask = self.mask_embedding(1-mask).unsqueeze(-2)*1e-9
    x = torch.max(mask + x, 1)[0]
    或者直接用
    x = x.masked_fill(mask == 0,-1e9)
    

Maybewuss avatar Nov 26 '19 10:11 Maybewuss

这是两种计算方法,无需求反。 只需要 * 一个比较大的数即可,也就是我们这里的100. 1会变成100,0仍然是0, 这样就可以mask掉预期的0. 后面-100 是恢复到原来的值。建议单步debug,对照每一步的输出,即可。 近期会抽时间写一个关于此处的详细介绍。

此外,OpenNRE迭代了很多版本,刚刚看了看,已经基于Pytorch了。 我参考的是当年的TensorFlow版本:https://github.com/thunlp/OpenNRE/blob/tensorflow/nrekit/network/encoder.py#L11

个人觉得之前版本更容易些。

ShomyLiu avatar Nov 27 '19 03:11 ShomyLiu

好的谢谢,我理解你的意思了,就是在mask为1的位置加上一个大的数,使得max操作的时候只关注这些位置,但是我还是有一点疑问,假如在mask为0的地方的权重比加上100后的还大,这时候怎么办?

Maybewuss avatar Dec 01 '19 07:12 Maybewuss

一般不会超过100. CNN整体的输出都是不会很大,所以就设置为100, 如果不放心,可以把100改为更大的。

ShomyLiu avatar Dec 01 '19 08:12 ShomyLiu