人工智能之知识处理
第三章 图神经网络与知识推理:让图谱"活"起来
文章目录
前言
在前两章中,我们学会了如何定义知识和构建知识图谱。但传统的知识图谱是静态的------它像一本死记硬背的百科全书,如果书里没写,它就不知道。
图神经网络的出现,给这本百科全书装上了"大脑"。它不再仅仅依赖硬性的逻辑规则,而是通过学习图结构中的模式,具备了"举一反三"的推理能力。本章将深入探讨这一核心前沿技术。
3.1 图神经网络(GNN)基础
1. 为什么需要GNN?图结构数据的特殊性
传统的深度学习模型(如CNN处理图像、RNN处理文本)处理的是欧几里得空间的数据(网格状或序列状)。但知识图谱是非欧几里得空间的图结构数据:
- 无序性:节点的邻居没有固定的顺序。
- 变长性:不同节点的邻居数量差异巨大(比如"美国"的邻居成千上万,而"某个小岛屿"可能只有几个)。
GNN就是专门为了解决这些问题而生的,它能够直接在图结构上进行运算。
2. GNN的核心思想:消息传递与聚合
GNN的运作机制可以用一句话概括:"近朱者赤,近墨者黑"。
一个节点的特征表示(Embedding),不仅取决于它自己,还取决于它的邻居。GNN通过消息传递机制来更新节点表示:
- 聚合:收集周围邻居节点的信息。
- 更新:将收集到的信息与自身信息结合,生成新的向量表示。
经过多层传递,一个节点就能"感知"到整个图的局部结构信息。
3. 知识推理与GNN的关联
在知识图谱中,推理任务(如链接预测)本质上就是预测节点之间的连接概率。
- 传统方法:通过路径查找(如A->B->C,所以A->C)。
- GNN方法 :将实体映射为低维向量。如果向量 V A V_A VA 和 V B V_B VB 在向量空间中距离很近,或者通过某种变换(如 V A + V 关系 ≈ V B V_A + V_{关系} \approx V_B VA+V关系≈VB)能匹配,GNN就判定它们之间存在关系。
输出层
聚合层
输入层
节点A
节点B
节点C
聚合A的邻居信息
A的最终向量表示
3.2 核心图神经网络模型详解
GNN是一个大家族,针对不同的推理需求,有不同的"特种兵"。
1. GCN:图卷积网络
- 原理:GCN借鉴了图像处理中的卷积概念。它通过谱图理论,对节点及其邻居的特征进行加权平均。
- 聚合方式 :通常采用归一化的平均聚合。它假设所有邻居的重要性是相似的(或者仅由度矩阵决定)。
- 推理应用 :非常适合节点分类 (如判断某个药品属于哪类处方药)和半监督学习。
- 局限:它忽略了边的类型(知识图谱中关系很重要),且对所有邻居一视同仁。
2. GAT:图注意力网络
- 原理 :为了解决GCN"一视同仁"的问题,GAT引入了注意力机制。
- 核心逻辑:并不是所有邻居都同样重要。例如,在预测"乔布斯的职业"时,"苹果公司"这个邻居比"乔布斯的朋友"这个邻居更重要。GAT会自动学习这些权重。
- 推理优势 :具有更强的可解释性(我们可以看到模型关注了哪些关系),且在异构图(如知识图谱)上表现通常优于GCN。
3. 其他常用模型
- GraphSAGE :擅长处理大规模图 和归纳式学习。它不是聚合全图,而是通过采样固定数量的邻居来生成嵌入,使得模型可以处理训练时未见过的"新节点"。
- R-GCN :专门为知识图谱设计。它在GCN的基础上,为每种关系类型设计了独立的权重矩阵,能够区分"父亲"和"朋友"这两种完全不同的边。
模型对比表
| 模型 | 核心特点 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| GCN | 谱域卷积,平均聚合 | 节点分类、同质图 | 计算快,实现简单 | 忽略边类型,无法区分邻居重要性 |
| GAT | 引入注意力机制 | 关系预测、异构图 | 精度高,可解释性强 | 训练较慢,显存占用高 |
| R-GCN | 关系感知卷积 | 知识图谱补全 | 适配多关系数据 | 参数量大(每种关系一个矩阵) |
3.3 知识推理精度优化策略
在实际工程中,直接套用模型往往效果不佳,需要针对知识图谱的特性进行优化。
1. 数据层面:解决稀疏性
- 知识图谱补全:在训练前,先利用简单的启发式规则或预训练模型(如TransE)补全一部分缺失的三元组,丰富图结构。
- 数据增强:对于少样本的实体,可以通过随机游走生成子图,或者利用文本描述(如BERT生成的向量)来增强节点特征。
2. 模型层面:多模型融合
- 超参数调优 :
- 层数:GNN层数不是越深越好。通常2-3层效果最佳。过深会导致"过平滑"现象,即所有节点的向量变得趋同,无法区分。
- Dropout:在训练中加入Dropout防止过拟合。
- 融合策略:可以将GCN提取的结构特征与GAT提取的语义特征拼接,或者结合预训练语言模型(如BERT+GNN),利用文本信息辅助推理。
3. 评估指标
在链接预测任务中,我们通常使用以下指标:
- Hit@K:预测的正确实体排在Top K位的比例(如Hit@10,意味着正确答案在前10名里就算对)。
- MRR:平均倒数排名。排名越靠前,分数越高。
- 公式:
M R R = 1 ∣ Q ∣ ∑ i = 1 ∣ Q ∣ 1 r a n k i MRR = \frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{rank_i} MRR=∣Q∣1i=1∑∣Q∣ranki1
3.4 实操演练:基于PyTorch Geometric的GCN推理
我们将使用 PyTorch Geometric 库,在一个微型知识图谱上实现节点分类任务。
1. 环境搭建
bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install torch-geometric
2. 案例背景
我们构建一个极小的"学术图谱",包含论文节点和引用关系。
- 任务:根据论文的引用关系和内容特征,预测论文的类别(如"AI"或"物理")。
3. 代码实现
python
import torch
from torch_geometric.nn import GCNConv
from torch_geometric.data import Data
# --- 1. 准备数据 ---
# 假设有4篇论文,特征向量维度为2
# 论文0: [1.0, 0.0] (AI特征)
# 论文1: [0.0, 1.0] (物理特征)
# 论文2: [1.1, 0.1] (类似AI)
# 论文3: [0.1, 1.1] (类似物理)
x = torch.tensor([
[1.0, 0.0],
[0.0, 1.0],
[1.1, 0.1],
[0.1, 1.1]
], dtype=torch.float)
# 定义引用关系(边)
# 0引用了2,1引用了3,0引用了1(跨类引用)
edge_index = torch.tensor([
[0, 1, 0], # 源节点
[2, 3, 1] # 目标节点
], dtype=torch.long)
# 标签(只有前两个有标签,后两个需要推理)
y = torch.tensor([0, 1], dtype=torch.long) # 0:AI, 1:Physical
# 构建PyG数据对象
data = Data(x=x, edge_index=edge_index, y=y)
# --- 2. 定义GCN模型 ---
class GCN(torch.nn.Module):
def __init__(self):
super().__init__()
# 输入维度2,隐藏层16,输出类别2
self.conv1 = GCNConv(2, 16)
self.conv2 = GCNConv(16, 2)
def forward(self, data):
x, edge_index = data.x, data.edge_index
# 第一层卷积 + 激活函数
x = self.conv1(x, edge_index)
x = torch.relu(x)
x = torch.dropout(x, p=0.5, train=self.training)
# 第二层卷积
x = self.conv2(x, edge_index)
return x
model = GCN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
# --- 3. 训练与推理 ---
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(data)
# 只计算有标签节点的损失 (节点0和1)
loss = torch.nn.functional.nll_loss(out.log_softmax(dim=1)[data.y.shape[0]:], data.y) # 这里简化处理,实际需分割训练集
# 简化版训练循环(仅演示前向传播)
# 实际训练需要划分训练掩码 train_mask
break # 仅演示结构
# --- 4. 推理阶段 ---
model.eval()
with torch.no_grad():
out = model(data)
predictions = out.argmax(dim=1)
print("节点特征:", x)
print("预测结果(节点2,3):", predictions[2:])
# 预期:节点2应该被预测为0(AI),节点3被预测为1(Physical)
# 因为GCN聚合了邻居信息,节点2虽然特征像AI,如果它引用了物理节点,特征会混合
代码解读:
- Data对象 :将图结构转化为张量。
edge_index是稀疏矩阵的坐标格式。 - GCNConv:这是PyG库提供的GCN层。它自动处理了邻居聚合和归一化。
- 推理逻辑:模型通过学习,将图结构信息(谁引用了谁)融合到了节点特征中。即使节点2的特征有点模糊,通过它和节点0的关系,模型也能更准确地判断它的类别。
通过本章,我们已经掌握了利用GNN进行知识推理的技术。下一章,将探讨如何将这种强大的技术与大语言模型结合,迈向更高级的神经符号人工智能。
资料
咚咚王
《Python 编程:从入门到实践》
《利用 Python 进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第 3 版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow 机器学习实战指南》
《Sklearn 与 TensorFlow 机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python 深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习 +(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第 2 版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨 +&+ 张孜铭
《AIGC 原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战 AI 大模型》
《AI 3.0》