一、写在前面的话
之前介绍的关系抽取方法都是基于完全正确的标注数据集上来做的,这样的标记数据集耗时耗力,且往往数据规模较小。现如今有相当多的可用的大规模知识图谱,因此很多专家学者开始考虑是否可以引入知识帮助标记,于是远程监督的方法随之孕育而出。远程监督的方法利用知识图谱中的两个entity以及对应的某个relation对句子进行标注,如果某个句子中同时包含了两个entity,那么就假定这个句子包含了上述的relation,但这么做的弊端便是引入了大量噪声数据,因为包含两个entity的句子不一定可以刻画对应的relation,如下图所示, 对于NYT 语料中的第一个句子的确描述了 Founder的关系,但是第二句就不是这个关系,因此属于噪音。

另外,关于该论文常使用的数据集是通过远程监督的方法,使用FreeBase对NYT进行标注生成的数据,里面会有噪音数据。一般该领域的论文会在这个数据集上适当地进行过滤,复现的时候要注意一下。
二、论文笔记
这篇论文直接看可能并不好懂,可以先参考《Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks》,本篇论文基本上就是在这篇论文的基础上改进而来。
1. 《Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks》
该论文提出了远程监督中的一些挑战:
- 与完全标注正确的数据集相比,远程监督的数据里面有非常多的噪声,如果直接套用之前的监督方法,很有可能使得model不work
- 为了避免上述的问题,之前所提出的方法做了大量的特征工作,耗时耗力
为了解决上述两个问题,该论文提出了:
- at least one的假设,即在数据集中包含两个实体的句子有很多,它们中可能会有噪声,但是至少有一个句子是真的包含了两个实体所应该对应的真正的关系,所以干脆我们只选择一个最可能的一个(对,只有一个)
- 提出了用深度学习结构代替原来的特征工程,其结构同Relation Classification via Convolutional Deep Neural Network的工作相似,仅有些许变化,有兴趣可以直接看这篇论文

2. 动机和论文模型的整体结构
在了解了《Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks》的思路之后,本篇论文的思路就很好理解了,主要是针对at least one的假设的假设,认为只选一个句子的话,太浪费远程监督所得到的实体信息了,所以在之前论文的基础上,使用attention获得所有句子的信息。

3. 句子编码
从模型的整体结构可以看到,先需要对拥有相同实体的每个句子进行编码,形成一个:

该部分其实没什么好说的,和传统方法大致相同。
4. Attention机制
这里对所有句子编码之后的向量进行加权操作:
具体有两种方法:
- 直接取平均,这种方法会放大噪声,理论是不太可取
- Attention: 使用bag的label,即FreeBase中两个实体的关系和每个句子做Attention,但是并不知道每个句子真实的标签,此时使用每个bag的label和每个句子做Attention得到权重,减少噪声的影响:


得到加权后的向量,并不是通过softmax得到分类结果,而是计算现在输出的向量 每个relation的相似度作为relation的score。
4. TEST阶段
一般来说,训练和测试的方法差距不大,但这篇论文由于训练阶段使用了训练数据对应的label的embedding,所以在测试阶段加入句子与所有relation的加权向量,最后通过max得到最后的预测概率。
5. 实验结果

三、代码阅读和调试
代码阅读选用OpenNRE的代码,调试可按下面步骤进行
- 数据集生成
代码库的文档里给出了原始形式的数据集的下载地址,以及用于将原始数据形式转化到OpenNRE所需数据形式的工具,建议还是用清华云,几分钟就下好了: Google Drive or Tsinghua Cloud
下完之后需要进行以下两步才能进行转化,这里我直接在自己的MAC转换,windows上可能会有坑:
1. protoc --proto_path=. --python_out=. Document.proto
2. python protobuf2json.py
需要注意的是,执行第二步需要加个根目录,而且代码里使用了rb
的模型读取数据导致了报错,需要注意一下,完成后生成: train.json和test.json
- 代码运行
代码上直接运行train_demo.py
即可训练,整体的文件结构解耦且清晰,测试和画图代码都有,很方便在上面进行修改对比。在训练结束后会在test_result上生成相应的数据供绘图需要,运行python draw_plot.py {MODEL_NAME_1} {MODEL_NAME_2} ...
即可获得论文的图,这里由于RNN速度太慢,就训练了10轮:

测试效果上,使用PCNN+ATT在60轮之后的AUC是0.339左右,所给出的效果,另外代码中还给出了强化学习训练的套路,值得学习。
四、总结
这篇论文很好地利用Attention对噪声数据做了抑制,同时也借由此利用更多正样例的信息。但同时,这篇论文的test部分的复杂度过高,如何更好地减少噪声数据的影响同时减少模型的复杂度,将是这一领域的研究重点。
网友评论