想象你是一名刚接手新班的班主任。你想搞清楚班里的学生谁和谁是一伙的、谁是谁的老大,但你没有时间挨个谈话。这时你发现手上有两样宝贝:一本“学生档案册”(知识库),里面记录着“张伟是苹果公司的CEO”这类现成事实;另外,你还可以去请教一位执教几十年的“资深老教师”(预训练语言模型),他只要稍微了解一下班里的情况,就能凭直觉判断两人的关系。 问题来了:档案册虽然省事,但内容可能过时,照着它给学生关系“自动贴标签”(远程监督)会贴出不少错签;而老教师虽然厉害,也需要你设计巧妙的方式去“提问”他(Prompt 方法)。这篇文章就带你看看,AI 领域的关系抽取(Relation Extraction)是怎么从“档案自动贴标签”进化到“老教师直觉判断”,以及如何用多实例学习和注意力机制处理贴错的标签、用预训练模型大幅提升效果。
职业价值:关系抽取是知识图谱构建、信息抽取落地的核心环节。掌握远程监督的噪声处理套路和预训练模型的运用方式,你就能在实际工程中低成本地搭建出能自动从文本中抽取结构化关系的系统。
可视化演示
展示远程监督利用知识库自动标注的噪声问题、多实例学习包级标注与注意力选择机制缓解噪声、以及Prompt将关系抽取转化为掩码语言建模的预训练方法。
本节配有交互动效(进入视口后自动加载,约 3KB)。
远程监督自动标注与噪声 知识库三元组匹配文本自动生成标注 错误匹配引入噪声标签需降噪处理 DS 假设:同实体对的所有句子共享同一关系
关系抽取任务
开学第一天,你要回答的问题是:“这个学生和那个学生是什么关系?” 可能是同桌、可能是师徒、可能是同社团的球友。放在自然语言处理里,这就像让模型读一段话,然后指出其中两个“人”或“物”之间的关系。比如“张伟是苹果公司的CEO”这句话,模型要能识别出“张伟”和“苹果公司”之间存在"CEO"关系。
这个任务和命名实体识别(NER)是组合拳。NER 负责从文本中圈出“谁是谁”——哪些词是人名、公司名、地名;而关系抽取负责回答“他们之间发生了什么”。如果没有关系抽取,知识图谱就永远只是一堆孤立的名字清单,形不成“张伟—CEO—苹果公司”这样有结构的知识。
形式化地看,我们定义一个分类函数:它输入一句文本和两个已经标注好的实体,从预先定义好的关系集合里选出一个最合适的标签。
回到班主任的比喻:这个分类器就像一个“关系判官”,每次递上两个学生的名字和一段校园对话,判官敲下木槌:“同桌关系!”。判官判得准不准,取决于他看过多少真实案例、对校园黑话有多熟。后面的每一种技术,本质都是在帮这位判官变得更聪明。
- 输入三元组
(s, e_1, e_2)中,s是一句话,e_1和e_2是句中两个实体,例如“张伟”和“苹果公司”,这是模型判断的依据。 - 输出关系标签
\mathcal{R}是预定义的关系类型集合,比如 {CEO, 员工,位于,出生于};r就是最终从集合里选出的那个类别。
远程监督机制
要训练这位“关系判官”,首先得准备海量带标签的数据。但人工标注一句一句地看,既磨人又烧钱。这时你发现了抽屉里的“学生档案册”——知识库。档案上写着“张伟是苹果公司的CEO”,于是你的思路来了:只要句子里同时出现“张伟”和“苹果公司”,就自动给这个句子贴上"CEO"标签,还不用花一分钱标注费。这就是远程监督(Distant Supervision)。
远程监督的核心是一个“对齐假设”:如果知识库记录了两个实体之间存在某条关系,那么任何同时提到这两个实体的句子,都被视为表达了这条关系。它的最大优点是零人工成本,只需把知识库三元组和未标注语料做一次“实体对齐”,就能批量生成训练数据。
这个“自动贴标签”的过程可以写成下面的形式:
远程监督就像“照着花名册分组”:反正档案写着他们是同桌,那所有同时出现他们的照片都归到“同桌”这一摞。这样做效率极高,可问题也随之而来——档案真的靠谱吗?
- 知识库条件
(e_1, r, e_2) \in \text{KB}表示知识库中已经存在“实体1—关系—实体2”这条三元组记录,关系r是档案里写好的。 - 句子标签生成
T(s, e_1, e_2)是远程监督给句子s自动标注的结果;对齐假设直接让它等于知识库里的关系r_{\text{KB}},不管句子本身真正想表达什么。
噪声问题
花名册过期了怎么办?你翻到档案写着“张伟与苹果公司是CEO关系”,但实际句子是“张伟在苹果店里买了一部手机”,这明显只是“顾客与商店”的关系,却被强行贴上了"CEO"的标签。这就是远程监督带来的噪声(Noise):错误标签在训练数据里大量存在,模型会学坏。
噪声主要有三个来源。第一,知识库本身不完整或过时:张伟去年是CEO,今年可能已经离职。第二,实体对之间可能有多重关系:两个实体在同一句话里被提到,并不代表它们表达了知识库里那条关系,也许只是“同框出现”。第三,实体指代有歧义:“苹果”指水果还是指科技公司?实体识别的误差也会顺着流水线传进关系抽取。
把这些噪声写进公式,观测到的标签可以看作“真实关系分布”和“噪声分布”的混合:
回到班主任的场景:如果全班另一半学生都被花名册贴错了标签,那你想从这些“档案”里学到真实关系,就像在满屋子“谣言”里找真相。好在你还有后两招——让全班投票,或者给靠谱学生更高话语权。
- 真实语义分布
P(r | s)是模型真正应该学的分布——读到句子s后,在真实世界语义下它是关系r的概率。 - 噪声干扰混合
\varepsilon是噪声率,取值范围 0 到 1;P_{\text{noise}}(r)是噪声分布,表示“随便乱标一个关系”的概率。最终观测到的标签被两者的加权混合所支配。
多实例学习
既然单句的标签常常不可靠,那就不要用单个句子下结论。多实例学习(Multi-Instance Learning, MIL)的做法是:把同一个实体对的所有句子装进一个“包”(bag)里。训练时,我们不为单句打标签,而是为“包”打标签——只要这个包里至少有一句话真实表达了知识库中的关系,整个包就算正例。
这种“包级分类”思路很巧妙地绕开了单句噪声问题。预测时,对包里的每个句子分别打分,然后取最高分作为整个包的预测分数——经典的 max 池化。只要有一个句子“喊出声”,整个包就跟着表态,不想听的那句噪声就自动在 max 面前沉默。
多实例学习就像班主任决定“全班投票”:张伟和苹果的关系,把一学期所有提到他俩的话都收集起来,只要有一句“张伟被任命为CEO”够硬核,这包记录就认定是正例。但这招也有点险——要是有人起哄“张伟昨天在苹果店买手机”,max 也可能被带偏。好在还有注意力机制这个“话事人”出来控场。
- 定义句子包
B = \{s_1, s_2, ..., s_n\}是同一实体对对应的全部句子集合,n是句子数量。 - 逐句打分
P(r | s_i)表示第i个句子表达关系r的概率,由基座模型独立计算。 - 最大池化聚合
\max操作选取包内概率最高的句子作为整个包的预测,相当于“极端乐观”——只要有一句支持,就全包支持。
注意力机制
max 的“一人喊话全员信”逻辑太绝对。更聪明的方式是:给每句话发一张票,票的分量由这句话的可信度决定。靠谱的“干货句”票值高,跑题的“水句”票值自动压低,最后所有句子按票值加权汇总。这就是注意力机制(Attention Mechanism)。
在关系抽取中,注意力机制会为每个句子计算一个“相关性得分”,然后通过 softmax 归一化成权重。理想情况下,真正表达目标关系的句子权重高,噪声句权重低。最后用这些权重对句子向量做加权平均,得到一个“净化过”的包表示,再交给分类器判断。
注意力机制就像开了个班会:班主任说“每个人都能发言,但平时靠谱的同学说话权重高,总爱跑题的同学说话权重低”。这样一来,即使班里混进几句流言蜚语,最终结论也不会被带跑。不过,不管是 max 还是注意力,对句子的理解都依赖底层模型的水平——这时候,就轮到预训练语言模型登场了。
- 匹配度打分
\mathbf{q}_r是关系r的查询向量,相当于“关系 r 期待看到什么样的句子”;\mathbf{h}_i是第i个句子的语义向量。两者点积e_i越大,句子和关系越匹配。 - softmax 归一化
\exp(e_i)保证取正数再归一化,让所有句子的权重\alpha_i之和为 1;权重大的句子对最终决定影响更大。
预训练语言模型
前面的方法,本质上都是在“从零训练一个语义理解器”。这就像让刚毕业的年轻班主任从第一天起就自学成才,要看多少份档案才够?预训练语言模型(如 BERT)的思路是:直接从“名师进修学院”请来一位执教多年的老教师。他已经在海量文本上摸爬滚打过,对“苹果公司”和“张伟”这种词的理解远超新人,只需要在咱们班里做几天“岗前特训”,就能把关系判断干得漂亮。
具体做法是:把实体边界标记直接插入输入文本(比如在“张伟”前后加上特殊标记 [E1] 和 [/E1]),让 Transformer 编码时能意识到“这两个位置是关键实体”。之后取 [CLS] 向量作为整句语义表示,接上一个线性分类头,用交叉熵损失对全部参数做微调(Fine-tuning)。
预训练模型就像老教师:他不需要从零认识世界,只要听你讲两天“张伟是谁、苹果公司是什么、咱们班的黑话怎么说”,就能把关系判断得很准。这也是为什么今天做关系抽取,几乎没有人再从头训练一个随机初始化的模型了。老教师既然这么强,那还能不能更进一步,连分类头都不用学?——Prompt 方法给出了答案。
- 逐个样本的对数概率
P_\theta(y_i | x_i)表示参数为\theta时模型把第i个样本x_i判成正确关系y_i的概率;取\log后,概率越大则值越接近 0。 - 求和取平均把所有
N个样本的负对数概率相加再除以N,得到平均损失;样本越多,梯度信息越稳定。
Prompt方法
如果你问老教师“张伟和苹果公司是什么关系?”,他可能会反问:你这问题太抽象了。不如换个方式,让他做一道填空题:“张伟 [MASK] 苹果公司”。老教师凭着多年语感,十有八九会在空格填上“是CEO”或“负责”。你从他的答案里反推关系。这就是 Prompt-based 关系抽取——把分类问题改造成“填空任务”。
具体做法是设计一个模板(Template),把实体对嵌进去,并在关系词位置放上 [MASK] 记号。预训练语言模型来做掩码语言建模(MLM)任务,预测 [MASK] 位置最可能的词。最后,通过一个映射表(verbalizer)把预测词映射回关系类别。比如“是CEO”映射到 CEO,“在…上班”映射到员工。
Prompt 方法就像改“口试”为“填空题”:不直接问关系,而是让老教师凭直觉补全句子。他的潜意识知识被模板激活,用极少的训练数据就能完成关系抽取。这样做省掉了新分类头的训练成本,也让模型的预训练语感发挥到极致。不过到底哪种方案在实战中更管用,最终还得看“期末考试成绩单”。
- 模板构建
\text{Template}(x)把句子x和两个实体包装成带[MASK]的完形填空形式,例如 “张伟 [MASK] 苹果公司”。 - 掩码预测
P_\theta(\text{[MASK]} = v(r) \mid \ldots)表示模型在掩码处预测词v(r)的概率,v(r)是 verbalizer 中关系r对应的触发词。 - 关系排名遍历所有候选关系,选择概率最高的类别作为最终输出;也可以用概率大小对所有关系排序。
工程实践
所有方法最后都要用数据说话。远程监督关系抽取最常用的基准数据集是 NYT(纽约时报语料与 FreeBase 知识库对齐);小规模人工标注集则有 TACRED、SemEval 等。模型选型上,传统 CNN/PCNN 配合远程监督仍可作为轻量基线,但当前主流是“远程监督构造数据 + 预训练模型微调 + 注意力降噪”的组合拳。
评估指标方面,只看“答对多少”远远不够。模型可能只挑容易的句子下手,漏掉大量难关系。因此工业界通常同时看精确率(Precision)和召回率(Recall),再综合成 F1 值:
工程实践就是学期末的“综合测评”。远程监督贡献海量弱标注数据,注意力机制负责过滤其中的“谣言”,预训练模型负责理解语义,Prompt 方法则在小样本场景再添一把火。把这些组合起来,你就能在真实工业环境里建出一套省成本且效果不错的关系抽取系统。
---
- 精确率
P表示模型预测出的所有关系里,有多少比例是真正正确的——测量预测的“纯度”。 - 召回率
R表示真实存在的关系里,有多少比例被模型成功找出来——测量预测的“覆盖率”。 - 调和平均
2 \times P \times R / (P + R)使 F1 在P或R偏低时显著下降,强迫两者均衡成长。
AI 应用场景
电商知识图谱自动构建
阶段:数据标注与关系抽取
解决的问题:电商平台要从数百万条商品评论中抽取“产品—属性—评价对象”关系,人工标注成本极高。传统做法靠逐条规则匹配,覆盖率低且维护困难。
具体案例:某电商团队先用公开商品知识库对评论语料做远程监督自动标注,再用 BERT 微调作为语义编码器,配合注意力机制过滤“这手机续航不行”这类无关句子,最终把“产品—功能—评价”三元组的构建效率提升了约 80%,并使 F1 稳定在 85% 以上。
金融研报高管关系解析
阶段:模型微调与推理
解决的问题:券商每天产出大量研报,需要从中抽取“上市公司—高管—任职关系”。纯人工阅读与分析人员核对关系耗时且容易遗漏,尤其在新股公告密集期。
具体案例:金融科技团队利用预训练模型对公告和研报进行微调,输入中标注公司与高管实体边界,再对远程监督构造的句子包做注意力加权,从“XX 公司 CEO 张伟出席活动”等语料中抽取雇佣关系,使召回率从 68% 提升至 89%,大幅减少人工复核量。
生物医学小样本关系挖掘
阶段:Prompt 推理
解决的问题:医学文献中“药物—靶点—疾病”关系标注非常稀缺,远程监督又很难找到现成知识库覆盖长尾关系,亟需低资源抽取方案。
具体案例:生物医学团队采用 Prompt 方法,设计模板“药物 [MASK] 蛋白质”对 PubMedBERT 提问,通过 verbalizer 将预测词映射为“抑制、激活、结合”等关系类别。在只有几百条标注样本的场景下,比普通微调方法高出约 5 个百分点 F1,证明模板化提问在小样本场景的潜力。
Python 演示
import numpy as np def remote_label(sentences, kb_rel): """远程监督:凡是包含该实体对的句子,一律打上知识库关系标签。""" return [kb_rel for _ in sentences] def attention_weights(query, sentence_vecs): """计算每个句子的注意力权重(softmax 归一化)。""" logits = np.array([np.dot(query, v) for v in sentence_vecs]) logits = logits - logits.max() # 数值稳定 exp = np.exp(logits) return exp / exp.sum() if __name__ == "__main__": kb_rel = "CEO" # 知识库三元组: 张伟-CEO-苹果 sentences = [ "张伟被任命为苹果CEO", "张伟去超市买东西", "苹果CEO张伟出席大会", "张伟和苹果没有关系", "张伟在苹果大楼开会", ] labels = remote_label(sentences, kb_rel) print("远程监督自动标签:", labels) # 预训练模型为5个句子输出的语义向量(一维示意) vecs = np.array([[0.9], [0.1], [0.8], [0.1], [0.7]]) query = np.array([1.0]) # CEO关系对应的查询向量 w = attention_weights(query, vecs) print("注意力权重:", w.round(3)) print("加权后的包表示:", round(float(w @ vecs[:, 0]), 3)) # 多实例学习对比: 取最大概率 props = 1 / (1 + np.exp(-vecs.flatten())) print("多实例学习(最大值):", round(float(props.max()), 3))
def remote_label(sentences, kb_rel):定义远程监督自动标注函数,对应“对齐假设”return [kb_rel for _ in sentences]给所有包含实体对的句子都贴上同一知识库关系标签,正是噪声来源logits = np.array([np.dot(query, v) for v in sentence_vecs])计算每个句子与关系查询向量的语义匹配度logits = logits - logits.max()减去最大值防止指数溢出,是数值稳定的常用技巧w = attention_weights(query, vecs)得到五个句子的注意力权重,低的对应噪声句print("多实例学习(最大值):", ...)与注意力机制对比,展示两种去噪策略打分差异
常见误区
误区很多初学者看到“远程监督不用人工标注”,就以为它是无监督学习——模型自己从无标签数据里学规律。
正解远程监督仍然是监督学习,因为它依赖知识库显式提供关系标签。只不过标签由“知识库自动生成”而非“人工手写”。打个比方:班主任没有亲自谈话,而是照着花名册分组,但分组行为依然是有明确标准答案的监督过程,只是答案可能出错。
为何常见:大家容易把“标注成本低”误解为“没有监督信号”,其实监督信号的来源是知识库,不是无中生有。
误区有人觉得用了多实例学习,远程监督产生的噪声标签就全都消失了,剩下的训练数据干干净净。
正解多实例学习只是“缓解”噪声,而不是“清除”噪声。max 池化只能让包级训练在整体上更鲁棒,但包内具体哪些句子是错误标签,模型并不收敛得足够深。更糟的是,如果一个包里所有句子都是噪声,max 还是会选出“相对最响的噪声”。
为何常见:mial 的“包级分类”设计容易让人误以为它学会了判断单句质量,实际上它只是改变了训练粒度。
误区听说 BERT 在海量文本上预训练过,有人就以为直接拿它做关系抽取,不需要任何标注数据。
正解BERT 学的是通用语言知识,并不知道“哪两个实体属于 CEO 关系”这类任务语义。微调仍然需要一批带关系标签的数据,哪怕数量不多。远程监督的价值恰好就是低成本地提供这批微调数据。再资深的老教师也得听你讲两句本班情况,才能真正上岗。
为何常见:把“预训练”误当成“已经完成特定任务训练”,忽略了任务自适应这一步。
误区既然 Prompt 只是让模型做填空,那是不是把模板写好就不用训练任何参数,甚至不用验证集?
正解Prompt-based 关系抽取确实省去了训练新分类头,但模板的设计和 verbalizer 的构造本身就是大量工程工作。模板措辞一变,模型表现可能明显波动;verbalizer 选什么触发词,也会直接影响预测。实际应用中依然需要验证集来选模板、调阈值。
为何常见:看到“零参数训练”的宣传,容易忽略模板搜索和映射表设计也是一类“隐式学习”。
面试题
Q1. 远程监督最大的优点是什么?
- A.无需人工标注可直接用知识库造数← 正确答案
- B.可以让模型自动调整关系边界
- C.自动得到所有词的上下文向量
- D.可以显著提升模型的推理速度
答案:A。远程监督通过知识库自动为语料打标签,极大降低人工标注成本,这是它被广泛使用的主要原因。B 描述的是模型训练能力,C 是预训练模型的副产品,D 与推理速度无关。
Q2. 远程监督中“对齐假设”的含义是什么?
- A.实体必须位于句子的开头两个位置
- B.实体对出现时关系就以知识库为准← 正确答案
- C.知识库必须保证完整没有任何缺失
- D.所有句子的长度需要全部对齐
答案:B。对齐假设指只要实体对在句子中共同出现,就认为该句子表达知识库中记录的对应关系。A、D 是对“对齐”一词的望文生义,C 把知识库的假设前提当成了必然要求。
Q3. 多实例学习对包进行正负例判定时,最常用做法是什么?
- A.对所有句子的预测得分取平均值
- B.取包内句子的最大概率作为包得分← 正确答案
- C.取包内所有句子概率的中位数
- D.随机选取一个句子代表整个实体包
答案:B。多实例学习经典做法是 max 池化,即包内至少有一句表达关系就判定为正例。平均和中位数都会让大量噪声句拉低分数,随机选取则完全丢失了包的信息。
Q4. 注意力机制中 softmax 的作用是什么?
- A.把点积得分归一化为概率分布← 正确答案
- B.将句子映射为低维稠密向量
- C.直接让模型参数数量大幅下降
- D.给每个词分配唯一的整数编号
答案:A。softmax 将任意实数得分转换成一组总和为 1 的非负权重,使注意力权重具有概率解释。B 是嵌入层的作用,C 不是 softmax 功能,D 是词表编号描述。
Q5. 预训练语言模型微调做关系抽取时,通常要做什么?
- A.在输入文本中添加实体边界标记← 正确答案
- B.取 [CLS] 向量来表示整句语义← 正确答案
- C.必须从头随机初始化整个模型
- D.用交叉熵损失函数做参数微调← 正确答案
答案:ABD。实体边界标记帮助模型定位关键实体,[CLS] 向量作为分类表征是 BERT 标准做法,交叉熵损失用于微调关系分类头。C 错误:预训练模型的权重已从海量语料中获得,不需要也不应该从头随机初始化。
Q6. Prompt 方法将关系抽取改造为什么任务?
- A.序列标注并输出每个词的标签
- B.掩码语言建模再进行词汇映射← 正确答案
- C.将两段文本机器翻译成另一种
- D.对文本做无监督的自动聚类
答案:B。Prompt 方法把关系标签位置替换为 [MASK],让模型预测掩码词,再通过 verbalizer 映射回关系类别。序列标注是 NER 范式,机器翻译和聚类与关系抽取任务目标不符。
Q7. 远程监督产生的噪声来源包括哪些?
- A.知识库本身有缺失或关系已过时← 正确答案
- B.句子实际表达与知识库关系不同← 正确答案
- C.实体指代存在歧义造成误标注← 正确答案
- D.模型学习速率设置过低影响训练
答案:ABC。A 是知识库质量问题,B 是“同框不共事”问题,C 是实体歧义问题,三者共同构成远程监督噪声。D 是训练超参问题,不是数据标注噪声。
Q8. F1 分数是哪两个指标的调和平均?
- A.准确率与召回率的调和平均值
- B.精确率与召回率的调和平均值← 正确答案
- C.精确率与准确率的算术平均数
- D.损失值与准确率的加权平均值
答案:B。F1 是精确率(Precision)与召回率(Recall)的调和平均,能在预测质量和覆盖程度之间取得平衡。准确率考察全员正确比例,损失值是训练信号,两者都不与 F1 直接挂钩。
Q9. 以下哪些做法可缓解远程监督的噪声问题?
- A.用多实例学习对句子包建模← 正确答案
- B.用注意力机制给句子分配权重← 正确答案
- C.用预训练模型提升语义表示← 正确答案
- D.跳过实体识别直接做事件抽取
答案:ABC。多实例学习从包粒度控制噪声影响,注意力机制给可靠句子更高权重,预训练模型改进语义表征以减少误解。D 是另一个任务方向,无法解决远程监督的标签噪声。
Q10. 预训练模型在关系抽取中的“微调”是指什么?
- A.在预训练权重基础上继续训练← 正确答案
- B.从随机初始化重新训练所有参数
- C.直接输出预训练目标融合关系标签
- D.额外单独训练一份词向量矩阵
答案:A。微调指加载预训练权重后,用带标签的关系抽取数据继续训练,让通用知识适配任务。B 违背了预训练初衷,C 混淆了预训练任务与下游任务,D 只是训练词向量,不是完整微调。