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 图的表示方法

图的存储与计算需要高效的表示方法。以下是三种主流方式:

  1. 邻接矩阵:直观但存储 \( O(n^2) \),适合稠密图或小规模图。
  2. 邻接表(Adjacency List):每个节点存储其邻居列表,存储 \( O(|V| + |E|) \),工业级图框架(如DGL、PyG)默认采用。
  3. 边列表(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()))
图的基本概念与表示方法 图结构示例(反欺诈网络) 用户A 设备X 用户B 设备Y 用户C 三种表示方法对比 邻接矩阵 5×5 稀疏矩阵 存储 O(n²) 邻接表 {A: [X, B], B: [Y]} 存储 O(|V|+|E|) 边列表 (A,X), (A,B), (B,Y) 适合分布式ETL ★ 推荐 GraphSAGE采样 基于邻接表

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正是基于这一关键差异。
GNN发展简史:从递归到消息传递 2005 GNN 递归聚合 2013 DeepWalk 随机游走 2016 GCN 谱域卷积 2017 GraphSAGE 归纳式采样 2017 GAT 注意力机制 2018+ MPNN/GIN 消息传递框架 本课程聚焦 GraphSAGE(紫色高亮),因其归纳式学习特性最适合反欺诈动态图场景

2.4 消息传递范式:GNN的通用框架

现代GNN(包括GraphSAGE)遵循消息传递(Message Passing)范式,每层包含三个步骤:

  1. 消息构建(Message):每个邻居节点 \( v \) 的特征 \( h_v^{(l)} \) 通过变换函数生成消息 \( m_{v \to u} \)。
  2. 消息聚合(Aggregate):对节点 \( u \) 的所有邻居消息进行聚合(求和、均值、最大值、LSTM等)。
  3. 节点更新(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)