图神经网络基础:从图论到消息传递
各位同学好,我是你们的讲师。今天咱们来聊聊图神经网络(GNN)的基础知识。说实话,我刚开始接触这个领域时,也觉得图论这东西挺抽象的。但后来在量化投资项目中,我发现图结构天然适合描述股票之间的关联关系——比如产业链上下游、同行业竞争、资金流向等等。嗯,搞懂了这些,你就能理解为什么GNN在行业轮动策略里这么有用了。
图论入门:什么是图?
图,说白了就是一种数据结构。它由两部分组成:节点和边。你可以把节点想象成一个个实体,边就是实体之间的连接关系。
举个例子,在股票市场里:
- 节点:每只股票就是一个节点
- 边:两只股票之间的相关性、资金流向、产业链关系等
我个人习惯把图分成两类:
- 有向图:边有方向,比如资金从A流向B
- 无向图:边没有方向,比如A和B的相关性
还有一种叫加权图,每条边带一个权重值。比如两只股票的相关系数0.8,这个0.8就是边的权重。我在做行业轮动策略时,经常用加权图来表示股票之间的联动强度。
节点与边:图的基本单元
咱们深入一点。节点和边不只是简单的点和线,它们可以携带丰富的信息。
节点特征:每个节点可以有一个特征向量。比如对于一只股票,它的特征可以是:
- 市盈率(PE)
- 市净率(PB)
- 过去5日收益率
- 成交量变化率
边特征:每条边也可以有特征。比如:
- 相关系数(0到1之间的值)
- 行业归属(同行业为1,不同行业为0)
- 供应链距离(1表示直接上下游,2表示间接)
重点来了:在GNN中,节点和边的特征都是可以学习的。模型会通过训练自动调整这些特征的表示方式。这一点和传统方法完全不同——传统方法需要你手动设计特征,而GNN能自动从图结构中提取有用信息。
邻接矩阵:图的数学表示
计算机怎么理解图?靠的就是邻接矩阵。这是一个N×N的矩阵,N是节点数量。如果节点i和节点j之间有边,那么A[i][j] = 1,否则为0。
来看个简单的例子。假设我们有3只股票:茅台、五粮液、宁德时代。它们之间的关联关系如下:
- 茅台和五粮液:同属白酒行业,有强关联
- 茅台和宁德时代:不同行业,无直接关联
- 五粮液和宁德时代:不同行业,无直接关联
对应的邻接矩阵就是:
# 3只股票的邻接矩阵
# 茅台 五粮液 宁德时代
A = [
[0, 1, 0], # 茅台
[1, 0, 0], # 五粮液
[0, 0, 0] # 宁德时代
]
注意看,对角线都是0,因为节点不和自身相连。矩阵是对称的,因为这是无向图。
小技巧:在实际项目中,我经常用稀疏矩阵来存储邻接矩阵。因为股票数量可能上千,但每只股票真正有强关联的股票可能只有几十只。用稀疏矩阵能节省大量内存。PyTorch Geometric和DGL都支持稀疏矩阵操作,效率很高。
GNN的核心思想:消息传递
好了,终于到了最核心的部分。GNN到底是怎么工作的?一句话概括:消息传递。
消息传递的过程,你可以想象成一个「邻居串门」的过程:
- 收集消息:每个节点从它的邻居那里收集信息
- 聚合消息:把收集到的信息整合起来(比如求和、取平均)
- 更新节点:用聚合后的信息更新当前节点的状态
这个过程会重复多次。每重复一次,节点就能看到更远范围的邻居信息。第一次迭代只能看到直接邻居,第二次迭代能看到邻居的邻居,以此类推。
我曾经在项目中遇到过一个问题:消息传递的轮数太多会导致过平滑——所有节点的特征变得差不多,失去了区分度。嗯,这个坑我踩过,后来通过调整层数和加入残差连接解决了。
消息传递的数学表达
虽然咱们是实战课程,但基本的数学公式还是要懂的。消息传递可以写成:
h_v^(k+1) = UPDATE(h_v^(k), AGGREGATE({h_u^(k) for u in N(v)}))
其中:
h_v^(k):节点v在第k层的特征N(v):节点v的所有邻居AGGREGATE:聚合函数,比如求和、取平均、取最大值UPDATE:更新函数,通常是一个神经网络层
说白了,就是每个节点先看看邻居们都在干啥,然后把邻居的信息汇总一下,最后结合自己的信息更新一下状态。
为什么消息传递这么重要? 因为它让图上的信息能够流动起来。在行业轮动策略中,一只股票的涨跌会通过消息传递影响到它的邻居股票,进而影响整个行业板块。GNN能自动学习这种传导机制,比传统的时间序列模型强太多了。
知识体系总览
下面我用一张SVG图来总结本章的核心内容。这张图展示了从图论基础到GNN核心思想的完整脉络。
避坑指南
我曾经踩过的坑,你们别踩了:
- 图太大怎么办? 别想着把所有股票都塞进一个图里。我建议按行业分组,每个行业建一个子图,或者用采样技术只取部分邻居。
- 边权重要归一化 如果不归一化,度数高的节点(比如茅台这种被大量基金持有的股票)会主导消息传递,导致模型偏差。
- 注意图的动态性 股票之间的关联关系是随时间变化的。今天茅台和五粮液高度相关,明天可能就变了。所以要用动态图或者时间窗口切片。
小结
这一章我们讲了图论的基础概念,包括节点、边、邻接矩阵。然后深入到了GNN的核心——消息传递机制。你想想看,消息传递其实就是一个「邻居串门、信息共享」的过程,并不复杂。
下一章我们会动手实现一个简单的图神经网络,用Python代码跑通消息传递的全流程。到时候你会看到,这些抽象的概念变成代码后,其实挺直观的。