动态知识图谱推理:预测未来事实与事件
什么是动态知识图谱推理
知识图谱以三元组(头实体,关系,尾实体)的形式组织事实,比如(张三,就读于,清华大学)。但现实世界是动态变化的,事实会随着时间出现、消失或演化。动态知识图谱推理就是在考虑时间维度的前提下,推断图谱中缺失的事实、预测未来可能发生的事件,或者判断某个事实在特定时间是否成立。
与静态推理不同,动态推理需要建模事实的时间依赖性。例如,“2023年王五任职于A公司”这一事实,在2023年成立,在2022年可能不成立。推理任务包括:
- 时间事实补全:已知一部分时间点下的关系,推测缺失的实体或关系。
- 未来事实预测:基于历史事件序列,预测未来某个时间点可能发生的事实。
- 事件时序推理:判断事件发生的先后或持续时间。
动态知识图谱推理在金融风控、社交网络演化、推荐系统、药物发现等领域有重要应用。
动态知识图谱的数据表示
动态知识图谱通常有两种表示方式:
基于时间快照的表示
将连续时间离散化为一系列快照,每个快照是一个静态知识图谱。例如:
G_1, G_2, ..., G_T
其中 G_t = {(s, r, o, t)} 表示在时间步 t 成立的三元组。这种表示适合固定时间间隔的序列预测,实现相对简单,但可能丢失细粒度的时间信息。
基于时间戳的表示
每个事实直接附带一个或多个时间戳,或一个时间区间,形式为 (s, r, o, t) 或 (s, r, o, [start, end])。这样更精细,能处理不规则时间间隔和持续时间信息,但模型设计更复杂。
主要方法分类
时间感知的嵌入方法
将时间作为额外维度,与实体、关系一起嵌入到连续向量空间。核心思想是设计一个评分函数 f(s, r, o, t),使有效事实得分高,无效事实得分低。
- 基于平移的方法:例如 TTransE,将 TransE 拓展到时间维度,要求 s + r + t ≈ o,其中 t 是时间嵌入。
- 基于分解的方法:例如 HyTE,将时间视为超平面,将实体和关系投影到时间特定的超平面上再做运算。
- 基于卷积/旋转的方法:如 RotatE 的扩展,在复数空间中引入时间旋转,表示实体随时间演化。
序列与事件建模方法
将动态图谱视为事件序列,利用序列模型捕捉事件间的依赖关系。
- 马尔可夫过程与点过程:例如 DyREP 使用循环神经网络结合时间点过程,建模事件发生的强度和实体间的交互演化。
- 图卷积序列模型:EvolveGCN 在每个时间快照上使用 GCN,并让 GCN 的参数随时间通过 RNN 或 MLP 演化,从而捕捉图的动态结构变化。
- 自注意力与 Transformer:TGN(时序图网络)聚合实体邻居时同步考虑时间顺序,支持连续时间动态,在节点嵌入更新中融入时间信息。
神经符号与时序逻辑方法
结合逻辑规则和时序信息,例如 Temporal Logic Embeddings,将时间约束融入嵌入学习,或使用归纳逻辑编程从数据中学习带时间戳的规则,实现可解释的推理。
经典模型详解
RE‑NT:基于关系感知的时序嵌入
RE‑NT 将时间分解为多个时期,每个时期实体有不同的上下文表示。关键是引入“关系感知的时间编码器”,使同一实体在不同关系下的演化模式不同。推理时,对于查询 (s, r, ?, t),模型首先根据时间 t 和关系 r 获取头实体的表示,然后预测尾实体。
TLogic:时序规则学习
TLogic 从时序知识图谱中提取形如 relation1(x, y, t1) ∧ relation2(y, z, t2) → relation3(x, z, t3) 的时序规则,并计算规则置信度。在推理时,用高置信度规则去预测缺失事实,可解释性强,尤其适合小样本场景。
xERTE:时序知识图谱上的可解释推理
xERTE 围绕查询实体和时间,在时序知识图谱上进行子图抽取和注意力传播,生成局部解释子图。用户不仅能得到预测答案,还能看到“为什么预测这个事实会在该时间发生”的推理路径。
评估与数据集
常用数据集
- ICEWS:包含带时间戳的政治事件,如“国家 – 发表声明 – 国家”。常用版本有 ICEWS14, ICEWS18, ICEWS05‑15。
- GDELT:全球事件数据库,规模庞大,包含多种事件类型和时间信息。
- WIKI 和 YAGO:从维基百科提取的事实,部分事实附带时间(如 YAGO3‑10, Wikidata12k)。
- 自定义金融、医学时序图谱:按需构建。
评估指标
- MRR(平均倒数排名):正确答案在候选列表中的平均倒数排名。
- Hits@k:正确答案排在前 k 位的比例(通常 k=1, 3, 10)。
- 对于未来预测任务,通常采用时间过滤:评估时保证测试集答案时间不早于训练集观察时间,防止信息泄露。
动手实践:构建一个简单的时序预测模型
下面演示如何用 PyTorch 和 PyKEEN 风格的代码,搭建一个简化的 TransE 时间扩展模型。假设数据为 (s, r, o, t) 格式。
步骤 1:数据准备
import torch
from torch.utils.data import Dataset
# 示例数据: (头实体ID, 关系ID, 尾实体ID, 时间步)
train_data = [
(0, 0, 1, 0),
(1, 1, 2, 1),
(2, 0, 3, 2),
# ...
]
创建字典映射实体和关系到整数 ID。
步骤 2:模型定义
class TemporalTransE(torch.nn.Module):
def __init__(self, num_entities, num_relations, time_span, embed_dim):
super().__init__()
self.entity_embed = torch.nn.Embedding(num_entities, embed_dim)
self.relation_embed = torch.nn.Embedding(num_relations, embed_dim)
self.time_embed = torch.nn.Embedding(time_span, embed_dim)
# 归一化旋转,可选
self.entity_embed.weight.data.uniform_(-1, 1)
self.relation_embed.weight.data.uniform_(-1, 1)
self.time_embed.weight.data.uniform_(-1, 1)
def forward(self, s, r, o, t):
s_vec = self.entity_embed(s)
r_vec = self.relation_embed(r)
t_vec = self.time_embed(t)
o_vec = self.entity_embed(o)
# 假设 s + r + t 应该接近 o
score = torch.norm(s_vec + r_vec + t_vec - o_vec, p=2, dim=1)
return score
步骤 3:训练循环
import torch.optim as optim
model = TemporalTransE(num_entities, num_relations, time_horizon, embed_dim=128)
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 负采样: 替换头实体或尾实体生成负样本
for epoch in range(100):
total_loss = 0
for batch in dataloader:
pos_score = model(pos_s, pos_r, pos_o, pos_t)
# 生成负样本 ...
neg_score = model(neg_s, neg_r, neg_o, neg_t)
# 边际损失
loss = torch.mean(torch.relu(pos_score - neg_score + margin))
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch}, Loss {total_loss}")
步骤 4:预测未来时间步的链接
给定 (s, r, t_future),计算所有候选实体 o 的得分,选取得分最低的 Top-K 作为预测结果。也可结合历史序列信息,利用 LSTM 编码时间趋势,再与嵌入结合。
挑战与前沿
核心挑战
- 数据稀疏与长尾分布:很多实体只在少数时间点出现。
- 事件因果关系:现有模型大多捕捉相关性,难以区分真正的因果触发。
- 可解释性与可靠性:实际应用中需要可审计的推理路径。
- 多模态时间信息:融合文本、传感器等非结构化时间数据。
前沿方向
- 大语言模型与时序推理:用 LLM 提取事件时序常识,增强结构化推理。
- 因果动态推理:将结构因果模型引入时序图谱。
- 终身学习与时序知识图谱:模型持续适应新事件,不遗忘旧模式。
- 结合图神经网络与连续时间动力学:如神经ODE图网络,实现更自然的连续时间演化。
掌握动态知识图谱推理,能让你在时序预测、智能问答和风险分析等领域建立更强的时间感知模型。初学者可从复现 RE‑NT 或 TGN 等开源代码开始,逐步深入这一快速发展的领域。