2. 图神经网络基础:图的基本概念、表示方法与GNN发展简史
在反欺诈场景中,交易网络、社交关系、设备指纹天然构成图结构。团伙欺诈的“抱团”特性使得传统表格型特征难以捕捉群体行为模式,而图神经网络(GNN)正是为这类非欧几里得数据设计的深度学习范式。本节从图的基本概念出发,逐步过渡到GNN的核心思想与发展脉络。
2.1 图的基本概念
图(Graph)由节点(Node/Vertex)和边(Edge)组成,记为 \( G = (V, E) \)。在反欺诈场景中:
- 节点:用户、设备、手机号、银行卡、IP地址等实体。
- 边:交易关系、登录关系、通话关系、设备指纹关联等。
- 邻接矩阵(Adjacency Matrix):\( A \in \mathbb{R}^{n \times n} \),若节点 \( i \) 与节点 \( j \) 相连,则 \( A_{ij} = 1 \)(无权图)或权重值(有权图)。
反欺诈视角: 团伙欺诈中,节点间存在密集的“共设备”“共IP”“共联系人”边,形成高连通子图。邻接矩阵的稀疏性(真实网络通常 < 1% 非零元素)是设计高效GNN采样策略的关键。
| 概念 | 符号 | 反欺诈示例 |
|---|---|---|
| 节点集合 | \( V \) | 100万用户 + 50万设备 |
| 边集合 | \( E \) | 交易对、设备登录记录 |
| 邻接矩阵 | \( A \) | 150万×150万稀疏矩阵 |
| 节点特征 | \( X \) | 交易频次、注册时长、设备型号 |
| 度(Degree) | \( d_i \) | 某用户关联的设备数 |
2.2 图的表示方法
图的存储与计算需要高效的表示方法。以下是三种主流方式:
- 邻接矩阵:直观但存储 \( O(n^2) \),适合稠密图或小规模图。
- 邻接表(Adjacency List):每个节点存储其邻居列表,存储 \( O(|V| + |E|) \),工业级图框架(如DGL、PyG)默认采用。
- 边列表(Edge List):三元组 \( (u, v, w) \) 形式,适合分布式存储与ETL管道。
实战建议: 在反欺诈场景中,邻接矩阵几乎不可用(百万级节点导致内存爆炸)。GraphSAGE等归纳式方法依赖邻接表采样,这也是本课程选择GraphSAGE作为核心模型的原因之一。
# 使用NetworkX构建简单图(反欺诈示例)
import networkx as nx
G = nx.Graph()
# 添加节点:用户和设备
G.add_node("user_001", type="user", risk_score=0.3)
G.add_node("device_A", type="device", os="Android")
# 添加边:登录关系
G.add_edge("user_001", "device_A", relation="login", timestamp=1700000000)
# 获取邻接表
print(list(G.adjacency()))
2.3 图神经网络(GNN)发展简史
GNN的发展经历了从递归/循环模型到消息传递范式的跃迁,以下为关键里程碑:
| 年份 | 模型/工作 | 核心贡献 | 反欺诈关联 |
|---|---|---|---|
| 2005 | GNN(Scarselli et al.) | 首次将神经网络扩展到图结构,递归聚合邻居信息 | 理论奠基,但计算效率低 |
| 2013 | DeepWalk | 随机游走 + Skip-gram,生成节点嵌入 | 早期团伙检测方法 |
| 2016 | GCN(Kipf & Welling) | 谱域图卷积,一阶近似简化计算 | 半监督节点分类,可识别已知团伙 |
| 2017 | GraphSAGE(Hamilton et al.) | 归纳式学习,采样邻居聚合,支持大规模图 | 本课程核心模型,适合动态新增节点 |
| 2017 | GAT(Veličković et al.) | 注意力机制,为不同邻居分配权重 | 可解释性增强,识别关键欺诈关联 |
| 2018+ | GIN / MPNN / 异构图GNN | 消息传递框架统一化,支持异构边与属性 | 适配多类型节点(用户/设备/卡) |
模型选择陷阱: GCN是直推式(Transductive),无法泛化到未见节点;GraphSAGE是归纳式(Inductive),适合反欺诈中每天新增用户/设备的场景。本课程选择GraphSAGE正是基于这一关键差异。
2.4 消息传递范式:GNN的通用框架
现代GNN(包括GraphSAGE)遵循消息传递(Message Passing)范式,每层包含三个步骤:
- 消息构建(Message):每个邻居节点 \( v \) 的特征 \( h_v^{(l)} \) 通过变换函数生成消息 \( m_{v \to u} \)。
- 消息聚合(Aggregate):对节点 \( u \) 的所有邻居消息进行聚合(求和、均值、最大值、LSTM等)。
- 节点更新(Update):将聚合结果与节点自身特征结合,通过非线性变换得到新特征 \( h_u^{(l+1)} \)。
反欺诈关键点: 聚合函数的选择直接影响团伙检测能力。均值聚合对“少数派”异常邻居不敏感;最大值聚合能捕捉极端行为(如某个设备关联大量用户);GraphSAGE的LSTM聚合对序列化交互(如时间窗口内的交易链)有天然优势。
# 消息传递伪代码(GraphSAGE风格)
def graphsage_layer(node_features, adjacency_list, weights, aggregator):
"""
node_features: 当前层所有节点特征 [n_nodes, feat_dim]
adjacency_list: 邻接表 {node_id: [neighbor_ids]}
"""
new_features = []
for node in range(len(node_features)):
# 1. 采样邻居(GraphSAGE核心)
neighbors = sample_neighbors(adjacency_list[node], num_samples=10)
# 2. 构建邻居消息
neighbor_msgs = [node_features[n] for n in neighbors]
# 3. 聚合邻居消息
agg_msg = aggregator(neighbor_msgs) # 均值/最大值/LSTM
# 4. 拼接自身特征并更新
combined = tf.concat([node_features[node], agg_msg], axis=-1)
new_feat = tf.nn.relu(tf.matmul(combined, weights))
new_features.append(new_feat)
return tf.stack(new_features)