PCNN实践

学习了这份代码, 但我出了bug没有跑起来

PCNN的原理省略. 这个模型希望通过已知实体的上中下三部分的文本环境, 基于环境判断关系是否存在.
使用CNN我猜是因为textCNN的影响. textCNN可以无视输入句子尺寸地进行训练, 依靠max pooling和卷积层强大的信息提取能力, 保证训练结果. PCNN需要同样的机制.

PCNN+ATT

主要是想总结一下attention的使用.
关系抽取方面, 因为数据过于难搞, 所以大多用多示例学习+远程监督的方式, 即搜罗很多包含a和b的句子, 然后假定这些句子里必有一个表示a和b关系的句子, 就把这些句子打个包, 给这个包标上a和b的关系.
PCNN+ONE是在训练过程中通过最大熵的计算, 获得那个最有可能存在关系的句子, 只做这个句子的输出.
PCNN+ATT认为ONE的处理太硬性, 其实其他的句子也可能包含一些能学到的东西, 所以利用attention做一个输出与标签之间的相似度, 相似度归一化后用它来决定每个句子的输出信息保留多少. 这里的attention用xAr, 其中x就是每个句子的输出特征矩阵, r是标签矩阵, A是转移矩阵. 如果这里用xr, 那就是PCNN+ONE. 因为对一个包来说只有一个关系标签, 所以r就是个零一矩阵, 只有对应的关系上是1. 也就相当于Ar是在选择A的某一个向量, 也就相当于A是所有关系在高维空间上的映射.

这一点很重要

接上文, 如果A是标签的映射, 那xA就必然是特征经转移矩阵到关系空间的路径, xAr可以计算相似度, 那xA+b就肯定能得到对应的关系标签. 所以这个A既作为attention的矩阵, 又作为预测关系的W.

代码: mask机制

此mask与bert中的训练词向量的mask不同, 它只是一个计算时的小trick. 这个trick来源于openNRE的PCNN实现.
PCNN要对三部分矩阵分别进行max pooling, 那就要在pooling之前把卷积结果分割, 再求pooling.
mask是这样做的. 为方便我就以实例来说明:
有一个句子, 一共5个词, 所以它某个核卷积后的结果是[3,4,7,1,5]. 正常方法是分割成[3,4],[7,1],[5], 然后逐段做pooling得到[4,7,5].
而mask将这个矩阵变成这样:
[[103, 3, 3],
[104, 4, 4]
[7, 107, 7]
[1, 101, 1]
[5, 5, 105]]
另: mask矩阵是这样
[[100, 0, 0],
[100, 0, 0],
[0, 100, 0],
[0, 100, 0],
[0, 0, 100]]
可以看到, 第一个矩阵是[3,4,7,1,5] T ^T T+第二个矩阵的结果, 这个预先处理的mask矩阵可以把一句话的三部分有效地摘出来, 只要在列向量上求max. 对其求max后获得[104, 17, 105], 同时减去100, 结果为[4,7,5], 和普通的pooling操作结果一致, 空间占用*3, 但由于不用逐个句子切割所以pooling速度大大加快.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值