3. 图神经网络入门:GNN核心思想、消息传递机制、聚合函数对比

图神经网络(Graph Neural Network, GNN)是处理图结构数据的核心工具。在金融图谱中,实体(如企业、个人、账户)构成节点,关系(如担保、交易、控股)构成边。GNN 通过聚合邻居信息来更新节点表示,从而捕捉复杂的拓扑依赖关系。本节将系统讲解 GNN 的核心思想、消息传递机制以及三种主流聚合函数的差异。

3.1 GNN 核心思想:从节点到图的表示学习

传统深度学习模型(如 CNN、RNN)处理的是欧几里得数据(图像、序列),而图数据是非欧几里得结构,节点之间没有固定的空间顺序。GNN 的核心思想是:每个节点的表示由其自身特征和邻居节点的特征共同决定,通过迭代的“消息传递”过程,节点能够逐步捕获其 k 阶邻域的结构信息。

在金融风控场景中,这一思想对应着“风险传染”逻辑:一个企业的违约风险不仅取决于自身财务指标,还受到其担保方、关联交易对手的信用状况影响。GNN 通过多层消息传递,将这种关联风险编码到节点嵌入中。

关键概念: GNN 的目标是学习一个映射函数 f,将图结构 G=(V, E) 和节点初始特征 X 映射到节点嵌入 Z,使得嵌入空间中的距离反映图结构中的相似性或风险传播路径。
GNN 消息传递与节点更新流程 GNN 消息传递与节点更新流程 初始图 G 节点特征 X 邻接矩阵 A 消息传递层 1. 邻居消息生成 2. 消息聚合 3. 节点更新 节点嵌入 Z 下游任务 (分类/回归/链接预测) 可堆叠 L 层 → 捕获 L 阶邻居 金融案例:担保网络 企业 A 的违约风险 通过担保边传播给 B、C

3.2 消息传递机制:GNN 的通用框架

大多数 GNN 模型(GCN、GAT、GraphSAGE 等)都可以统一到 消息传递(Message Passing) 框架下。该框架包含三个核心步骤,每层迭代执行:

  1. 消息生成(Message): 对于每条边 (u, v),根据源节点 u 的特征和目标节点 v 的特征,生成一个消息向量 muv。
  2. 消息聚合(Aggregate): 将目标节点 v 收到的所有邻居消息进行聚合,得到聚合向量 av。
  3. 节点更新(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 是边特征(如担保金额、持股比例)。在金融图谱中,消息生成可以引入边权重(如担保金额越大,消息强度越高),从而让模型关注高风险关联。

实践要点: 消息传递层数 L 的选择至关重要。L=1 时节点只能看到直接邻居(一阶风险);L=2 时能看到二阶邻居(间接风险)。在金融图谱中,2~3 层通常足够捕获主要风险传播路径,过深会导致过平滑(所有节点表示趋同)。

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 对异常值敏感,适合做风险预警。
三种聚合函数对比:Mean / Max / Sum 三种聚合函数对比:Mean / Max / Sum v A 特征: 0.8 B 特征: 0.5 C 特征: 0.3 D 特征: 0.9 Mean 聚合 a_v = (0.8+0.5+0.3+0.9)/4 = 2.5 / 4 = 0.625 → 平均风险水平 忽略邻居数量差异 Max 聚合 a_v = max(0.8, 0.5, 0.3, 0.9) = 0.9 → 最大风险暴露 对异常值敏感 Sum 聚合 a_v = 0.8 + 0.5 + 0.3 + 0.9 = 2.5 → 风险累积总量 对邻居数量敏感

3.4 聚合函数选择指南与金融案例

在实际的金融风控项目中,聚合函数的选择往往不是孤立的,需要结合图谱结构特征和业务目标。以下是一些经验性建议:

常见陷阱: 在度数分布极不均匀的金融图谱中(如少数核心企业连接数百家子公司),使用 Sum 聚合会导致核心节点的嵌入值远大于边缘节点,模型可能过度关注“大节点”而忽略“小节点”的异常模式。此时可考虑 Mean 聚合或对 Sum 结果进行归一化。

下表给出了不同金融场景下的聚合函数推荐:

金融场景 图谱结构特点 推荐聚合函数 业务解释
企业信用评级 担保网络,度数差异大 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. 总风险),并通过实验验证。