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,加了自环的邻接矩阵
  • 是Â的度矩阵
  • H^(l) 是第l层的节点特征
  • W^(l) 是可学习的权重矩阵
  • σ 是激活函数,比如ReLU

你可能会问:“为什么要搞个D̂^(-1/2)?” 这是为了归一化,防止那些度数高的节点(比如茅台这种被很多基金持有的股票)把特征值撑得太大。

我的经验:GCN在行业轮动里表现还不错,尤其是当行业之间的关联比较稳定的时候。但我遇到过一个问题——GCN对所有邻居一视同仁,不会区分“这个邻居更重要”还是“那个邻居不太重要”。这在某些场景下会丢失信息。

4.2 GAT:图注意力网络,给邻居加个权重

GAT,Graph Attention Network,2018年由Velickovic等人提出。它解决了GCN的一个痛点:邻居的重要性不一样

你想想看,在行业轮动里,银行股和地产股的关系,跟银行股和医药股的关系,能一样吗?显然不能。GAT就是通过注意力机制,给每个邻居分配一个权重。

GAT的核心步骤:

  1. 计算节点i和邻居节点j之间的注意力系数 e_ij
  2. 用softmax归一化得到 α_ij
  3. 用 α_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 知识体系总览

下面这张图,我把三个模型的核心逻辑画出来了,方便你对比理解:

GNN三大模型核心逻辑对比 GCN 图卷积网络 输入:邻接矩阵A + 特征X 归一化:D̂^(-1/2)·Â·D̂^(-1/2) 聚合:加权平均邻居特征 输出:更新后的节点特征 特点:所有邻居权重相同 GAT 图注意力网络 输入:节点特征 + 图结构 计算注意力系数 α_ij 加权聚合:α_ij * h_j 输出:注意力加权特征 特点:邻居权重可学习 GraphSAGE 采样聚合网络 输入:节点特征 + 图结构 采样:随机选k个邻居 聚合:均值/LSTM/池化 输出:采样聚合特征 特点:支持归纳学习 核心区别:GCN固定权重 → GAT学习权重 → GraphSAGE采样+聚合

嗯,这张图应该能帮你快速建立起三个模型的整体认知。GCN是基础,GAT加了注意力,GraphSAGE加了采样。它们不是互斥的,而是递进的关系。

最后说一句:模型选型没有银弹。我见过有人用GCN在行业轮动上跑出很好的收益,也见过有人用GAT反而过拟合。关键还是理解你的数据和业务场景。多试几个,找到最适合你的那个。


专注资料整理