3. 图神经网络入门:GNN核心思想、消息传递机制、聚合函数对比
图神经网络(Graph Neural Network, GNN)是处理图结构数据的核心工具。在金融图谱中,实体(如企业、个人、账户)构成节点,关系(如担保、交易、控股)构成边。GNN 通过聚合邻居信息来更新节点表示,从而捕捉复杂的拓扑依赖关系。本节将系统讲解 GNN 的核心思想、消息传递机制以及三种主流聚合函数的差异。
3.1 GNN 核心思想:从节点到图的表示学习
传统深度学习模型(如 CNN、RNN)处理的是欧几里得数据(图像、序列),而图数据是非欧几里得结构,节点之间没有固定的空间顺序。GNN 的核心思想是:每个节点的表示由其自身特征和邻居节点的特征共同决定,通过迭代的“消息传递”过程,节点能够逐步捕获其 k 阶邻域的结构信息。
在金融风控场景中,这一思想对应着“风险传染”逻辑:一个企业的违约风险不仅取决于自身财务指标,还受到其担保方、关联交易对手的信用状况影响。GNN 通过多层消息传递,将这种关联风险编码到节点嵌入中。
3.2 消息传递机制:GNN 的通用框架
大多数 GNN 模型(GCN、GAT、GraphSAGE 等)都可以统一到 消息传递(Message Passing) 框架下。该框架包含三个核心步骤,每层迭代执行:
- 消息生成(Message): 对于每条边 (u, v),根据源节点 u 的特征和目标节点 v 的特征,生成一个消息向量 muv。
- 消息聚合(Aggregate): 将目标节点 v 收到的所有邻居消息进行聚合,得到聚合向量 av。
- 节点更新(Update): 将聚合向量 av 与节点 v 自身的上一轮特征 hv 结合,通过非线性变换更新节点特征 hv'。
数学形式化表达如下:
# 消息传递通用公式(第 k 层)
# 1. 消息生成
m_uv^(k) = Message( h_u^(k-1), h_v^(k-1), e_uv )
# 2. 消息聚合
a_v^(k) = Aggregate( { m_uv^(k) | u ∈ N(v) } )
# 3. 节点更新
h_v^(k) = Update( h_v^(k-1), a_v^(k) )
其中,N(v) 表示节点 v 的邻居集合,euv 是边特征(如担保金额、持股比例)。在金融图谱中,消息生成可以引入边权重(如担保金额越大,消息强度越高),从而让模型关注高风险关联。
3.3 聚合函数对比:Mean、Max、Sum
聚合函数是消息传递机制的核心组件,它决定了如何将邻居信息融合到目标节点。不同的聚合函数对图结构信息的捕获能力不同,直接影响模型在金融场景中的表现。下表从多个维度对比三种最常用的聚合函数:
| 对比维度 | Mean(均值聚合) | Max(最大聚合) | Sum(求和聚合) |
|---|---|---|---|
| 数学定义 | av = (1/|N(v)|) * Σ muv | av = max( { muv | u ∈ N(v) } ) | av = Σ muv |
| 对邻居数量的敏感性 | 不敏感(归一化后均值与度数无关) | 不敏感(只取最大值) | 敏感(度数越大,聚合值越大) |
| 对邻居分布的区分度 | 中等(仅捕获平均趋势) | 低(只关注极端值,忽略多数邻居) | 高(保留完整分布信息) |
| 对异常邻居的鲁棒性 | 高(异常值被平均稀释) | 低(异常值可能直接成为最大值) | 中等(异常值会显著影响总和) |
| 适用金融场景 | 同质化邻居(如多家银行平均利率) | 风险预警(如最大担保金额) | 风险累积(如总关联交易额) |
| 表达能力(理论) | 无法区分某些非同构图 | 无法区分某些非同构图 | 最强(可区分多数非同构图) |
从理论角度看,Sum 聚合的表达能力最强。根据 Xu 等人(2019)的研究,Sum 聚合能够区分绝大多数非同构图结构,而 Mean 和 Max 在某些情况下会丢失结构信息。但在实际金融应用中,选择哪种聚合函数需要结合具体任务:
- Sum 聚合:适合需要捕获“风险总量”的场景,如计算企业所有对外担保的总金额、所有关联交易的总规模。Sum 对邻居数量敏感,能反映节点在图中的“活跃度”。
- Mean 聚合:适合邻居特征分布相对均匀的场景,如计算行业平均财务比率。Mean 对邻居数量不敏感,更适合度数差异极大的图(如少数核心节点连接大量叶子节点)。
- Max 聚合:适合“木桶效应”场景,如识别担保网络中风险最高的单一关联方、交易网络中金额最大的单笔异常交易。Max 对异常值敏感,适合做风险预警。
3.4 聚合函数选择指南与金融案例
在实际的金融风控项目中,聚合函数的选择往往不是孤立的,需要结合图谱结构特征和业务目标。以下是一些经验性建议:
下表给出了不同金融场景下的聚合函数推荐:
| 金融场景 | 图谱结构特点 | 推荐聚合函数 | 业务解释 |
|---|---|---|---|
| 企业信用评级 | 担保网络,度数差异大 | Mean | 关注关联企业的平均信用水平,避免被单一高担保额扭曲 |
| 反欺诈团伙识别 | 资金交易网络,存在异常大额交易 | Max | 快速捕获异常大额转账或集中收款行为 |
| 供应链金融风险 | 上下游交易网络,交易笔数多 | Sum | 评估企业总交易规模,反映其在供应链中的核心程度 |
| 关联交易风险传导 | 多层持股网络,结构复杂 | Sum + 归一化 | 计算总关联交易额,同时通过归一化消除度数影响 |
| 洗钱网络检测 | 多对多交易,存在分层结构 | Mean 或 Sum | Mean 用于检测平均交易模式异常,Sum 用于检测资金总量异常 |
3.5 代码示例:使用 PyTorch Geometric 实现三种聚合
以下代码展示了如何在 PyTorch Geometric 框架中自定义消息传递层,并分别使用 Mean、Max、Sum 聚合函数。该示例可直接用于金融图谱的节点分类任务。
import torch
import torch.nn.functional as F
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops, degree
class FinancialGNNLayer(MessagePassing):
"""自定义金融图谱消息传递层,支持三种聚合函数"""
def __init__(self, in_channels, out_channels, aggr='mean'):
# aggr 参数可选: 'mean', 'max', 'sum'
super().__init__(aggr=aggr)
self.lin = torch.nn.Linear(in_channels, out_channels)
def forward(self, x, edge_index):
# x: 节点特征矩阵 [N, in_channels]
# edge_index: 边索引 [2, E]
# 添加自环,使节点在更新时包含自身特征
edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))
# 开始消息传递
return self.propagate(edge_index, x=x)
def message(self, x_j):
# x_j: 源节点特征 [E, in_channels]
# 消息生成:线性变换
return self.lin(x_j)
def update(self, aggr_out, x):
# aggr_out: 聚合后的消息 [N, out_channels]
# x: 原始节点特征 [N, in_channels]
# 节点更新:聚合结果 + 原始特征(残差连接)
return aggr_out + x
# 使用示例
# layer_mean = FinancialGNNLayer(16, 32, aggr='mean')
# layer_max = FinancialGNNLayer(16, 32, aggr='max')
# layer_sum = FinancialGNNLayer(16, 32, aggr='sum')
aggr 参数直接控制聚合函数类型。PyTorch Geometric 内置了 scatter_mean、scatter_max、scatter_sum 等高效实现。在金融图谱中,建议先使用 Mean 聚合作为基线模型,再根据业务需求尝试 Max 或 Sum 聚合进行对比实验。
3.6 本节小结
- GNN 核心思想:通过消息传递机制,让节点聚合邻居信息来更新自身表示,捕获图结构中的依赖关系。
- 消息传递三步骤:消息生成 → 消息聚合 → 节点更新,每层扩展一阶邻居视野。
- 聚合函数对比:Mean 适合均匀分布、Max 适合异常检测、Sum 适合总量评估。Sum 理论表达能力最强,但在度数不均的金融图谱中需谨慎使用。
- 金融实践:聚合函数的选择应结合图谱结构(度数分布)和业务目标(平均风险 vs. 最大风险 vs. 总风险),并通过实验验证。