尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DeepKE 实战:PRGC 联合关系三元组抽取模型从环境搭建到训练预测全流程指南

DeepKE 实战:PRGC 联合关系三元组抽取模型从环境搭建到训练预测全流程指南 人工智能NLP知识图谱深度学习【免费下载链接】DeepKE[EMNLP 2022] An Open Toolkit for Knowledge Graph Extraction and Construction项目地址https://gitcode.com/gh_mirrors/de/DeepKE点击查看免费下载本文以 DeepKE 开源工具包中 example/triple/PRGC/README.md 为骨架结合仓库内src/deepke/triple_extraction/PRGC的源码实现系统讲解如何在本地复现PRGCACL 2021联合关系三元组抽取模型的完整链路环境搭建、数据集与预训练模型准备、Hydra 配置详解、训练与预测以及模型底层的数据流与消融原理。读完本文你不仅能跑通python run.py与python predict.py还能理解潜在关系预测 全局对应 关系特定序列标注三阶段架构在源码中的具体落点。一、PRGC 模型简介联合抽取的潜在关系 全局对应范式PRGCPotential Relation and Global Correspondence Based Joint Relational Triple Extraction是发表于 ACL 2021Volume 1: Long Papers的联合关系三元组抽取模型。与传统先抽实体、再判关系的流水线方法不同PRGC 将主语关系宾语三元组抽取建模为一个端到端联合任务核心思想由三个子模块组成潜在关系预测Potential Relation Prediction先用一个多标签分类器判断当前句子中可能包含哪些关系只对潜在关系而非全部关系执行后续标注从而大幅降低计算量全局对应Global Correspondence对句子中任意两个 token 位置对i, j输出一个对应关系打分矩阵判断主语尾部与宾语头部之间是否存在对应从而解决一个句子中存在多对主语宾语时的配对歧义关系特定序列标注Relation-Specific Sequence Taggers对每个潜在关系分别对主语和宾语做 BIO 式序列标注再结合全局对应矩阵完成三元组的组装。下图是该模型在仓库中的架构示意见 example/triple/PRGC/PRGC.png该模型对应的实验代码位于 example/triple/PRGC训练/预测入口与配置模型、数据加载与解码的底层实现位于 src/deepke/triple_extraction/PRGC两者通过from deepke.triple_extraction.PRGC import *衔接。二、环境依赖与安装2.1 版本要求原文档给出的推荐环境如下python 3.8依赖包版本要求torch 1.10hydra-core 1.3.0tensorboard 2.4.1matplotlib 3.4.1scikit-learn 0.24.1transformers 4.20.0jieba 0.42.1wandb 0.13.9pandas 1.5.3deepke本仓库安装需要说明的是example/triple/PRGC/requirements.txt 中实际锁定的版本与 README 存在差异例如该文件内为hydra-core 1.0.6、transformers 3.4.0且未显式列出 pandas。从源码看model.py 使用了transformers.BertPreTrainedModel / BertModel / BertConfigrun.py 使用了hydra与wandb因此transformers、hydra-core与wandb是强依赖。若出现兼容性问题可按 README 列出的版本安装日常复现以 requirements.txt 为准即可。2.2 克隆代码git clone https://gitcode.com/gh_mirrors/de/DeepKE.git cd DeepKE/example/triple/PRGC2.3 使用 pip 安装先创建并进入 Python 虚拟环境建议 python 3.8然后安装依赖pip install -r requirements.txt三、数据集准备与格式说明3.1 下载数据原文档提供了 CMeIE 数据集的直接下载方式将压缩包下载到 PRGC 目录下并解压wget 121.41.117.246:8080/Data/triple/PRGC/CMeIE.zip unzip ./CMeIE.zip除 CMeIE 外本模块还可使用NYT、NYT*、WebNLG、WebNLG*等公开三元组抽取数据集。这些数据集需按corpus_type组织在data/{corpus_type}/目录下——这一路径约定在 run.py 中有明确体现setattr(params, data_dir, os.path.join(params.root_path, fdata/{cfg.corpus_type}))其中corpus_type由 conf/train.yaml 中的同名参数指定默认WebNLG。3.2 数据文件结构每个语料目录下需要以下四个文件rel2id.json关系标签 / 答案词 → ID 的映射代码中读取方式为json.load(...)[-1]即取列表最后一项作为关系到 ID 的字典train_triples.json训练集val_triples.json验证集test_triples.json测试集。从 dataloader_utils.py 的read_examples实现可以看到每个样本的结构为{ text: 句子原文, triple_list: [ [主语, 关系, 宾语], ... ] }训练阶段会依据rel2id.json将关系名映射为 ID并据此构造序列标注标签、全局对应标签与关系标签验证/测试阶段则保留triples用于与预测结果比对。四、预训练 BERT 模型准备PRGC 以 BERT 作为编码器需要手动准备 PyTorch 版本的预训练权重步骤如下下载BERT-Base-Cased英文语料如 NYT/WebNLG或BERT-Base-Chinese中文语料如 CMeIE模型目录应包含pytorch_model.bin、vocab.txt和config.json三个文件将整个模型文件夹放入./pretrain_models目录把config.json重命名为bert_config.json——这是代码中的硬性约定run.py 通过BertConfig.from_json_file(os.path.join(params.bert_model_dir, bert_config.json))加载配置将文件夹名中的-替换为_例如bert-base-cased→bert_base_cased以匹配 conf/train.yaml 中pretrain_model: bert_base_cased的默认值。此外预训练目录下的vocab.txt会被 dataloader.py 用于构建BertTokenizer(vocab_file..., do_lower_caseFalse)因此中文/英文模型对应各自的词表二者不可混用。五、训练模型5.1 配置文件体系Hydra训练、预测所需的参数、模型路径与配置全部位于conf目录conf/config.yaml总入口仅含use_wandb开关并通过defaults引入hydra/output: custom与trainconf/train.yaml核心训练参数conf/hydra/output/custom.yaml将 Hydra 运行目录日志定向到logs/${now:%Y-%m-%d_%H-%M-%S}这正是 README 中训练日志默认存储在./logs目录的机制来源。conf/train.yaml 中的全部参数及其含义如下表参数默认值说明clip_grad2.0梯度裁剪最大范数corpus_typeWebNLG语料类型决定data/{corpus_type}数据目录corres_threshold0.5全局对应矩阵二值化阈值data_cacheFalse是否缓存预处理特征到磁盘{sign}.cache.{max_seq_length}device_id0单卡训练时的 GPU 编号downs_en_lr1e-3下游任务模块非 BERT 参数的学习率drop_prob0.3Dropout 概率emb_fusionconcat关系嵌入与句子表示的融合方式concat或sumensure_corresTrue是否启用全局对应模块消融实验开关ensure_relTrue是否启用潜在关系预测模块消融实验开关epoch_num5最大训练轮数ex_index3实验编号决定模型/实验输出目录后缀fin_tuning_lr1e-4BERT 预训练参数微调学习率gradient_accumulation_steps2梯度累积步数max_seq_length100最大序列长度超出截断不足补齐min_epoch_num5早停生效前的最小训练轮数modetest预测阶段的数据模式test等multi_gpuFalse是否多 GPU 并行num_negs4关闭关系预测模块时采样的负关系数量patience0.00001判定 F1 是否提升的最小增量patience_num20早停容忍的连续未提升轮数pretrain_modelbert_base_cased预训练模型文件夹名rel_threshold0.1潜在关系激活阈值sigmoid 输出过滤restore_file恢复训练的检查点文件名如lastseed2020随机种子保证可复现train_batch_size16训练批大小val_batch_size24验证批大小test_batch_size64测试批大小warmup_prop0.1学习率 warmup 比例weight_decay_rate0.01权重衰减系数训练前可按需修改这些参数例如切换corpus_type、调整ex_index或改用use_wandb: True启用 wandb 实验记录run.py 中会以DeepKE_TRIPLE_PRGC为项目名初始化。5.2 启动训练python run.py训练完成后模型权重默认存储在./model/ex{ex_index}目录包含last.pth.tar最后一轮与best.pth.tar验证 F1 最优两份检查点——写入逻辑见 util.py 的save_checkpoint训练日志默认存储在./logs目录Hydra 运行目录同时experiments/ex{ex_index}/train.log会记录详细训练过程experiments/ex{ex_index}/params.json会保存本次实验的有效配置。5.3 训练流程源码解析run.py 的训练主循环揭示了几处关键实现优化器分组所有参数被划分为四组——BERT 参数有/无权重衰减使用fin_tuning_lr下游模块参数使用downs_en_lrbias、LayerNorm、layer_norm等不参与权重衰减。优化器采用 optimization.py 中自定义的BertAdamwarmup_cosine调度。多卡支持脚本默认声明CUDA_VISIBLE_DEVICES0..7当multi_gpu: True时使用torch.nn.DataParallel并取平均损失否则使用device_id指定单卡。早停策略每轮在验证集上评估 F1evaluate以patience作为提升阈值连续patience_num轮未提升且已超过min_epoch_num则提前终止。三种损失叠加模型返回loss_seq序列标注、loss_matrix全局对应、loss_rel关系预测三个子损失训练进度条会实时显示三者平均值。六、模型预测6.1 启动预测python predict.py预测脚本 默认从model/ex{ex_index}/last.pth.tar恢复模型其内部将restore_file强制设为last加载conf/train.yaml中mode指定的数据默认test进行推理。6.2 预测输出预测完成后终端会输出测试集的Precision / Recall / F1指标get_metrics统计正确三元组数、预测数与真实数后计算结果明细以 CSV 形式写入experiments/ex{ex_index}/{mode}_result.csv每行包含三列text句子原文、pre预测三元组列表、truth真实三元组列表方便逐条检查模型行为。七、源码级原理模型结构与数据流7.1 模型结构model.pyBertForRE继承自BertPreTrainedModel由以下部件构成BERT 编码器输出(bs, seq_len, hidden)的序列表示潜在关系预测先通过masked_avgpool对有效 token 做掩码平均池化得到句子向量再经rel_judgement输出每个关系的 logits推理时用rel_threshold对 sigmoid 结果做二值化若某样本没有任何关系激活则强制选取 logits 最大的关系model.py中for idx, sample in enumerate(rel_pred_onehot)分支全局对应将序列表示在i/j两个维度上扩展拼接为(bs, seq_len, seq_len, 2*hidden)经global_corres得到(bs, seq_len, seq_len)打分并用attention_mask的乘积屏蔽 padding 位置关系特定序列标注关系 ID 经rel_embedding变成向量后按emb_fusion与序列表示融合——concat模式将 2h 拼接输入sequence_tagging_sub / sequence_tagging_obj两个独立分类器sum模式则使用共享头部的SequenceLabelForSO同时输出主语/宾语标签每 token 三类O / B-H, I-H / B-T, I-T标签常量定义在 util.py。损失设计训练分支loss_seq为主/宾语序列标注的交叉熵mask 后取平均loss_matrix为全局对应矩阵的BCEWithLogitsLoss按 padding 掩码加权loss_rel为关系多标签的BCEWithLogitsLoss。三者直接相加得到总损失。推理分支对激活的每个潜在关系复制一次序列表示逐关系输出主语/宾语标签序列与全局对应二值矩阵corres_threshold过滤返回pred_seqs、pred_corres_onehot及关系索引信息xi / pred_rels。7.2 数据构建dataloader_utils.py训练样本构造非常关键一条句子会按其包含的每个关系各复制生成一个训练样本。每个样本中主语 token 打上B-H/I-H标签、宾语 token 打上B-T/I-T标签同时corres_tag[sub_head][obj_head] 1标记全局对应关系多标签rel_tag用于关系预测监督。当关闭潜在关系预测模块ensure_rel: False消融实验时代码还会从负关系中随机采样num_negs个构造标签全为O的负样本参与训练。特征转换使用 10 进程的multiprocessing.Pool并行加速并支持data_cache: True缓存到.cache.{max_seq_length}文件。7.3 解码与评估evaluate.py、metrics.pyget_chunks将 BIO 标签序列还原为类型起始结束片段tag_mapping_corres是 PRGC 的解码核心先分别提取主语片段H与宾语片段T只保留全局对应矩阵中pre_corres[h_start][t_start] 1的主宾语对再与关系 ID 组装成三元组从而解决一对多配对歧义tag_mapping_nearest是另一种最近邻启发式解码源码中保留可对照研究span2str将 token 片段还原为原始文本处理 WordPiece 的##前缀最终与真实三元组比对计算 P/R/F1。7.4 消融实验从 conf/train.yaml 与model.py的ensure_*分支可以看到PRGC 在仓库中预留了两个消融开关ensure_corres关闭后模型不再预测/使用全局对应矩阵解码退化为朴素配对ensure_rel关闭后模型对全部rel_num个关系逐一做序列标注推理时sequence_output.repeat(1, rel_num, 1)复制展开即退化为关系枚举式联合抽取训练时配合num_negs负采样控制开销。这两组开关搭配emb_fusionconcat/sum即可复现论文中的主要消融对比。八、复现常见问题与调试建议版本冲突README 与 requirements.txt 对hydra-core、transformers的版本要求不一致若run.py报 Hydra 或 BERT 加载错误优先检查这两个包的版本BERT 目录不规范config.json必须重命名为bert_config.json目录名中的-必须替换为_否则run.py与predict.py都会在加载阶段报错数据目录不匹配corpus_type与data/{corpus_type}必须严格对应rel2id.json缺失或格式不符会直接导致read_examples失败GPU 设置单卡环境请确认device_id合法且multi_gpu: False多卡环境保持multi_gpu: True并确保CUDA_VISIBLE_DEVICES与机器实际可见卡一致复现一致性固定seed: 2020并在各环节显式设置随机种子random、torch、torch.cuda保证实验可复现。九、引用若在研究中使用了 PRGC 模型或本模块代码请按如下 BibTeX 引用原论文inproceedings{DBLP:conf/acl/ZhengWCYZZZQMZ20, author {Hengyi Zheng and Rui Wen and Xi Chen and Yifan Yang and Yunyan Zhang and Ziheng Zhang and Ningyu Zhang and Bin Qin and Xu Ming and Yefeng Zheng}, editor {Chengqing Zong and Fei Xia and Wenjie Li and Roberto Navigli}, title {{PRGC:} Potential Relation and Global Correspondence Based Joint Relational Triple Extraction}, booktitle {Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing, {ACL/IJCNLP} 2021, (Volume 1: Long Papers), Virtual Event, August 1-6, 2021}, pages {6225--6235}, publisher {Association for Computational Linguistics}, year {2021}, doi {10.18653/v1/2021.acl-long.486} }十、延伸阅读模型实现与消融开关src/deepke/triple_extraction/PRGC/model.py数据读取与特征构造src/deepke/triple_extraction/PRGC/dataloader.py、src/deepke/triple_extraction/PRGC/dataloader_utils.py评估与解码src/deepke/triple_extraction/PRGC/evaluate.py、src/deepke/triple_extraction/PRGC/metrics.py工具函数与检查点管理src/deepke/triple_extraction/PRGC/util.py优化器实现src/deepke/triple_extraction/PRGC/optimization.py至此你已经掌握了 DeepKE 中 PRGC 联合关系三元组抽取的完整复现路径——从环境安装、数据与预训练模型准备到 Hydra 参数调优、训练与预测再到源码层面的三阶段架构原理。下一步你可以尝试在不同corpus_typeNYT / WebNLG / CMeIE上对比效果或通过ensure_corres、ensure_rel开关自行验证各模块对最终 F1 的贡献。赞分享人工智能NLP知识图谱深度学习【免费下载链接】DeepKE[EMNLP 2022] An Open Toolkit for Knowledge Graph Extraction and Construction项目地址https://gitcode.com/gh_mirrors/de/DeepKE点击查看免费下载相关推荐DeepKE 中的 PRGC 关系三元组联合抽取实战指南环境配置、数据准备、训练与预测DeepKE 中的 PRGC 关系三元组联合抽取实战指南环境配置、数据准备、训练与预测 导读 本文以 DeepKE 仓库中的 PRGC 示例 https://人工智能NLP知识图谱深度学习OpenMed v2.2 标准一致性矩阵全解析离线合成集成证明的覆盖范围、测试命令与零泄漏证据边界OpenMed v2.2 标准一致性矩阵全解析离线合成集成证明的覆盖范围、测试命令与零泄漏证据边界 OpenMed 2.2 发布门禁中附带了一份“已测试标准矩人工智能NLP知识图谱深度学习Ryujinx 模拟器新手上手从环境自检到跑通第一款 Switch 游戏Ryujinx 模拟器新手上手从环境自检到跑通第一款 Switch 游戏 手头没有 Switch 主机却想在工作桌上玩《塞尔达传说王国之泪》或《集合啦动人工智能NLP知识图谱深度学习上一篇C 多线程可扩展性实战指南cppbestpractices 中的 Threadability 最佳实践下一篇KeyboardChatterBlocker终极免费解决方案彻底修复机械键盘连击问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表