4. GNN模型详解:GCN、GAT、GraphSAGE的原理与区别,我该选哪个?
好,咱们进入正题。前面几章我们把图神经网络的基础打牢了,也聊了行业轮动为什么需要图。今天这一章,我打算把三个最主流的GNN模型——GCN、GAT、GraphSAGE——掰开揉碎了讲清楚。
说实话,我刚开始接触GNN的时候,也被这三个名字搞得有点晕。GCN、GAT、GraphSAGE,到底有什么区别?做行业轮动该用哪个?别急,咱们一个一个来拆解。
4.1 GCN:图卷积网络,最朴素的邻居聚合
GCN,全称Graph Convolutional Network,是图神经网络里最经典的模型。2017年由Kipf和Welling提出,可以说是GNN界的“Hello World”。
它的核心思想很简单:每个节点的特征,由它自己和邻居节点的特征加权平均得到。嗯,说白了就是“近朱者赤,近墨者黑”。
GCN的更新公式长这样:
H^(l+1) = σ( D̂^(-1/2) · Â · D̂^(-1/2) · H^(l) · W^(l) )
其中:
- Â = A + I,加了自环的邻接矩阵
- D̂ 是Â的度矩阵
- H^(l) 是第l层的节点特征
- W^(l) 是可学习的权重矩阵
- σ 是激活函数,比如ReLU
你可能会问:“为什么要搞个D̂^(-1/2)?” 这是为了归一化,防止那些度数高的节点(比如茅台这种被很多基金持有的股票)把特征值撑得太大。
我的经验:GCN在行业轮动里表现还不错,尤其是当行业之间的关联比较稳定的时候。但我遇到过一个问题——GCN对所有邻居一视同仁,不会区分“这个邻居更重要”还是“那个邻居不太重要”。这在某些场景下会丢失信息。
4.2 GAT:图注意力网络,给邻居加个权重
GAT,Graph Attention Network,2018年由Velickovic等人提出。它解决了GCN的一个痛点:邻居的重要性不一样。
你想想看,在行业轮动里,银行股和地产股的关系,跟银行股和医药股的关系,能一样吗?显然不能。GAT就是通过注意力机制,给每个邻居分配一个权重。
GAT的核心步骤:
- 计算节点i和邻居节点j之间的注意力系数 e_ij
- 用softmax归一化得到 α_ij
- 用 α_ij 加权聚合邻居特征
公式长这样:
α_ij = softmax( LeakyReLU( a^T · [W·h_i || W·h_j] ) )
其中 || 表示拼接操作,a 是注意力向量,W 是权重矩阵。
避坑指南:我曾经在GAT里踩过一个坑——多头注意力设太多,导致模型过拟合。在行业轮动这种数据量不大的场景下,我建议头数设2-4个就够了,别贪多。
GAT的好处是灵活。它能学到“哪些行业之间关联更强”,这在动态变化的A股市场里特别有用。比如2020年疫情刚爆发时,医药和在线办公的关联突然变强,GAT能捕捉到这种变化。
4.3 GraphSAGE:面向大规模图的采样聚合
GraphSAGE,全称Graph Sample and Aggregation,2017年由Hamilton等人提出。它的名字已经说明了核心思想:采样 + 聚合。
GCN和GAT都需要知道整个图的结构,这在图特别大的时候(比如全A股5000多只股票)会非常慢。GraphSAGE的做法是:
- 对每个节点,随机采样固定数量的邻居
- 用聚合函数(比如均值、LSTM、池化)把邻居特征聚合起来
- 更新当前节点的特征
它的更新公式:
h_v^(k) = σ( W · MEAN( { h_v^(k-1) } ∪ { h_u^(k-1), ∀u ∈ N(v) } ) )
这里N(v)是采样后的邻居集合,MEAN是均值聚合函数。
注意:GraphSAGE的采样数量是个超参数。设太小了信息不够,设太大了又失去了采样的意义。我一般设成10-20,具体要看你的图有多大。
GraphSAGE还有一个好处:它支持归纳学习。什么意思?就是训练好的模型可以泛化到没见过的节点上。这在行业轮动里很有用——比如新股上市,你不需要重新训练模型,直接用GraphSAGE就能给它生成特征。
4.4 三个模型的对比:一张表说清楚
| 特性 | GCN | GAT | GraphSAGE |
|---|---|---|---|
| 邻居权重 | 固定(度归一化) | 可学习(注意力) | 固定(均值/池化) |
| 计算效率 | 高(全图计算) | 中等(注意力计算) | 高(采样后计算) |
| 适用图规模 | 中小规模 | 中小规模 | 大规模 |
| 归纳学习 | 不支持 | 不支持 | 支持 |
| 动态图适应 | 弱 | 强 | 中等 |
| 行业轮动适用性 | 基础场景 | 动态关联场景 | 大规模/新股场景 |
4.5 我该选哪个?实战建议
这个问题没有标准答案,但我可以给你一些实战中的判断依据:
- 选GCN的情况:你的图规模不大(几百个节点以内),行业关联比较稳定,想快速搭一个基线模型。GCN是最快的选择。
- 选GAT的情况:你相信行业之间的关联是动态变化的,或者你想让模型自己学会“哪些行业更重要”。我个人在行业轮动里最常用GAT,效果确实比GCN好一截。
- 选GraphSAGE的情况:你的图很大(几千上万个节点),或者你需要处理新出现的股票/行业。GraphSAGE的采样机制和归纳学习能力是它的杀手锏。
我的建议:如果你刚开始做行业轮动,先用GCN跑通流程,再换成GAT看看效果提升。如果数据量太大跑不动,再考虑GraphSAGE。别一上来就搞最复杂的模型,先跑通再说。
4.6 知识体系总览
下面这张图,我把三个模型的核心逻辑画出来了,方便你对比理解:
嗯,这张图应该能帮你快速建立起三个模型的整体认知。GCN是基础,GAT加了注意力,GraphSAGE加了采样。它们不是互斥的,而是递进的关系。
最后说一句:模型选型没有银弹。我见过有人用GCN在行业轮动上跑出很好的收益,也见过有人用GAT反而过拟合。关键还是理解你的数据和业务场景。多试几个,找到最适合你的那个。