知识图谱模型训练的本质是将实体(Entities)与关系(Relations)映射到低维向量空间(即知识图谱嵌入,KGE),因此需先完成以下基础步骤:
数据收集与预处理
三元组构建
三元组(Head Entity, Relation, Tail Entity,如“Barack Obama - PresidentOf - United States”)是知识图谱的核心单元。可通过以下方式生成:
工具选择
PyKEEN是Python中专门用于**知识图谱嵌入(KGE)**的库,支持TransE、DistMult、RotatE等多种经典模型,提供“数据加载-模型定义-训练-评估”的端到端流程。
安装与数据加载
pip install pykeen
加载内置数据集(如FB15k-237,包含14951个实体、1345个关系、592213个三元组):
from pykeen.datasets import FB15k237
dataset = FB15k237() # 自动划分训练集(training)、验证集(validation)、测试集(testing)
模型定义
选择TransE模型(基于“头实体+关系=尾实体”的翻译假设,适合1-to-1关系):
from pykeen.models import TransE
model = TransE(
triples_factory=dataset.training, # 训练集三元组
random_seed=42, # 随机种子(保证可复现性)
embedding_dim=200, # 实体与关系的嵌入维度
)
模型训练
使用fit方法进行训练,设置epochs(迭代次数)、batch_size(批量大小)、learning_rate(学习率):
from pykeen.training import SLCWATrainingLoop
training_loop = SLCWATrainingLoop(
model=model,
triples_factory=dataset.training,
)
losses = training_loop.train(
num_epochs=100, # 训练100轮
batch_size=128, # 每批128个三元组
learning_rate=0.01, # 学习率
optimizer_kwargs=dict(weight_decay=1e-6), # L2正则化(防止过拟合)
)
模型评估
用测试集评估模型性能,常用指标包括MRR(Mean Reciprocal Rank,平均倒数排名)、Hit@10(前10名命中率):
from pykeen.evaluation import RankBasedEvaluator
evaluator = RankBasedEvaluator()
results = evaluator.evaluate(
model=model,
triples_factory=dataset.testing, # 测试集三元组
)
print(results.metrics) # 输出各项指标
模型保存与加载
保存训练好的模型(包括嵌入向量、模型参数):
model.save_to_directory("my_transE_model")
# 加载模型
from pykeen.models import load_model
loaded_model = load_model("my_transE_model")
若内置模型无法满足需求(如需要更复杂的关系建模),可继承pykeen.models.Model类自定义模型。例如,实现一个带注意力机制的TransE模型:
from pykeen.models import Model
import torch
import torch.nn as nn
class AttentionTransE(Model):
def __init__(self, triples_factory, random_seed=None):
super().__init__(triples_factory=triples_factory, random_seed=random_seed)
self.entity_embeddings = nn.Embedding(self.num_entities, 200) # 实体嵌入
self.relation_embeddings = nn.Embedding(self.num_relations, 200) # 关系嵌入
self.attention = nn.Linear(200, 1) # 注意力层
def forward(self, head, relation, tail):
# 计算头实体与关系、尾实体的得分
h_emb = self.entity_embeddings(head)
r_emb = self.relation_embeddings(relation)
t_emb = self.entity_embeddings(tail)
score = torch.norm(h_emb + r_emb - t_emb, p=2, dim=-1) # L2范数(TransE核心)
# 注意力机制:对头实体嵌入加权
attention_weights = torch.softmax(self.attention(h_emb), dim=0)
weighted_h_emb = torch.sum(attention_weights * h_emb, dim=0)
score = torch.norm(weighted_h_emb + r_emb - t_emb, p=2, dim=-1)
return score
训练自定义模型时,流程与内置模型一致(fit+evaluate)。
若没有标注数据,可采用无监督知识图谱嵌入方法,通过图结构本身学习节点表示:
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
# 构建GCN模型
inputs = Input(shape=(dataset.num_entities, 200)) # 输入实体嵌入
x = Dense(200, activation='relu')(inputs) # 全连接层
outputs = Dense(200)(x) # 输出嵌入
gcn_model = Model(inputs=inputs, outputs=outputs)
# 定义损失函数(重构邻接矩阵)
adj_matrix = dataset.training.to_dense() # 训练集邻接矩阵
loss = tf.reduce_mean(tf.square(gcn_model(inputs) - adj_matrix))
# 编译与训练
gcn_model.compile(optimizer='adam', loss=loss)
gcn_model.fit(x=dataset.entity_embeddings, y=adj_matrix, epochs=50, batch_size=128)
通过以上流程,可实现Python知识图谱的模型训练,从数据预处理到模型评估形成完整闭环。根据任务需求选择合适的模型(如PyKEEN的内置模型或自定义模型),即可完成知识图谱的嵌入学习。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。