这个链接中的实现就是PCNN
https://github.com/zjunlp/DeepKE/blob/main/tutorial-notebooks/re/standard/tutorial.ipynb
其中对piece wise max pooling这一步的实现(使用broadcast机制)很巧妙。
out = out.unsqueeze(-1) # [B, L, Hs, 1]
pcnn_mask = x['pcnn_mask']
pcnn_mask = self.pcnn_mask_embedding(pcnn_mask).unsqueeze(-2) # [B, L, 1, 3]
out = out + pcnn_mask # [B, L, Hs, 3]
out = out.max(dim=1)[0] - 100 # [B, Hs, 3]
out_pool = out.view(out.size(0), -1) # [B, 3 * Hs]
out_pool = F.leaky_relu(self.fc_pcnn(out_pool)) # [B, Hs]
out_pool = self.dropout(out_pool)
out = out + pcnn_mask
就是相当于下面的操作
再按每个seg维度进行max操作,就只有那个seg维度上的max值被保留了。就相当于论文图中求出了每个seg的maxpooling,而且也自然而然地concat在了一起,然后再减去100,恢复到原来的分布。
网友评论