3. 图神经网络入门
在交易团伙识别任务中,账户、设备、IP、银行卡天然构成一张关系网络。传统模型把每个样本当作独立个体,而图神经网络(GNN)的核心价值在于:让每个节点在表示学习过程中吸收邻居信息,从而捕捉团伙的“抱团”模式。本节从图的基本概念出发,逐步过渡到GCN、GAT、GraphSAGE三类经典模型的核心思想。
一、图的基本概念与交易场景映射
图由节点集合 V 和边集合 E 构成,记为 G=(V,E)。在交易风控中,节点可以是账户、商户、设备指纹或IP;边可以表示转账、共用设备、同IP登录等关系。边可以带方向(有向图)和权重(加权图),也可以附带时间戳形成时序图。
描述图结构常用的三个要素:
- 邻接矩阵 A:A[i][j]=1 表示节点 i 与 j 相连,是GNN聚合操作的直接输入。
- 度矩阵 D:对角矩阵,D[i][i] 为节点 i 的度,用于归一化,防止高度节点主导聚合结果。
- 节点特征矩阵 X:每一行是一个节点的属性向量,例如账户的交易频次、金额均值、注册时长等。
交易团伙识别中,一个典型子图可能是:多个账户共用同一设备,彼此之间存在小额高频转账,并最终汇聚到同一收款账户。这种结构在邻接矩阵上表现为局部稠密簇,正是GNN擅长捕捉的信号。
二、图表示学习与消息传递范式
图表示学习的目标是为每个节点学习一个低维向量 h,使得结构相近或行为相似的节点在向量空间中距离更近。现代GNN普遍采用消息传递范式,可拆解为三步:
- 消息生成:每个邻居节点根据自身特征和边信息生成一条消息。
- 消息聚合:目标节点用某种置换不变函数(求和、均值、最大值)汇总邻居消息。
- 特征更新:将聚合结果与自身上一轮表示结合,经线性变换和非线性激活得到新表示。
用公式概括第 k 层更新:hv(k) = σ( W · AGG({hu(k-1) : u ∈ N(v)}) )。堆叠 K 层后,节点可感知 K 跳邻居,相当于把团伙的局部结构逐步编码进向量。
三、GCN、GAT、GraphSAGE核心思想对比
三类模型都遵循消息传递框架,差异集中在“如何聚合”和“聚合谁”。
| 模型 | 聚合方式 | 核心特点 | 交易团伙识别适用点 |
|---|---|---|---|
| GCN | 对称归一化邻接矩阵加权求和 | 谱域近似,权重由度决定,与特征无关 | 结构稳定、关系同质的转账网络 |
| GAT | 注意力加权求和 | 为不同邻居学习不同权重,可解释性强 | 需要区分强关联与弱关联的混合关系图 |
| GraphSAGE | 采样邻居后聚合(均值/池化/LSTM) | 归纳式学习,支持新节点,可扩展性好 | 每日新增账户、动态扩图的线上场景 |
GCN 的传播规则可写为 H(k) = σ( D-1/2 A D-1/2 H(k-1) W(k) )。它把归一化邻接矩阵当作固定的聚合权重,实现简单、训练稳定,但无法区分邻居重要性。
GAT 引入注意力系数 αij,让节点 i 对邻居 j 的权重由两者特征共同决定。这样,共用设备且金额异常高的邻居会获得更高权重,模型可输出注意力分布辅助人工复核。
GraphSAGE 不依赖全图邻接矩阵,而是对每个节点固定采样若干邻居再聚合,因此能泛化到训练时未见过的节点。对于每天都有新账户入网的交易系统,这一归纳能力至关重要。
四、实战片段:用PyTorch Geometric搭建两层GCN
下面代码展示如何用PyTorch Geometric定义一个两层GCN,用于节点二分类(正常/可疑)。
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GCN(torch.nn.Module):
def __init__(self, in_dim, hidden_dim, out_dim):
super().__init__()
self.conv1 = GCNConv(in_dim, hidden_dim)
self.conv2 = GCNConv(hidden_dim, out_dim)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, p=0.5, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
# edge_index 形状为 [2, E],每列是一条边的 (源, 目标)
model = GCN(in_dim=16, hidden_dim=64, out_dim=2)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
训练时通常只对带标签节点计算损失,但消息传递会用到全图结构,因此属于半监督学习。若图规模过大,可先用GraphSAGE式邻居采样构建mini-batch。
五、常见误区与复盘
- 误区一:层数越多越好。 层数增加会带来过平滑,所有节点表示趋同,团伙与正常账户难以区分。交易图通常2~3层足够。
- 误区二:忽略边方向与时间。 把有向转账当作无向边,会丢失资金流向信息,导致团伙头目与底层账户无法区分。
- 误区三:直接在全图上训练不采样。 百万级节点会导致显存爆炸,应使用邻居采样或子图批训练。
- 误区四:只看节点分类精度。 团伙识别更关注召回率和团伙整体命中,需结合连通分量或社区发现做后处理。
理解图的基本结构、消息传递机制以及GCN、GAT、GraphSAGE的聚合差异,是后续构建时序图神经网络的基础。在交易团伙识别中,选择哪种模型取决于关系同质性、图动态性和线上扩展需求,而非盲目追求复杂结构。