本文目录导读:
- 范式一:基于标注数据的监督学习(最传统、最主流)
- 范式二:远程监督(Distant Supervision, DS)
- 范式三:少样本学习(Few-shot Learning) & 提示学习(Prompt Learning)
- 总结:如何开始训练?
- 一个快速上手的思路(针对中文)
这是一个很专业的问题,关系抽取(Relation Extraction, RE)是信息抽取的核心任务,旨在从非结构化文本中识别出实体之间的语义关系。
训练一个关系抽取模型,主要有三种主流范式,它们的训练流程差异很大,下面我会从数据准备、模型架构、训练过程三个维度,为你详细拆解。
基于标注数据的监督学习(最传统、最主流)
这是目前工业界效果最好的方法,但需要大量高质量标注数据。
数据准备
你需要有标注好的三元组数据,
- 文本:
北京是中国的首都。 - 实体:
北京(头实体),中国(尾实体) - 关系:
首都
数据格式通常是 JSON 或 CoNLL 格式,一个常见的做法是标注序列,比如用 BIO 标签标记实体和关系,但也有专门的关系标注工具(如 brat, Label Studio)。
模型架构
目前主流的监督学习模型架构通常分为两个子任务:
- 管道式(Pipeline):先做命名实体识别(NER),再做关系分类。
- NER:找出句子中所有的实体(如
北京,中国)。 - 关系分类:将 NER 找到的实体对输入一个关系分类器(通常是 BERT + 分类头),输出关系类型(如
首都)。
- NER:找出句子中所有的实体(如
- 联合式(Joint):用一个模型同时完成 NER 和 RE,效果通常更好,但更复杂,常用模型是基于预训练语言模型(PLM,如 BERT、RoBERTa)的变体,
- CasRel(层叠式指针网络):先识别头实体,再根据头实体去识别关系对应的尾实体。
- TPLinker(基于Token对的链接):将关系建模为Token对之间的链接。
- Span-level RE:直接预测所有可能的实体片段(span)和它们之间的关系。
训练过程
- 加载预训练模型:通常使用
bert-base-chinese或bert-base-uncased等。 - 定义损失函数:
- NER:交叉熵损失(对每个Token做标签分类)。
- RE:二分类交叉熵(对每种可能的关系,判断实体之间是否存在这种关系)或多分类交叉熵。
- 训练循环:
- 输入句子,得到 BERT 的编码。
- 通过任务特定的头(如全连接层)抽取实体表示和关系表示。
- 计算损失并反向传播。
- 学习率通常很小(如 2e-5),学习率调度器常用线性衰减。
- 评估:在验证集上计算 F1 值(精确率和召回率的调和平均),严格模式需要三元组完全匹配(实体和关系都正确)。
缺点
- 数据标注成本极高:需要大量人工标注。
- 领域迁移能力弱:在金融领域训练好的模型,直接用在医疗领域效果会显著下降。
远程监督(Distant Supervision, DS)
为了解决标注数据不足的问题,利用已知的知识图谱来自动构建训练数据集。
工作原理
- 假设:如果知识图谱中存在关系
(北京,首都,中国),那么任何同时包含北京和中国的句子,都被自动标注为首都关系。 - 流程:爬取大规模语料 -> 用知识图谱中的实体构建词典 -> 进行实体匹配 -> 自动生成训练数据。
训练方法
- 通常采用多实例学习:由于自动标注噪声大(北京到中国的飞机票”中的“北京”和“中国”不是首都关系),同一个实体对会产生多个候选句子,模型不是看单个句子,而是看一个包(Bag of Sentences),从中找出最有可能表达该关系的一个或几个句子。
- 模型:PCNN+ATT(分段卷积神经网络+注意力机制) 或 BERT+DS(直接对句子包做注意力池化)。
优缺点
- 优点:能自动生成海量数据,覆盖很广。
- 缺点:
- 噪声严重:错误标注多。
- 长尾关系稀疏:知识图谱里低频的关系很难获得足够样本。
少样本学习(Few-shot Learning) & 提示学习(Prompt Learning)
适用于只有少量(如几十条)标注数据的场景。
方法
- 基于提示(Prompt-based)的 MAML:将关系抽取任务转化为完形填空或文本生成问题。
- 模板:“夹在 [MASK] 和 [MASK] 中间的首部是 [MASK]。” 让模型填充
北京、中国、首都。 - 然后模型通过对比学习的训练,学会如何填充这类模板。
- 模板:“夹在 [MASK] 和 [MASK] 中间的首部是 [MASK]。” 让模型填充
- 对比学习:把
(头实体,关系,尾实体)视为一个整体,让模型学习:(北京,首都,中国)这个三元组在向量空间中的表示,与(巴黎,首都,法国)这种正样本距离近,与(北京,气候,温带)这种负样本距离远。
训练
- 需要构建支持集(Support Set)和查询集(Query Set)。
- 每个训练episode会采样N-way K-shot(N种关系,每种K个样本)。
- 模型在支持集上“学习”新关系的模式,然后在查询集上预测。
如何开始训练?
- 数据是第一位的:
- 有预算:使用标注工具(Label Studio, Prodigy)人工标注几百到几千条,推荐使用CasRel或SPERT框架,它们能处理标注数据。
- 无预算:利用开源数据集(如FewRel、NYT、WebNLG),B站或GitHub上有很多适配的中文RE数据集。
- 框架选择:
- 新手推荐:使用 Hugging Face Transformers + 自行编写处理逻辑,先做Pipeline(NER + 分类模型),理解流程后再尝试Joint模型。
- 进阶:使用 OpenNRE(一个专门做关系抽取的开源库,内置了多种模型和数据集)。
- 工业级:考虑 DeepKE(浙江大学开源)或 CogIE(智源研究院开源)。
- 硬件要求:
- 单卡 RTX 3090 或 4090(24G显存)足以训练 BERT-base 模型。
- 如果数据量很大(百万级),则需要多卡(A100)并做梯度累积。
- 效果优化关键点:
- 实体边界识别错误是RE的最大瓶颈(NER做不好,RE必然会受影响),先提升NER的准确率。
- 负样本采样:正负样本比例要合理(例如1:1或1:2),否则模型会倾向于预测“无关系”。
- 后处理:对于重叠关系(同一实体对存在多个关系),CasRel这类模型天生支持,而传统分类模型需要特殊处理。
一个快速上手的思路(针对中文)
- 使用 Hugging Face 下载
bert-base-chinese或chinese-roberta-wwm-ext。 - 找到一个公开的标注中文RE数据集(如 CMReIE 或 SanWen)。
- 修改 CasRel 或 TPLinker 的PyTorch实现(GitHub上有很多现成的代码)。
- 训练,通常20-50个epoch后,F1值能达到0.7-0.85(取决于数据集难度)。
如果你有具体的技术(比如想了解CasReL的损失函数如何设计,或者如何解决正负样本不平衡),可以继续追问。
标签: 关系分类