目录
前言
本文总结关系抽取中的远程监督方法,解读三篇重要论文。第一篇是开山之作,第二篇解决了第一篇中的数据标注错误问题,第三篇解决了第二篇中的特征遗失问题。但是从最终的测试结果来看,论文的效果离落地实用还相差太远。
1. 远程监督关系抽取开山之作
论文:Distant supervision for relation extraction without labeled data. ACL 2009.
地址:论文地址
1.1 介绍
关系抽取模型的目的是从关系集合中挑选一个关系分配给未知实体对,实际上就是分类任务。所以模型训练时需要学习每类关系所对应的特征(注意不是学习实体对的特征),满足这些特征的实体对就属于该类关系。训练监督学习模型需要标注数据,人工标注这些数据耗费大量时间,因此人们提出远程监督学习。
远程监督的假设:如果两个实体有关系,那么任何包含这两个实体的句子都可以表达这种关系。
假设实体e1和e2具有关系Ra,可表示为Ra{e1, e2}。若数据集中存在一个句子包含e1和e2,则说明该句子表达了关系Ra,将该句子标注为关系Ra的一个样本。使用这种方法,便可以从未标注数据集中得到标注的训练集。这就是远程监督的核心思想。
1.2 训练过程
1.2.1 数据标注方法
使用NER模型标记句子中的实体,例如标记人名、组织、位置等实体,关系抽取就是去抽取这类实体之间的关系。实体的类型依据自己需求而定。如果一个句子包含知识图谱中的两个实体,并且这两个实体在知识图谱中具有某种关系,那么就将该句子标注为该关系。
例如,在知识图谱中有 股东{马云,阿里巴巴}。句子“马云于今日卸任阿里巴巴董事职位。”,该句子中同时含有马云和阿里巴巴,那么就将该句子标注为具有股东关系,于是得到一条训练样本:
句子:马云于今日卸任阿里巴巴董事职位。 label:股东
使用这种方法可以为每个类别生成很多个标注样本,有了标注样本就可以训练分类模型。
1.2.2 训练方法
首先为每类关系创建一个特征向量。创建方法很简单,直接提取句子的特征,提取方法不限,可使用深度学习模型,或者传统的特征工程。若有10个句子包含该关系,每个句子能提取3个特征,那么该关系的特征向量中就包含30个特征。即使有些提取的特征并不能表达出该关系,但是特征向量中包含众多特征,也许大部分特征或者部分特征联合起来,还是能有效表达该关系的,这是远程监督有效性的保证。
得到关系的特征向量后,便可训练一个分类模型,分类模型有很多,可自行选择。
1.3 测试过程
首先使用NER标识句子中的实体。这一次,只要一对实体同时出现在一个句子中,都被认为这一对实体含有一个潜在的关系。
抽取句子中的特征,并添加到该实体对的特征向量中。例如,如果测试集中有10个句子出现了这对实体,从每个句子中提取3个特征,那么这对实体就会有30个相关特征。
分类模型根据该实体对的特征向量预测一个关系类别。
1.4 思考
为什么训练集中要用NER去识别词的类型呢?在训练过程中这个并没有用处。这是因为在测试集中没有标注好的实体,实体都不知道更无从判断关系。使用NER识别后即认为这两种实体之间可能存在关系,此时并不关心这些实体具体是什么,只需抽取这句话的特征,放入关系分类器中分类即可。
要注意训练过程和测试过程中,模型输入的特征向量不同。训练过程中是关系的特征向量,测试过程中是实体对的特征向量。训练时我们想让模型知道含有关系Ra的句子都有哪些特征,所以我们将所有含有关系Ra的句子的特征组合成一个特征向量,这便是关系Ra的特征向量。测试时我们想知道这对实体的关系类别,所以我们将所有含有这对实体的句子的特征组合成一个特征向量,这便是这对实体的特征向量。特征向量本质都是句子特征。
论文的特征提取过程不再讲述,因为不适用于深度学习模型中,没有借鉴意义。
1.5 总结
这篇论文提出的远程监督方法,无需人工标注数据也能训练监督模型,是关系抽取领域的重大突破。但是,该方法在提出之初显然也存在诸多问题。最大的问题就是标注的数据不一定蕴含对应的关系。例如,在1.2.1节举的例子,该句子就无法显示该类关系。因此,训练集中实际存在大量标注错误的句子。为解决这个问题,有学者就提出了PCNN模型。
2. PCNN
论文:《Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks》
地址:论文地址
2.1 介绍
远程监督学习是关系抽取的重要方法,但是远程监督个重大缺点:标注错误问题。实体A和B在知识图谱中的关系为R,远程监督认为所有同时包含实体A和B的句子都具有R关系,显然会造成标注错误。此外,传统的关系抽取方法中,需要精巧的特征工程,通常会使用到NLP分析工具,由于这些工具在分析句子时可能存在错误,这种错误会传播到关系抽取模型中,错误的传播和积累降低模型性能。
本文提出的模型PCNN(Piecewise Convolutional Neural Networks)可以解决上述两个问题。本文将远程监督学习看作是一个多实例学习问题,用于解决第一个问题。然后使用CNN模型自动学习文本特征,从而解决第二个问题。在CNN最后的池化操作中,本文使用分段池化方法。作者认为可以根据两个实体的位置,将句子划分为三部分,左边部分包含了左边实体信息,中间部分包含了两个实体信息,右边部分包含了右边实体信息。对全局进行池化操作无法捕获这种结构信息,因此作者分别对三部分进行池化操作。
2.2 模型结构
本文提出的PCNN模型如下图所示:
模型包含四部分:Vector representation,Convolution,Piecewise maxpooling,softmax classifier。
Vector representation将词转化为词向量,并添加位置向量,图中position表示位置向量。这里的位置是每个词相对两个实体的相对位置。例如,下图中son相对两个实体的位置分别为p1=3和p2=-2。位置向量随机初始化,拼接[p1, p2]作为son的位置向量。
常用的池化操作是max pool over time,这种方式避免了池化输出尺寸随句子长度变化。但是,这种方式不适合关系抽取任务,因为对句子长度特征池化,无法捕获细粒度特征。本文提出分段池化,将句子按照实体位置分为三段,分别对每段池化。池化输出长度是固定的,对池化结果进行tanh激活, g = t a n h ( p 1 : n ) g=tanh(p_{1:n}) g=tanh(p1:n)。
Softmax计算每类关系的得分, o = w 1 g + b o=w_{1}g+b o=w1g+b。为了防止过拟合,对g随机失活。使用伯努利随机初始化的向量r,对g进行掩模,即完成了失活操作。所以有 o = w 1 ( g ∗ r ) + b o=w_{1}(g*r)+b o=w1(g∗r)+b。
为了降低错误标注带来的影响,本文使用多实例学习方法。知识图谱中一个实体对(论文中的bag)的关系是已知的,外部语料库中包含该实体对的多个句子(instance of bag)表达的关系是未知的,多实例学习的假设是:这些句子中至少有一个句子表达了已知关系,于是挑选出这个句子作为训练样本加入到训练集中。
多实例学习每次使用一袋样本而不是单个样本,这一袋数据都包含同一对实体,袋的标签为实体对在知识图谱中的关系,袋中数据相互独立。训练时一个batch size有T袋,首先从每袋数据中找出最具代表性的样本,用这个样本的标签看作是这袋数据的预测标签。然后计算袋的损失,而不是样本损失。算法过程如下图:
下面公式(9)用于计算一袋数据中最具代表性的样本:
y
∗
=
a
r
g
m
a
x
j
p
(
y
i
∣
m
i
j
;
θ
)
,
1
≤
j
≤
q
i
y^*=argmax_{j}p(y_{i}|m_{i}^j;\theta),1\leq j\leq q_{i}
y∗=argmaxjp(yi∣mij;θ),1≤j≤qi
式中
q
i
q_{i}
qi表示一袋数据数量,
y
i
y_{i}
yi表示第i袋数据标签,
m
i
m_{i}
mi表示第i袋数据,
m
i
j
m_{i}^j
mij表示第i袋数据中第j个样本。
如果batch size有T个实体对,用上面方法挑选出T个句子,计算交叉熵损失:
J
(
θ
)
=
∑
i
=
1
T
l
o
g
p
(
y
i
∣
m
i
j
;
θ
)
J(\theta)=\sum_{i = 1}^{T}log p(y_{i}|m_{i}^j;\theta)
J(θ)=i=1∑Tlogp(yi∣mij;θ)
式中T表示袋的数量,
y
i
y_{i}
yi表示第i袋数据标签,
m
i
j
m_{i}^j
mij表示第i袋数据中第j个样本,这个样本由公式9选出。
2.3 实验结果
知识图谱为Freebase,外部文档库为NYT。把NYT文档库中2005-2006年的句子作为训练集,2007年的句子作为测试集。评估方法沿用留出法和人工校验相结合。
留出法的做法是把Freebase中一半的实体对用于训练,一半的实体对用于测试。多分类模型训练好之后,对外部文档库NYT中的测试集进行预测,得到测试集中实体对的关系标签。如果新发现的实体对有N个,其中有n个出现在Freebase的测试集中,那么查准率(Precision)为n/N,而不在Freebase测试集中的实体对就视为不存在关系。可是由于Freebase中的实体对太少了,新发现的、不在Freebase里的实体对并非真的不存在关系,这就会出现假负例(False Negatives)的问题,低估了查准率。所以人工校验的方法是对留出法的一个补充,对于那些新发现的、不在Freebase测试集中的实体对(一个实体不在或者两个实体都不在)进行检查,计算查准率。所以留出法和人工校验要评估的两个新实体对集合是没有交集的。具体做法是从这些新实体对中选择概率值最高的前N个,然后人工检查其中关系标签正确的实体对,如果有n个,那么查准率为n/N。
将分段最大池化和普通的最大池化的效果进行对比(PCNNs VS CNNs),将结合多实例学习的卷积网络与单纯的卷积网络进行对比(PCNNs+MIL VS PCNNs)。可以看到,分段最大池化比普通的最大池化效果更好,表明分段最大池化可以抽取更丰富的结构特征。把多实例学习加入到卷积网络中,效果也有一定的提升,表明多实例学习可以缓解样本标注错误的问题。
这篇论文中,分段最大池化的奇思妙想来自于传统人工构造特征的思想,而多实例学习的引入缓解了第一篇论文中的样本错误标注问题。这篇论文出来以后是当时的SOTA。不足之处在于,多实例学习仅从包含某个实体对的多个句子中,挑出一个最可能的句子来训练,这必然会损失大量的信息。所以有学者提出用句子级别的注意力机制来解决这个问题。
3. 句子级别注意力
论文:《Neural Relation Extraction with Selective Attention over Instances》
地址:论文地址.
3.1介绍
远程监督的目的是生成标注数据,由于假设性太强,导致部分标注错误,错误的样本会影响模型性能。为了解决这种标注错误,有人提出了多实例学习方法。多实例学习的假设是:这些句子中至少有一个句子表达了已知关系,挑选出这个句子作为训练样本加入到训练集中。但是,当多个句子都表达了同一个关系时,只选用一个句子作为训练集,会遗漏其他句子所表达的特征信息,也就是说多实例学习会遗漏大量特征,导致模型无法学习到这些特征。本文就是要解决特征遗漏问题。
本文使用选择性注意力方法从包含相同实体对的多个句子中学习特征,能够表达该关系的句子特征赋予高权重,无法表达该关系的句子特征赋予低权重。因此使用本方法可以采用远程监督获取的数据集去训练模型,而不用担心远程监督带来的标注错误问题,同时多个句子的特征都被学习,避免了特征遗漏问题。
这篇论文用句子级别的注意力机制代替多实例学习,对于包含某实体对的所有句子,给每一个句子计算一个注意力得分,动态地降低标注错误的样本的得分,再进行加权求和,从而充分利用所有句子的信息。
多实例学习相当于硬注意力机制(Hard Attention),而论文中用到的注意力机制是选择性注意力机制(Selective Attention)或者说软注意力机制(Soft Attention)。所以多实例学习其实是选择性注意力机制的特殊情况(只有一个句子的权重为1,其他全为0)。
3.2 模型结构
模型主要分为两个部分:句子编码器和注意力层。
3.2.1 句子编码器
句子编码器就是第2小节中的PCNN或CNN网络结构,由卷积神经网络的输入层、卷积层、池化层、非线性映射层(或者说激活函数)构成。文本特征同样用词嵌入和位置特征嵌入,池化层用普通的最大池化或者分段最大池化。因此,本文的句子编码器部分输出的是一个句子经过最大池化并且非线性激活后的特征向量,用于输入到注意力层。
3.2.2 注意力层
句子编码器的作用是抽取一个句子的特征,得到一个特征向量。如果外部文档库中包含某实体对的句子有n条,那么经过句子编码器的处理后,可以得到n个特征向量:
x
1
x_{1}
x1,
x
2
x_{2}
x2 …,
x
n
x_{n}
xn。
上图中xi表示一个句子,
x
1
x_{1}
x1到
x
n
x_{n}
xn是一个实体对标注的句子,即这些句子中都包含同一对实体。
在句子编码器和softmax层之间加一个选择性注意力层,那么处理的步骤如下:
第一步:计算句子的特征向量
x
i
x_{i}
xi和关系标签 r 的匹配度
e
i
e_{i}
ei,并计算注意力得分
α
i
\alpha_{i}
αi。公式中的 r 是关系标签的向量表示,A是一个矩阵。
e
i
=
x
i
A
r
e_{i}=x_{i}Ar
ei=xiAr
α
i
=
e
x
p
(
e
i
)
∑
k
e
x
p
(
e
k
)
\alpha_{i}=\frac{exp(e_{i})}{\sum_{k}exp(e_{k})}
αi=∑kexp(ek)exp(ei)
第二步:计算该实体对的特征向量s。该实体对的特征向量是所有句子的特征向量
x
i
\textbf{x}_{i}
xi的加权之和,权重为每个句子的注意力得分
α
i
\alpha_{i}
αi。
s
=
∑
i
α
i
x
i
s=\sum_{i}\alpha_{i}\textbf{x}_{i}
s=i∑αixi
第三步:经过softmax层得到该实体对关于所有关系类别的概率分布,概率值最大的关系为预测的关系标签。
o
=
M
s
+
d
\textbf{o}=\textbf{M}s+\textbf{d}
o=Ms+d
p
(
r
∣
S
,
θ
)
=
e
x
p
(
o
r
)
∑
k
=
1
n
r
e
x
p
(
o
k
)
p(r|S,\theta)=\frac{exp(o_{r})}{\sum_{k=1}^{n_{r}}exp(o_{k})}
p(r∣S,θ)=∑k=1nrexp(ok)exp(or)
损失函数:
J
(
θ
)
=
∑
i
=
1
s
l
o
g
p
(
r
i
∣
S
i
,
θ
)
J(\theta)=\sum_{i=1}^slogp(r_{i}|S_{i},\theta)
J(θ)=i=1∑slogp(ri∣Si,θ)
s表示一个batch size的实体对数量,每个实体对有不同数量句子。类似于第3节的bag,一个实体对有一袋句子,这个损失是计算袋级别损失而不是单个句子级别损失。因为句子实际上是没有真正正确标签的,这些句子的标签都是远程监督生成的,其中有部分标注错误。
3.3 实验结果
知识图谱为Freebase,外部文档库为NYT。把NYT文档库中2005-2006年的句子作为训练集,2007年的句子作为测试集。评估方法沿用留出法,留出法的做法是把Freebase中一半的实体对用于训练,一半的实体对用于测试。
句子编码器分别采用CNN和PCNN的网络结构,PCNN+ONE表示PCNN结合多实例学习的模型,PCNN+ATT表示论文中的选择性注意力模型,PCNN+AVE表示对各句子求算术平均的模型(每个句子的注意力得分相同)。
实验结果表明,无论是CNN还是PCNN,加入注意力机制的模型在查准率和查全率上,都显著优于其他模型。