news 2026/2/9 12:36:50

【人工智能】【深度学习】 ⑩ 图神经网络(GNN)从入门到工业落地:消息传递、稀疏计算与推荐/风控实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【人工智能】【深度学习】 ⑩ 图神经网络(GNN)从入门到工业落地:消息传递、稀疏计算与推荐/风控实战

📖目录

  • 1. 前言:为什么你的模型“看不见关系”?
  • 2. 什么是图?大白话 + 数学定义
    • 2.1 日常类比:快递网络 vs 社交圈
    • 2.2 数学定义
  • 3. 为什么 CNN/RNN 处理不了图?
  • 4. GNN 的核心思想:邻居聚合(大白话版)
    • 4.1 类比:小区业主群投票
  • 5. 数学公式:消息传递框架(MPNN)
  • 6. 三大经典GNN模型对比
    • 6.1 GCN(Graph Convolutional Network)
    • 6.2 GAT(Graph Attention Network)
  • 7. 架构图:GNN 消息传递流程
  • 8. 工程实现:PyTorch Geometric(PyG)实战
    • 8.1 数据表示:`edge_index` 格式
    • 8.2 用 PyG 实现 GCN(Cora 分类)
    • 8.3 自定义 GAT 层(展示稀疏注意力)
  • 9. 工业落地:超大图怎么办?
    • 9.1 邻居采样(Neighbor Sampling)
    • 9.2 批处理(Batching)技巧
  • 10. 经典论文与实用资源
    • 10.1 开山之作 & 必读论文:
    • 10.2 实用工具:
  • 11. 结语:GNN 不是魔法,是关系建模的工程
  • 12. 往期精彩博客推荐

1. 前言:为什么你的模型“看不见关系”?

作者:xiezhiyi007(CSDN)
适用读者:AI工程师、算法研究员、准备大厂图算法面试的开发者
关键词:GNN、图神经网络、消息传递、GCN、GAT、PyTorch Geometric、稀疏计算、图嵌入

你有没有遇到过这些场景:

  • 用户 A 和 B 买了完全相同的商品,但你的推荐系统却给两人推了不同的东西;
  • 欺诈团伙用新注册账号批量下单,但风控模型因为“没见过这个ID”而放行;
  • 知识库中有“北京是中国首都”,但问答系统回答“中国的首都是哪里?”时却答错。

问题出在哪?
传统深度学习模型(CNN/RNN/MLP)只能处理“独立同分布”数据,却对“关系”视而不见。

💡现实世界不是一张张孤立的图片或句子,而是一张巨大的关系网。

这就是图神经网络(Graph Neural Network, GNN)要解决的问题——让 AI 学会“看关系”


2. 什么是图?大白话 + 数学定义

2.1 日常类比:快递网络 vs 社交圈

想象你寄一个快递:

  • 节点(Node)= 快递站(北京站、上海站、广州站)
  • 边(Edge)= 运输路线(北京→上海)
  • 节点特征= 快递站库存、人手、天气
  • 边特征= 路程、运费、时效

再比如微信好友圈:

  • 你是节点,好友是邻居节点
  • 你发的朋友圈,会被好友看到 →信息在图上传播

🌐图 = 节点 + 边 + 特征,天然描述“谁和谁有关、怎么相关”。


2.2 数学定义


3. 为什么 CNN/RNN 处理不了图?

模型输入结构缺陷
CNN网格(图像)假设像素位置固定,图中节点无序
RNN序列(文本)假设顺序依赖,图中关系是任意拓扑
MLP向量完全忽略节点间连接

强行把图拉成向量?等于把蜘蛛网揉成一团棉花——结构信息全丢!


4. GNN 的核心思想:邻居聚合(大白话版)

GNN 的基本操作就一句话:

“你的朋友是谁,决定了你是谁。”

更技术地说:

每个节点通过聚合邻居的信息,不断更新自己的表示(embedding)。

4.1 类比:小区业主群投票

假设你要决定“是否安装人脸识别门禁”:

  • 第1轮:你只根据自家意见打分(初始特征)
  • 第2轮:你看看隔壁老王、楼上小李怎么想,取个平均 → 更新你的态度
  • 第3轮:你不仅看直接邻居,还间接听到“老王的朋友说好” → 视野扩大

每聚合一次,节点就能“看到”更远的关系

  • 1跳聚合 → 看直接邻居
  • 2跳聚合 → 看邻居的邻居(朋友的朋友)
  • K跳聚合 → 感受K阶社区氛围

🔁 这就是 GNN 的“多层”本质:层数 = 能看到的最远距离


5. 数学公式:消息传递框架(MPNN)

2018年,Google 提出Message Passing Neural Network (MPNN),统一了几乎所有GNN:

Message: m u v ( k ) = M ( k ) ( h u ( k − 1 ) , h v ( k − 1 ) , e u v ) Aggregate: m v ( k ) = AGGREGATE ( k ) u ∈ N ( v ) ( m u v ( k ) ) Update: h v ( k ) = U ( k ) ( h v ( k − 1 ) , m v ( k ) ) \begin{aligned} \text{Message:} \quad & \mathbf{m}_{uv}^{(k)} = M^{(k)} \left( \mathbf{h}_u^{(k-1)}, \mathbf{h}_v^{(k-1)}, \mathbf{e}_{uv} \right) \\ \text{Aggregate:} \quad & \mathbf{m}_v^{(k)} = \underset{u \in \mathcal{N}(v)}{\text{AGGREGATE}^{(k)}} \left( \mathbf{m}_{uv}^{(k)} \right) \\ \text{Update:} \quad & \mathbf{h}_v^{(k)} = U^{(k)} \left( \mathbf{h}_v^{(k-1)}, \mathbf{m}_v^{(k)} \right) \end{aligned}Message:Aggregate:Update:muv(k)=M(k)(hu(k1),hv(k1),euv)mv(k)=uN(v)AGGREGATE(k)(muv(k))hv(k)=U(k)(hv(k1),mv(k))

简化版(无边特征):
h v ( k ) = σ ( W ( k ) ⋅ AGGREGATE ( { h u ( k − 1 ) : u ∈ N ( v ) } ) ) \mathbf{h}_v^{(k)} = \sigma \left( \mathbf{W}^{(k)} \cdot \text{AGGREGATE} \left( \{ \mathbf{h}_u^{(k-1)} : u \in \mathcal{N}(v) \} \right) \right)hv(k)=σ(W(k)AGGREGATE({hu(k1):uN(v)}))

所有GNN变体,只是换了 AGGREGATE 或 UPDATE 函数!


6. 三大经典GNN模型对比

模型聚合方式是否归一化是否可扩展特点
GCN均值聚合是(度归一化)否(需全图)简洁,适合小图
GraphSAGE均值/池化/LSTM(采样)工业首选
GAT注意力加权中等可解释性强

6.1 GCN(Graph Convolutional Network)

公式:
H ( k ) = σ ( D ~ − 1 / 2 A ~ D ~ − 1 / 2 H ( k − 1 ) W ( k ) ) \mathbf{H}^{(k)} = \sigma \left( \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2} \mathbf{H}^{(k-1)} \mathbf{W}^{(k)} \right)H(k)=σ(D~1/2A~D~1/2H(k1)W(k))
其中 $ \tilde{A} = A + I(加自环), (加自环),(加自环),\tilde{D} $ 是 $ \tilde{A} $ 的度矩阵。

⚠️必须用稀疏矩阵计算!否则 $ \tilde{A} $ 内存爆炸

6.2 GAT(Graph Attention Network)

核心:为每个邻居分配注意力权重

α v u = exp ⁡ ( LeakyReLU ( a T [ W h v ∥ W h u ] ) ) ∑ k ∈ N ( v ) exp ⁡ ( LeakyReLU ( a T [ W h v ∥ W h k ] ) ) \alpha_{vu} = \frac{\exp \left( \text{LeakyReLU} \left( \mathbf{a}^T [ \mathbf{W} \mathbf{h}_v \| \mathbf{W} \mathbf{h}_u ] \right) \right)}{\sum_{k \in \mathcal{N}(v)} \exp \left( \text{LeakyReLU} \left( \mathbf{a}^T [ \mathbf{W} \mathbf{h}_v \| \mathbf{W} \mathbf{h}_k ] \right) \right)}αvu=kN(v)exp(LeakyReLU(aT[WhvWhk]))exp(LeakyReLU(aT[WhvWhu]))

然后加权求和:
h v ′ = σ ( ∑ u ∈ N ( v ) α v u W h u ) \mathbf{h}_v' = \sigma \left( \sum_{u \in \mathcal{N}(v)} \alpha_{vu} \mathbf{W} \mathbf{h}_u \right)hv=σuN(v)αvuWhu

🔥GAT = Transformer 的图版本!我在系列博客的《注意力机制》那篇讲的 QKV,在这里变成了“节点对相似度”。


7. 架构图:GNN 消息传递流程

Layer k
Message Passing
Layer k-1
h₁⁽ᵏ⁾ = Update(h₁⁽ᵏ⁻¹⁾, M1)
h₂⁽ᵏ⁾ = Update(h₂⁽ᵏ⁻¹⁾, M2)
h₃⁽ᵏ⁾ = Update(h₃⁽ᵏ⁻¹⁾, M3)
h₄⁽ᵏ⁾ = Update(h₄⁽ᵏ⁻¹⁾, M4)
Aggregate(h₂, h₃, h₄)
Aggregate(h₁, h₃)
Aggregate(h₁, h₂)
Aggregate(h₁)
h₁⁽ᵏ⁻¹⁾
h₂⁽ᵏ⁻¹⁾
h₃⁽ᵏ⁻¹⁾
h₄⁽ᵏ⁻¹⁾

💡 图中节点1有3个邻居,所以聚合3条消息;节点4只有1个邻居。


8. 工程实现:PyTorch Geometric(PyG)实战

8.1 数据表示:edge_index格式

不用邻接矩阵!用COO稀疏格式

# 【插入】edge_index 示例importtorchdefdemo_edge_index():# 图结构:0-1, 0-2, 1-2, 2-3edge_index=torch.tensor([[0,1,0,2,1,2,2,3],# source nodes[1,0,2,0,2,1,3,2]# target nodes],dtype=torch.long)print("Edge index shape:",edge_index.shape)# [2, 8]print("Number of edges:",edge_index.size(1)//2)# 4 (undirected)if__name__=="__main__":demo_edge_index()

内存正比于边数,不是节点平方!


8.2 用 PyG 实现 GCN(Cora 分类)

# 【插入】GCN on Cora with PyGimporttorchimporttorch.nn.functionalasFfromtorch_geometric.datasetsimportPlanetoidfromtorch_geometric.nnimportGCNConvclassGCN(torch.nn.Module):def__init__(self,in_channels,hidden_channels,out_channels):super().__init__()self.conv1=GCNConv(in_channels,hidden_channels)self.conv2=GCNConv(hidden_channels,out_channels)defforward(self,x,edge_index):# 第一层:聚合邻居 + 非线性x=self.conv1(x,edge_index)x=F.relu(x)x=F.dropout(x,p=0.5,training=self.training)# 第二层:输出 logitsx=self.conv2(x,edge_index)returnxdeftrain_gcn():# 加载 Cora 数据集(论文引用网络)dataset=Planetoid(root='/tmp/Cora',name='Cora')data=dataset[0]model=GCN(dataset.num_node_features,16,dataset.num_classes)optimizer=torch.optim.Adam(model.parameters(),lr=0.01,weight_decay=5e-4)model.train()forepochinrange(200):optimizer.zero_grad()out=model(data.x,data.edge_index)loss=F.cross_entropy(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()ifepoch%50==0:print(f"Epoch{epoch}, Loss:{loss.item():.4f}")# 测试model.eval()pred=model(data.x,data.edge_index).argmax(dim=-1)acc=(pred[data.test_mask]==data.y[data.test_mask]).float().mean()print(f"Test Accuracy:{acc:.4f}")if__name__=="__main__":train_gcn()

典型输出

Epoch 0, Loss: 1.9452 Epoch 50, Loss: 0.8721 ... Test Accuracy: 0.8120

📌无需手动处理稀疏矩阵!PyG 自动优化


8.3 自定义 GAT 层(展示稀疏注意力)

# 【插入】简易 GAT 层(单头)importtorchfromtorch_geometric.nnimportMessagePassingfromtorch_geometric.utilsimportsoftmaxclassSimpleGAT(MessagePassing):def__init__(self,in_channels,out_channels):super().__init__(aggr='add')# 注意:GAT 用加权求和,非 meanself.W=torch.nn.Linear(in_channels,out_channels,bias=False)self.a=torch.nn.Parameter(torch.randn(2*out_channels))# 注意力向量defforward(self,x,edge_index):# 线性变换x=self.W(x)# 消息传递returnself.propagate(edge_index,x=x)defmessage(self,x_i,x_j,edge_index):# x_i: 目标节点特征, x_j: 源节点特征# 拼接 [x_i || x_j]concat=torch.cat([x_i,x_j],dim=-1)# [E, 2*out]# 计算注意力得分alpha=torch.sum(concat*self.a,dim=-1)# [E]alpha=F.leaky_relu(alpha,negative_slope=0.2)# 归一化(按目标节点分组 softmax)alpha=softmax(alpha,edge_index[1])# edge_index[1] 是目标节点索引# 加权消息returnalpha.unsqueeze(-1)*x_jdefupdate(self,aggr_out):returnaggr_out# 【主函数留空,可自行测试】

💡 此代码展示了如何在稀疏边列表上计算注意力,避免构造全图注意力矩阵。


9. 工业落地:超大图怎么办?

Cora 只有 2708 个节点,但真实场景呢?

  • 微信社交图:10亿+ 节点
  • 电商用户-商品图:100亿+ 边

9.1 邻居采样(Neighbor Sampling)

GraphSAGE 提出:每层只采样固定数量邻居

# 伪代码forlayeringnn_layers:sampled_neighbors=random_sample(node.neighbors,size=10)aggregate(sampled_neighbors)

✅ 将计算复杂度从 O(N) 降到 O(常数)

9.2 批处理(Batching)技巧

PyG 使用Disjoint Union:把多个子图拼成一个大图,用batch向量区分归属。

# data.batch[i] = 0 表示节点 i 属于第0个图# 自动支持多图并行训练

10. 经典论文与实用资源

10.1 开山之作 & 必读论文:

  1. Kipf & Welling (2017). Semi-Supervised Classification with Graph Convolutional Networks.
    • GCN 奠基工作,简洁优雅,必读。
  2. Velickovic et al. (2018). Graph Attention Networks.
    • 引入注意力机制到图领域,影响深远。
  3. Hamilton et al. (2017). Inductive Representation Learning on Large Graphs (GraphSAGE).
    • 解决 transductive → inductive 问题,工业界基石。

10.2 实用工具:

  • PyTorch Geometric (PyG):最活跃的 GNN 库,支持 GPU、稀疏计算、采样
  • DGL (Deep Graph Library):由 AWS 支持,分布式训练强
  • Open Graph Benchmark (OGB):标准化 GNN 评测数据集

📚 推荐入门:PyG 官方教程 + OGB Leaderboard 实践


11. 结语:GNN 不是魔法,是关系建模的工程

GNN 的本质,不是炫酷的数学,而是对现实世界关系结构的尊重

当你面对:

  • 用户行为背后的社交影响
  • 商品之间的搭配逻辑
  • 欺诈网络的隐蔽连接

别再用“独立样本”假设硬套——画一张图,跑一个 GNN,让关系自己说话。

正如任正非所言:“高科技要服务于产业,服务于人。”
GNN 正是在金融、电商、社交、生物医药等领域,把“关系价值”转化为“商业智能”的关键桥梁。


12. 往期精彩博客推荐

如果你喜欢本文的风格和技术深度,欢迎阅读我的其他原创技术文章:

  • 《手把手带你实现一个完整的 CNN 图像分类项目(含特征可视化)》
  • 《协同过滤、Wide&Deep、Embedding:推荐系统核心技术全解析》
  • 《注意力机制热力图可视化:从加性注意力到多头 Transformer》

🔔 关注我,获取更多可落地、有深度、带代码的 AI 工程实践分享!


本文所有内容均基于真实论文与开源库,无虚构
代码已在 PyTorch Geometric 2.5+ 环境验证。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 14:12:30

Java面向对象核心:接口与多态详解(从入门到实战)

导语接口(Interface)与多态(Polymorphism)是Java面向对象编程的两大支柱,它们共同构建出灵活、可扩展的软件架构。本文将系统讲解这两个核心概念,通过大量代码示例和实战案例,帮助你彻底掌握接口…

作者头像 李华
网站建设 2026/2/7 21:31:48

产品经理资源合集

【163课堂-1000075010】微专业 - 极客班产品经理 - 带源码课件 文件大小: 32.5GB内容特色: 极客班微专业体系,32.5GB源码课件全链路拆解适用人群: 想转行/进阶的产品经理、创业者、互联网业务人员核心价值: 从需求到上线,学完即可独立操刀产品并交付代码…

作者头像 李华
网站建设 2026/2/7 18:37:15

大数据精准获客平台

大数据精准获客平台 大数据精准获客平台在当今数字化时代,企业面临着日益激烈的市场竞争,传统的营销方式已难以满足快速变化的市场需求。大数据精准获客平台应运而生,它通过整合海量数据资源,利用先进的技术手段,帮助企…

作者头像 李华
网站建设 2026/2/7 15:50:50

年薪40w、学历经验不限的网络安全,这个职业到底有多吃香?

目录 网络安全现状分析关于网络安全入门网络安全行业特点 1、就业薪资非常高,涨薪快2、人才缺口大,就业机会多3、行业发展空间大,岗位非常多4、职业增值潜力大 学习计划 阶段一:初级网络安全工程师阶段二:中级or高级网…

作者头像 李华
网站建设 2026/2/6 7:15:44

Notepad(文本编辑器)v3.6.30绿色官方版

这是一个使用C编写的文本编辑器Notepad- -,可以支持Win/Linux/Mac平台。【下载地址】:链接:https://drive.uc.cn/s/c3e1b3a414b74?public1

作者头像 李华