nlp论文学习(关系抽取)——Distant Supervision for Relation Extraction via Piecewise Convolutional Neural (2015)
简述
此篇论文是面向关系抽取(关系分类)任务的模型设计阐述,主要亮点有两个:
- PCNN:用以解决(缓解)传统特征工程等nlp工具的繁杂和表现不好的问题,并实验证明能够有效提取出entity词对相关的关键信息。
- Multi-instance的使用:在instance-level数据输入的基础上使用了bag-level的数据输入,即多个instance组成一个bag,用以解决(缓解)distant supervision数据集标注时出现wrong label的问题。
PCNN能够有效地抓住关系抽取(关系分类)的任务数据特征,将语句分成三部分,契合entiy词对,思路清晰,mutil-instance的使用缓解了数据集数量不够以及distant supervision(远程监督)生成的数据wrong label的问题。
扩展关键词
-
Distant Supervision(远程监督):
定义:只要包含两个Entity的句子,都在描述同一种关系。
用途:主要用来为关系分类任务扩充数据集。
优点:能够很快速地为数据集打上标签
缺点:它假设只要包含两个Entity的句子,都在描述同一种关系,这个假设会产生很多地错误标签。可能这两个Entity这是与某个主题有关。 因此往往还需要用一些过滤的方法去筛选出对关系分类有用的句子,比如sentence-level Attention。 -
mutil instance learning(多示例学习):
在此类学习中,训练集由若干个具有概念标记的包(bag)组成,每个包包含若干没有概念标记的示例。若一个包中至少有一个正例,则该包被标记为正(positive),若一个包中所有示例都是反例,则该包被标记为反(negative)。通过对训练包的学习,希望学习系统尽可能正确地对训练集之外的包的概念标记进行预测。
模型概述
PCNN本体
模型本身并不难理解,话不多说,直接看图:
首先(CNN)对嵌入了词向量的语句本身做传统的一维文字卷积,这里需要注意的是,语句中每个词的向量不仅包含词向量本身,还concat了PF(position features)。这里的PF其实和14年用CNN做关系分类的那篇论文意思一样,指的是当前词到entity词对的相对距离为index所训练出来的pos_embedding(作为参考,本文中的词向量维度为50,PF维度为5,最终的向量维度为50+2*5),如下图所示:
然后(Piecewise Max Pooling)与传统的整体一起做single max pooling不同,此文作者设计了分段式的max池化,以两个entity词为分界线,将每个语句分成三部分,对每个部分分别作出max池化,如图中第二部分所示。这样每个卷积核对输入向量完成卷积并池化后的向量维度变为了 [1, 3]。而n个卷积核卷积并池化后所得到的所有向量concat起来所得到的输出结果即为 [n, 3]。这样分成三部分完成卷积容易观察到,能够更大程度上保留entity词对中两个词的信息,比起对整个向量single max池化要更加合理。在池化后在经历一个tanh**函数。
最后(softmax)后大多数多分类任务一样,作者使用一个非线性全连接层(softmax**函数)作为输出层,并且加入了dropout,至此本体模型的简述结束。
使用Multi-Instance
作者在设计的PCNN模型中使用multi-instance learning的学习思想,即在传统的instance level的基础上,封装了更高一层的bag level,多个instance组成一个bag。使用这个思路是为了解决(缓解)distant supervision(远程监督)所带来数据出现wrong label的问题。这个思想的精髓是,只要一个bag中至少有一个正例,那么在一定程度上就认为这个bag为正例。
适用在PCNN完成这个关系分类的任务上来说,主要体现在计算输出层的loss上面,即取每个bag中条件概率最大的那个instance,看做整个bag的代表,进行loss计算,并进行反向传播。
由此看来,通过使用更高一级的bag,以此来稀释数据,这样能够很显著地缓解wrong label的问题,但缺点也有,第一,这样做可定会比只是用instance level计算量要来的大一些,第二,这样做容易让模型过拟合表现较好的实例。不过总体看,相比于传统不使用bag-level的方式来说,对于指标的提升肯定是正面影响,所以还是值得的。
对于具体实现来说,先把bags分成mini-batch,然后随机抽选mini-batch,其中的每个bag逐个投入网络进行训练。作者试验后发现,w(filter_size)为3,n(filter_num)为230的时候效果比较好,并最后使用Adadelta优化器进行训练。