ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepKE 标准关系抽取实战指南:数据准备、Hydra 配置、六种模型训练与交互式推理

DeepKE 标准关系抽取实战指南:数据准备、Hydra 配置、六种模型训练与交互式推理 人工智能NLP知识图谱深度学习【免费下载链接】DeepKE[EMNLP 2022] An Open Toolkit for Knowledge Graph Extraction and Construction项目地址https://gitcode.com/gh_mirrors/de/DeepKE点击查看免费下载本文基于 DeepKE 仓库中 example/re/standard/README_CN.md 的完整流程展开聚焦关系抽取Relation Extraction标准版模块的端到端实践从环境搭建、三类数据格式准备到基于 Hydra 的统一配置体系、run.py训练与predict.py推理并深入解读 CNN、RNN、Capsule、GCN、Transformer 与预训练语言模型六种模型的底层实现。读完本文你将能够独立完成一个中文关系抽取任务的训练、评估、调参与部署推理全流程。一、模块定位与适用场景该标准版关系抽取模块位于 example/re/standard其核心能力是给定一个句子和句子中的两个实体头实体 head 与尾实体 tail模型判断二者之间的关系类别如导演所属专辑等。这是知识图谱构建中最常见的三元组抽取第一步——先定位实体再识别关系。整个任务的输入输出非常清晰输入句子 头实体 尾实体含实体在句中的字符偏移量输出关系类别及其置信度仓库在 src/deepke/relation_extraction/standard/models 下提供了 6 个可直接训练的模型类PCNN、BiLSTM、Capsule、GCN、Transformer、LM配合统一的配置与训练脚本可通过修改一个参数即完成模型切换。二、环境依赖与安装原文档明确了推荐运行环境为python 3.8核心依赖版本如下依赖版本torch1.5hydra-core1.0.6tensorboard2.4.1matplotlib3.4.1scikit-learn0.24.1transformers3.4.0jieba0.42.1deepke当前仓库源码其中hydra-core是整套配置体系的基石所有conf/*.yaml均由 Hydra 装配jieba用于中文分词transformers用于加载预训练语言模型LM 模型deepke则需以源码方式安装以导入deepke.relation_extraction.standard.*模块。安装步骤git clone https://gitcode.com/gh_mirrors/de/DeepKE cd DeepKE/example/re/standard建议先创建 Python 虚拟环境再进入随后安装依赖pip install -r requirements.txt之后通过pip install -e .或等价方式将仓库根目录的deepke包注册到当前环境即可在example/re/standard下正常执行训练与预测脚本。注意 run.py 与 predict.py 顶部都会执行sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ../)))以保证能从上层目录导入deepke源码包。三、数据准备三种格式与预处理规则3.1 数据存放与文件结构训练数据统一存放在data/origin目录该路径由 conf/preprocess.yaml 中的data_path指定。官方提供了预打包数据可直接下载解压到当前目录wget 121.41.117.246:8080/Data/re/standard/data.tar.gzdata/origin下需要四个文件文件作用train.csv训练数据集valid.csv验证数据集test.csv测试数据集relation.csv全部关系种类清单3.2 三种支持的文件格式模块支持json、xlsx、csv三种输入格式具体样例见 example/re/standard/data 目录下的example.json、example.xlsx、example.csv。三种格式的字段完全一致以 CSV 为例example.csvsentence,relation,head,head_offset,tail,tail_offset 孔正锡导演2005年以一部温馨的爱情电影《长腿叔叔》敲开电影界大门,导演,长腿叔叔,23,孔正锡,0字段含义sentence完整句子文本relation该句子对应的真实关系标签训练/验证/测试集标注用head头实体文本head_offset头实体在句子中的字符偏移量从 0 开始如长腿叔叔在例句中从第 23 个字符处开始tail尾实体文本tail_offset尾实体在句子中的字符偏移量。JSON 格式为上述字段组成的对象列表见 example.jsonxlsx 格式则与 CSV 保持相同的列定义。注意如果使用 json / xlsx 格式需要先用仓库根目录 src/deepke/transform_data.py 中提供的json2csv/xlsx2csv函数将数据转换为 CSV再参与训练。3.3 预处理参数详解数据从原始 CSV 到模型可用的 pkl 特征由 preprocess.py 完成相关参数集中在 conf/preprocess.yaml# 是否需要预处理数据 # 当数据处理参数没有变换时不需要重新预处理 preprocess: True # 原始数据存放位置 data_path: data/origin # 预处理后存放文件位置 out_path: data/out # 是否需要分词中文场景建议 True使用 jieba chinese_split: True # 是否需要使用实体类型替换实体词语 replace_entity_with_type: True # 是否需要使用三元组头尾标记替换实体词语 replace_entity_with_scope: True # vocab 构建时的最低词频控制 min_freq: 3 # 句长限制: 指句子中词语相对entity的position限制 # 如[-30, 30]embed 时整体31变成[1, 61] # 则一共62个pos token0 留给 pad pos_limit: 30这里pos_limit与位置嵌入position embedding直接相关模型会把句子中的每个词编码为相对头实体/尾实体的位置位置范围被限制在[-pos_limit, pos_limit]。在 run.py 与 predict.py 中都有cfg.pos_size 2 * cfg.pos_limit 2的动态赋值即位置 token 总数为 62偏移后区间为[1, 61]0留给 padding该值在 conf/embedding.yaml 中由???占位并在运行时填充。预处理完成后data/out目录下会生成train.pkl、valid.pkl、test.pkl和vocab.pkl四个文件训练脚本直接加载这些 pkl 数据。若预处理参数未变化可将preprocess置为False跳过重复预处理以加速run.py 中也有此提示。四、Hydra 统一配置体系整个模块采用 Hydra 配置管理入口为 conf/config.yaml通过defaults字段装配全部子配置# populated at runtime cwd: ??? use_wandb: False defaults: - hydra/output: custom - preprocess - train - embedding - predict - model: lm # [cnn, rnn, transformer, capsule, gcn, lm]配置树结构如下conf/ ├── config.yaml # 入口defaults 装配 ├── preprocess.yaml # 数据预处理 ├── train.yaml # 训练超参 ├── embedding.yaml # 词向量/位置向量维度 ├── predict.yaml # 推理模型路径 ├── hydra/output/custom.yaml # 日志输出目录规则 └── model/ ├── cnn.yaml ├── rnn.yaml ├── transformer.yaml ├── capsule.yaml ├── gcn.yaml └── lm.yaml切换模型只需修改config.yaml中defaults下的- model: lm为- model: cnn或其他名称Hydra 会自动加载对应model/*.yaml。hydra/output/custom.yaml定义运行日志输出目录为logs/${now:%Y-%m-%d_%H-%M-%S}custom.yaml即每次运行按时间戳新建日志目录。4.1 训练参数train.yamlconf/train.yaml 控制训练全流程参数说明如下seed: 1 # 随机种子 use_gpu: True gpu_id: 0 # 单卡时的 GPU 编号 epoch: 50 # 最大训练轮数 batch_size: 32 learning_rate: 3e-4 lr_factor: 0.7 # 学习率的衰减率 lr_patience: 3 # 学习率衰减的等待 epoch 数 weight_decay: 1e-3 # L2 正则 early_stopping_patience: 6 # early stopping 容忍轮数 train_log: True log_interval: 10 # 每多少个 batch 打印一次日志 show_plot: False # 是否对当前 epoch 的 loss 可视化 only_comparison_plot: False plot_utils: matplot # [matplot, tensorboard] predict_plot: False # 预测时是否绘制各类别置信度柱状图 use_multi_gpu: False # 是否多卡训练 gpu_ids: 0,1 # 多卡时选择 GPU逗号分隔第一张卡为计算主卡与 run.py 对照可验证其调用链优化器使用optim.Adamlrlearning_rate, weight_decayweight_decay学习率调度器使用ReduceLROnPlateaufactorlr_factor, patiencelr_patience损失函数为CrossEntropyLoss早停依据是valid loss连续early_stopping_patience轮未下降。每轮训练还会执行manual_seed(cfg.seed epoch)以增强可复现性。4.2 词向量与位置向量embedding.yamlconf/embedding.yaml 定义嵌入层维度# populated at runtime vocab_size: ??? # 运行时由 vocab.pkl 填充LM 模型除外 word_dim: 60 # 词向量维度 pos_size: ??? # 2 * pos_limit 2运行时填充 pos_dim: 10 # 位置向量维度当 dim_strategy 为 sum 时此值无效与 word_dim 强一致 dim_strategy: sum # [cat, sum] 词向量与位置向量的融合方式 # 关系种类 num_relations: 11dim_strategy决定位置向量如何参与嵌入选择cat时模型输入维度为word_dim 2 * pos_dim头、尾两个位置向量拼接选择sum时则直接与词向量相加。这一点在模型源码中有直接体现——例如 PCNN.py 中if cfg.dim_strategy cat: cfg.in_channels cfg.word_dim 2 * cfg.pos_dim else: cfg.in_channels cfg.word_dimBiLSTM.py 同理。num_relations应与relation.csv中的关系种类数一致它决定了模型最后的分类输出维度。4.3 预测配置predict.yamlconf/predict.yaml 仅含一个关键参数# the path of the model / checkpoint to be used fp: xxx/checkpoints/2019-12-03_17-35-30/cnn_epoch21.pthfp指向用于预测的模型 checkpoint 路径必须使用绝对路径格式如xxx/checkpoints/2019-12-03_17-35-30/cnn_epoch21.pth其中cnn_epoch21.pth表示 CNN 模型在第 21 个 epoch 保存的参数。五、训练run.py 全流程解析执行训练python run.py5.1 训练主流程run.py 在hydra.main(config_pathconf/config.yaml)装饰下启动运行时的关键步骤动态配置填充cfg.cwd取原始工作目录cfg.pos_size 2 * cfg.pos_limit 2数据装载从data/out加载train.pkl / valid.pkl / test.pkl通过DataLoaderbatch_size、shuffleTrue、collate_fn(cfg)组织批次模型构建__Model__字典完成model_name到模型类的映射__Model__ { cnn: models.PCNN, rnn: models.BiLSTM, transformer: models.Transformer, gcn: models.GCN, capsule: models.Capsule, lm: models.LM, }训练循环每轮执行train(...)与validate(...)记录 train/valid lossscheduler.step(valid_loss)调整学习率每轮保存模型权重早停与最优模型以 valid loss 为标准跟踪最优 checkpointbest_es_path训练结束后打印最优 epoch 及其 macro F1并在测试集上做最终评估。5.2 多卡训练如需多卡训练修改 train.yamluse_multi_gpu: True gpu_ids: 0,1gpu_ids以逗号分隔第一张卡为计算主卡需使用略多内存。源码侧由torch.nn.DataParallel实现run.py 会设置CUDA_VISIBLE_DEVICES并按逗号拆分出device_ids多卡模式下保存模型使用model.module.save(...)。5.3 日志与模型产物训练日志保存在logs文件夹内由hydra/output/custom.yaml按时间戳生成子目录模型结果保存在checkpoints文件夹内checkpoint 文件命名形如model_name_epochN.pth将show_plot设为True可对 train/valid loss 进行可视化plot_utils可选matplotmatplotlib 绘制对比曲线或tensorboard写入 TensorBoard将use_wandbconfig.yaml 顶层设为True可接入 Weights Biases 在线实验追踪项目名DeepKE_RE_Standard记录 train_loss / valid_loss / test_loss。5.4 训练中替换本地预训练模型当使用 LM预训练模型时若不想在线下载bert-base-chinese可修改 conf/model/lm.yaml 中的lm_file为本地模型的绝对路径如lm_file: pretrained脚本即可加载本地权重。六、六种模型结构与参数详解所有模型定义位于 src/deepke/relation_extraction/standard/models统一继承BasicModule提供save/load接口。模型选择只需修改config.yaml中的- model: xxx。6.1 CNNPCNN模型conf/model/cnn.yaml 参数model_name: cnn in_channels: ??? # 使用 embedding 输出的结果不需要指定 out_channels: 100 kernel_sizes: [3, 5, 7] # 必须为奇数为保证 CNN 输出不改变句子长度 activation: gelu # [relu, lrelu, prelu, selu, celu, gelu, sigmoid, tanh] pooling_strategy: max # [max, avg, cls] keep_length: True dropout: 0.3 # pcnn use_pcnn: False intermediate: 80实现类为 PCNN.py先经Embedding得到词向量与头/尾位置向量拼接的输入再经CNN卷积kernel_sizes必须为奇数以保证卷积不改变句长池化后过两层全连接fc1 - fc2输出num_relations维 logits。当use_pcnn: True时启用分段池化PCNN通过pcnn_mask_embedding将句子按头实体、尾实体分成三段分别做 max-pooling再经fc_pcnn融合即论文Graph Convolution over Pruned Dependency Trees...之外的经典 PCNN 结构。6.2 RNNBiLSTM模型conf/model/rnn.yaml 参数model_name: rnn type_rnn: LSTM # [RNN, GRU, LSTM] input_size: ??? # 使用 embedding 输出的结果不需要指定 hidden_size: 150 # 必须为偶数 num_layers: 2 dropout: 0.3 bidirectional: True last_layer_hn: True实现类为 BiLSTM.pyEmbedding 后接双向 RNN默认 LSTM取最后一层隐状态经全连接输出关系类别。注意hidden_size必须为偶数这是双向拼接时维度对齐的要求。6.3 Capsule 模型conf/model/capsule.yaml 参数model_name: capsule share_weights: True num_iterations: 5 # 胶囊动态路由迭代次数 dropout: 0.3 input_dim_capsule: ??? # 由上层卷积结果得到一般是卷积输出的 hidden_size dim_capsule: 50 # 输出 capsule 的维度 num_capsule: ??? # 输出 capsule 的数目与分类结果相同 num_relations # primary capsule 组成当前用 CNN 作为底层特征抽取器 in_channels: ??? # 使用 embedding 输出的结果不需要指定 out_channels: 100 # input_dim_capsule kernel_sizes: [9] # 必须为奇数且要比较大 activation: lrelu # [relu, lrelu, prelu, selu, celu, gelu, sigmoid, tanh] keep_length: False # 不需要 padding太多无用信息 pooling_strategy: cls # 无关紧要根本用不到Capsule 模型以 CNN 抽取 primary capsule再通过动态路由num_iterations控制迭代次数生成num_capsule个输出胶囊胶囊向量模长作为各类别的置信度。6.4 GCN 模型conf/model/gcn.yaml 参数model_name: gcn num_layers: 3 input_size: ??? # 使用 embedding 输出的结果不需要指定 hidden_size: 100 dropout: 0.3GCN 基于论文 Graph Convolution over Pruned Dependency Trees Improves Relation Extraction核心思路是在句子的依存句法树上做图卷积从而捕捉长距离依赖。需要说明的是在 predict.py 的预测代码中由于暂时没有合适的依存解析工具邻接矩阵adj采用随机初始化源码注释明确标注没找到合适的做 parsing tree 的工具暂时随机初始化训练时请在数据侧准备好依存树信息。6.5 Transformer 模型conf/model/transformer.yaml 参数model_name: transformer hidden_size: ??? # 使用 embedding 输出的结果不需要指定 num_heads: 4 # 必须能被 hidden_size 整除 num_hidden_layers: 3 intermediate_size: 256 dropout: 0.1 layer_norm_eps: 1e-12 hidden_act: gelu_new # [relu, gelu, swish, gelu_new] output_attentions: True output_hidden_states: TrueTransformer 自注意力编码器替代循环结构num_heads必须能被hidden_size整除。注意模型输入hidden_size由 embedding 输出决定因此需与dim_strategy设置保持一致。6.6 预训练语言模型LMconf/model/lm.yaml 参数model_name: lm # 当使用预训练语言模型时该预训练模型的存放位置 # lm_name bert-base-chinese # 也可在线下载 # lm_file: pretrained # 请在此处填写模型的绝对路径 lm_file: bert-base-chinese # transformer 层数初始 base bert 为 12 层 # 数据量较小时调低些反而收敛更快效果更好 num_hidden_layers: 1 # 后面所接 bilstm 的参数 type_rnn: LSTM # [RNN, GRU, LSTM] input_size: 768 # 这个值由 bert 得到 hidden_size: 100 # 必须为偶数 num_layers: 1 dropout: 0.3 bidirectional: True last_layer_hn: TrueLM 模型采用 BERT 类预训练模型提取上下文特征再叠加 BiLSTM 后分类。使用 LM 模型时vocab_size不再需要run.py 中if cfg.model_name lm: vocab_size None词表由分词器tokenizer管理由于 BERT 的输入长度限制为 512predict.py 在预测时会按 512 长度对长句分片并取置信度最高的片段结果作为最终关系。训练数据量较小时将num_hidden_layers从 12 调低如 1反而收敛更快、效果更好。七、预测predict.py 交互式推理修改 predict.yaml 中的fp为模型 checkpoint 的绝对路径如xxx/checkpoints/2019-12-03_17-35-30/cnn_epoch21.pth然后运行python predict.py预测脚本采用交互式输入启动后询问是否使用范例[y/n]退出请输入: exit。选择y使用内置中文范例关于歌曲《人生长路》出自刘德华专辑《男人的爱》的例句选择n则依次输入句子、头实体、头实体类型、尾实体、尾实体类型。若头/尾实体类型留空脚本会自动将replace_entity_with_type置为False仅以文本实体参与预测predict.py。预测过程与训练共用同一套预处理逻辑序列化、token2idx、位置序列标注非 LM 模型按固定 512 长度补齐输入LM 模型按 512 分片取最大置信度。脚本会输出类似男人的爱 和 人生长路 在句中关系为所属专辑置信度为0.92。若将predict_plot设为True还会绘制各关系类别的置信度柱状图注意 matplotlib 默认显示不支持中文脚本已将字体切换为Arial Unicode MS。八、没有标注数据使用远程监督关系标注工具如果您只有句子和实体对、但缺少关系标签仓库提供了基于远程监督Distant Supervision的关系标注工具位于 example/re/prepare-data核心脚本为 ds_label_data.py。其思想是利用已有的高质量三元组知识库将句子与三元组进行实体对齐匹配若句子中同时出现三元组的头实体与尾实体则自动打上该关系标签从而低成本构建标注数据集。使用前请确认两点使用仓库提供的三元组文件或确保自定义的三元组文件质量较高远程监督的标签质量完全取决于知识库质量拥有足够的源数据句子量充足才能覆盖到足够多的三元组匹配。九、常见问题速查问题处理方式训练每次重复预处理耗时长参数未变时将preprocess设为False多卡训练如何配置use_multi_gpu: Truegpu_ids逗号分隔首卡为主卡想可视化 lossshow_plot: Trueplot_utils选matplot或tensorboard预测报错找不到模型检查fp是否为 checkpoint 绝对路径LM 模型下载慢修改lm_file为本地模型绝对路径json/xlsx 数据无法训练先用 transform_data.py 的json2csv/xlsx2csv转成 CSV需要远程监督造标注数据使用 example/re/prepare-data 的标注工具从数据准备到六种模型的选择与训练再到交互式推理与远程监督标注本模块覆盖了关系抽取任务从零到一的完整闭环可作为知识图谱抽取流水线NER → RE → 三元组中承上启下的标准环节直接复用。赞分享人工智能NLP知识图谱深度学习【免费下载链接】DeepKE[EMNLP 2022] An Open Toolkit for Knowledge Graph Extraction and Construction项目地址https://gitcode.com/gh_mirrors/de/DeepKE点击查看免费下载相关推荐DeepKE 标准关系抽取Standard RE实战指南环境配置、数据准备、六大模型训练与交互式预测DeepKE 标准关系抽取Standard RE实战指南环境配置、数据准备、六大模型训练与交互式预测 本文以 DeepKE 仓库中 example/re/人工智能NLP知识图谱深度学习DeepKE 属性抽取AE标准任务实战指南环境搭建、数据准备、Hydra 配置、模型训练与预测全流程DeepKE 属性抽取AE标准任务实战指南环境搭建、数据准备、Hydra 配置、模型训练与预测全流程 属性抽取Attribution Extractio人工智能NLP知识图谱深度学习DeepKE 标准关系抽取数据准备全指南JSON、XLSX、CSV 三种数据格式与格式转换工具实战DeepKE 标准关系抽取数据准备全指南JSON、XLSX、CSV 三种数据格式与格式转换工具实战 本文围绕 DeepKE 标准关系抽取Standard R人工智能NLP知识图谱深度学习上一篇零信任架构下的Prometheus监控安全OAuth2与LDAP身份认证实战指南下一篇RESTMock完全指南如何为Android Instrumentation测试打造高效HTTP模拟服务器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表