构建知识图谱最重要的工作就是从非结构化的文本中抽取关系三元组 (subject,relation,object), 原来的方法我们都是组装一个 pipeline 来完成这项工作,比如:先训练一个 NER 模型进行实体抽取,再训练一个 RE 模型对实体关系进行分类。
Paper:https://arxiv.org/pdf/1909.03227v4.pdf
Github:https://github.com/weizhepei/CasRel
Github:https://github.com/longlongman/CasRel-pytorch-reimplement
Github:https://github.com/Sherlock-coder/CasRel
CasRel 模型可以理解为一个将 NER 和 RE 任务整合到一起的联合模型。该模型的架构如下图所示:
模型在进行 SPO 抽取时,分为两个阶段:
- 第一个阶段,先将输入的 sentence 输入到 Bert 网络得到 token 的表征,对每一个 token 进行解码得到头实体 Subject
- 第二个阶段,将头实体信息融入到 Bert 的输出的 token 表征中,再解码出某种关系(Relation)下是否存在对应的尾实体 Object
结合上图,输入的句子 (Jackie R. Brown Was Born In Washington, The Capital City Of United States Of American) 经过 Bert 编码器得到每个 Token 的编码,然后经过下面公式计算出头实体的开始和结束位置:
这两个公式对应的实现,就是将 Bert 输出的每个 Token 编码分别输入到 Start 和 End 两个线性层中,Start 线性层用于预测当前 Token 是否是头实体的开始位置,End 线性层用于预测当前 Token 是否是头实体的结束位置,最后 sigmoid 给出为头实体开始或者结束的概率。这一部分的优化目标如下公式:
至此,就是 CasRel 的 Subject Tagger 识别阶段。下一个阶段被称作 Relation-specific Object Taggers,从名字可以看到这里就是开始在特定关系的基础上去预测是否包含尾实体,这一部分的计算公式如下:
我们从该公式可以看到,每一个 Token 的表征 \(x_i\) 都加上一个 [v_{sub}^{k}],这个 [v_{sub}^{k}] 从论文中的表述:
we take the averaged vector representation between the start and end tokens of the k-th subject as \(v_{sub}^{k}\)
以及前面 CasRel 架构图示可知,它表示从 Subject 的开始到结束位置的所有 Token 向量的均值。这里我有一点还没有思考清楚:
如果检测到了多个头实体,这时需要把所有 Subject 的 Token 向量相加取均值,然后加到 Bert 输出的每个 Token 向量中吗?
我看到一种复现时的思路,在训练时,假设检测到了多个 Subject,随机从中选择一个 Subject,只预测这个 Subject 对应的 Relation 和 Object。推理时,则将所有的 Subject 都加起来取均值,加到 Bert 输出中。
这一部分的优化目标公式如下:
整体训练对数似然公式表示如下:
公式中:
- \(T_{j}|s\) 表示存在 Object 的类别对应的损失。例如:Subject “Jackie R. Brown” 对应的 Object “Washington” 存在于 Birth place 类别中。
- \(R\backslash T_{j}|s\) 表示 \(T_{j}|s\) 的余集。例如:Subject “Jackie R. Brown” 在 “Work_in” 关系中不存在对应的 Object。
实验结果如下图所示:
根据上图,我们还可以看到 CasRel 模型能够处理关系重叠的问题,什么是关系重叠,如下图所示:
- EPO:EntityPairOverlap,表示同一对 Subject 和 Object 对有不同的 Relation 表示。
- SEO:SingleEntityOverlap,表示同一个 Subjec 和 不同的 Object 存在不同的 Relation 表示。
结合 CasRel 的架构图:
假设同一对 Subject 和 Object 存在多个 Relation(Work_in 和 Birth_place),那么模型预测出来的 Object 会在 Work_in 和 Birth_place 两个类别中。
假设同一个 Subject 对应了多个 Object 的不同的 Relation,那么模型预测出来的不同的 Object 存在于不同的类别中。