资讯详情

资讯详情

HetSANN解读:用类型感知注意力替代元路径的异构图神经网络

最近把这篇AAAI 2020收录的《HetSANN: An Attention-based Graph Neural Network for Heterogeneous Structural Learning》翻出来重新精读了一遍越看越觉得它在异构图神经网络的发展里处于一个很有意思的卡位。既没有走HAN那套依赖元路径的路线也没有像GTN那样把元路径搜索变成可微分的结构学习而是直接用注意力机制去处理“邻居类型不同”这件事本身。如果你正在做异构图相关的研究或者对图Transformer的演进脉络感兴趣这篇文章值得花一晚上好好拆一遍。这篇解读我会从问题动机、方法设计、实验结论一路讲到复现时踩过的坑尽量把这个模型里里外外说透。1. 论文背景与问题动机1.1 异构图里“类型”这件事有多麻烦先聊一个很基础但经常被忽略的问题异构图为什么比同构图难这么多。在同构图里所有节点和边都是一种类型你分不清一个节点是论文还是作者其实没关系反正它们共享同一套特征空间和关系语义。但异构图不一样比如学术网络里有论文、作者、会议、学科方向这几种节点边也有“作者写了论文”“论文发表在会议上”“论文属于某学科”等不同含义。如果直接把这些不同类型的节点扔进同一个GCN或者GAT里模型会默认所有节点来自同一个分布这显然不合理——因为“几篇论文”和“一位学者”的特征维度、统计特性、语义角色都完全不同。早期处理方式也很朴素就是所谓“元路径”。比如“作者-论文-会议”可以构成一个元路径通过这条路径可以把作者节点和会议节点关联起来再把这些异构关系折叠成若干个同构图然后在折叠后的图上跑标准GNN。这个思路看起来合理实际操作却非常磨人。这种“折叠”其实是在损失信息一边丢失了原始边类型一边把整个图的结构压成了几条人工路径路径外面的交互关系完全进不了模型。1.2 元路径老路的一大堆问题元路径方法最头疼的不是概念是定义过程。你拿到一个异构图第一件事是想清楚哪些路径是有语义的。比如IMDB电影网络里“电影-演员”是一条有效路径“导演-电影-演员”也是一条路径但“电影-导演-演员-导演-电影”呢语义就变得很奇怪。为了覆盖主要语义关系你得不停尝试不同的路径组合每一组都要做一次数据预处理、跑一轮实验、调一轮超参。这个事在数据集小的时候还能忍一旦节点类型和边类型多起来元路径的搜索空间立刻爆炸人工枚举基本变成不可能完成的任务。更麻烦的是同一个任务下不同的节点对最优路径可能完全不同。分类一位研究者的领域用“作者-论文-会议”比“作者-论文-作者”更有区分力但在做作者间相似度计算时可能“作者-论文-作者”这种共著路径又成了主力。没有任何一条元路径能在所有情况下通用。这也催生了GTN这类尝试用梯度搜索替代人工选路径的工作但GTN的代价是额外的结构学习参数模型变得复杂训练开销也大。还有一个常常被忽略的问题是元路径一旦定义好整个模型能看到的图结构就被人为切掉了。原始异构图里那种“多条边、多种类型”“一个节点通过不同关系连接不同类别邻居”的丰富度在转换过程中已经折损了一大半。论文里的实验也显示基于元路径的方法对比不依赖元路径的方法在部分任务上表现更差这就是信息损失的直观后果。1.3 这篇文章凭什么“不绕路”直接来HetSANN的核心姿态就是我不需要把异构图转成同构图也不需要预定义任何元路径直接从原始结构出发让注意力机制自己决定哪些邻居值得学。它把“节点类型不同”这件事编码进模型参数不同的边类型对应不同的特征变换然后在这个基础上计算注意力系数、做邻居聚合。说白了它把“类型”这个离散信息变成了可学习的参数约束而不是靠路径把类型信息提前抹掉。我最初读这个动机时心里第一反应是这不就是给每种关系配一个独立的线性变换再接GAT吗听起来没有太大飞跃。但真正动手复现之后才发现事情没有表面这么简单。难点在于“边类型感知的注意力”与“多跳结构信息”的配合以及训练时面对异构子图的那种不稳定性。下文慢慢拆。2. 核心方法全景拆解2.1 类型感知的投影变换给每种关系发一张专属名片HetSANN的第一个关键组件是类型感知的线性变换。传统GAT对每个节点用同一个权重矩阵做特征映射这相当于假定所有节点的特征空间是一致的。HetSANN的做法是对不同的节点类型或边类型使用各自独立的权重矩阵。比如“作者”节点用W_a“论文”节点用W_p或者更准确地说在聚合时根据当前这组关系的类型来决定用哪套参数去变换邻居特征。这样做的直觉可以拿“多语言交流”来类比一群说不同语言的人聚在一起讨论问题如果所有人都直接用母语发言谁也不知道对方在说什么但如果先把每种语言分别翻译成英语再放到同一张会议桌上讨论语义就对齐了。类型感知投影做的就是“翻译”这一步。它把不同类型节点的高维原始特征映射到同一个公共表示空间同时保留“翻译规则因语言而异”这一信息。实现时要特别注意不同类型节点的输入特征维度往往不一样。论文节点可能有几千维的词袋向量作者节点可能是手工设计的ID特征甚至没有原始特征。所以第一步通常是用一个线性层把每种类型分别压到同一个隐藏维度d。这正是“类型感知投影”最实在的功能先把维度对齐再做后续注意力运算否则拼接或相加时维度都碰不上。2.2 边类型约束的注意力打分与归一化有了统一维度之后第二步是计算注意力。设当前中心节点是i它通过某一条边类型为φ的关系连接到邻居j那么模型先分别得到变换后的表示再拼接起来经过一个由边类型参数化的权重向量做打分再过LeakyReLU激活。最后对所有邻居的分数做softmax归一化得到每个邻居对中心节点的贡献权重。这个设计和通用GAT最大的区别在哪里在GAT里所有邻居共享同一个注意力打分函数在HetSANN里打分函数的参数依赖边类型。同一对节点如果连接关系不同打出来的分就是不同套逻辑。你可能会想“这跟把每种关系子图分别跑一个GAT再求和有什么区别”区别在于HetSANN的softmax归一化是在中心节点的所有邻居上统一进行的不管这些邻居属于哪种类型。也就是说一个电影节点同时连接演员、导演、标签三类邻居它要一起分配注意力权重而不是在演员子图里各归各归一化。这个“竞争关系”是跨类型的模型需要学会在不同类型之间权衡该看谁这正是它在异构图上比多个同构GAT叠加更灵活的原因。同样值得注意的还有自环的处理。GAT里通常会给每个节点加一条指向自身的边用来保留原始特征。HetSANN在保留残差连接的前提下自环加不加都会影响性能。我复现时把这个开关单独抽出来做了几组对比发现配合原文的多跳结构之后自环的增益并不明显但残差是刚需。2.3 残差连接与多跳感受野既要深又要稳注意力层解决了“同一条边上怎么聚合”但没有解决“信息怎么跨多跳流动”的问题。论文里明确提出只堆叠单跳注意力层还不够需要把多跳邻居的信息也带进最终表示。最朴素的做法是把网络叠深但在异构图里层数加深的边际收益很低过平滑现象来得比同构图更快——聚合几次之后节点表示趋同类别分界被磨平。论文的处理方式很巧妙使用残差和稠密连接把每一层的输出和之前若干层的输出拼起来而不是只依赖最后一层。这样一来第一层输出代表1跳邻居的语义第二层输出代表2跳邻居的语义把它们拼接后分类器可以同时看到多个尺度的结构信息。模型被迫在不同的“跳数视图”下做权衡而不是靠单一深层表示硬扛。我用一个粗浅的类比解释一下你在一个小区里找某栋楼的位置只看隔壁邻居1跳往往够了但如果隔壁邻居信息太少你还得问隔壁的隔壁2跳。只问一次可能错过关键线索把所有距离的答复都收集起来再综合判断找到的概率就大多了。HetSANN的多跳聚合干的就是这件事。2.4 联合训练分类和链路预测一起学文章里另一个容易被忽视的设计是多任务联合训练。主任务是节点分类但作者给模型加了辅助的链路预测目标从图中随机采样正边再生成一批不存在的负边把节点对表示拼接后经一个MLP打分用二分类损失约束整个模型。这个做法的意义在于分类标签通常只覆盖少数节点数据量不够时模型很容易过拟合链路预测为模型提供了全图结构上的额外监督让表示空间不至于只被标签撑起来。这种半监督无监督组合的套路现在看已经很常见但在2020年前后图神经网络的主流做法还是直接在带标签的一小撮节点上训练。HetSANN用链路预测做正则等于变相扩大了训练信号来源。对复现者来说难点在于负采样比例负边采太少模型学不到区分能力采太多正负样本失衡训练会震荡起来。论文实验里这条辅助损失的权重好像并不高但它确实让最终表示更稳。3. 实验设置与关键结论解读3.1 数据集与对比方法挑对手挑得很有讲究原文实验用到了几个公开基准数据集覆盖了论文网络和电影网络。DBLP学术网络包含作者、论文、会议、研究方向等节点IMDB电影网络则包含电影、演员、导演这样的类型组合。这两种图的规模不算特别大但类型和边关系足够复杂很适合验证“不做元路径”到底行不行。对比方法选得也比较全既有DeepWalk这类无视类型的网络嵌入方法也有metapath2vec这样经典元路径类方法还有HAN、GTN、HetGNN这些异构图GNN代表。此外作者还放了GCN、GAT这种通用GNN作为参照。这个对比矩阵的好处是能区分“改进来自异构图建模”还是“改进来自注意力机制本身”。如果对手全是没有注意力的模型那赢下来也可能是GAT的功劳说不清楚。3.2 主实验结果不靠元路径也能赢主实验在节点分类任务上比较Micro-F1和Macro-F1两个指标。整体结论非常明确HetSANN在大多数数据集和指标上超过或者追平了当时最好的异构图模型而且全程没有使用任何预定义元路径。尤其值得关注的是Macro-F1上的表现因为类别分布往往不均衡Macro-F1更看重少数类的预测能力这说明模型学到的不只是头部类别的模式。另一个让我印象深刻的点是它对比基于元路径的模型不落下风训练效率还高。元路径方法在预处理阶段要花大量时间构造路径实例推理阶段路径选择本身也影响结果。HetSANN省去了这个环节等于把“定义路径”这件事彻底移出流程。这对实际工程场景非常友好也是论文在后来频繁被引用的原因之一。3.3 消融与效率分析残差到底帮了多少消融实验是这篇论文中最有价值的部分之一。作者验证了去掉类型感知变换、去掉多跳残差结构后的性能变化。结论是这两个组件都不是锦上添花而是缺一不可。特别是残差/稠密连接去掉后多层注意力堆叠会出现明显的性能回落印证了异构图中“叠深即退化”的现象。效率方面由于不依赖元路径模型在训练时间上也有优势。我在复现时其实对这一点感触更深处理元路径的数据预处理比训练本身还耗时而且每次换数据集或者换路径定义都要重新跑一遍预处理。HetSANN的预处理基本就是图加载和类型映射一个晚上就能把实验流程跑通。4. 从论文到代码复现要点与踩坑记录4.1 输入特征与维度统一怎么做复现第一步是先处理数据类型。异构图里每个节点类型的特征维度不同比如论文节点有文本特征作者节点可能只有ID。这要求先为每个类型训练一个专属线性投影输入原始维度输出统一维度然后把这个投影放在GNN层之前。一个很容易踩的坑是有些节点类型在原始数据里没有特征所有节点都是同一维度的one-hot。此时类型感知投影退化成每种类型各学一个线性层这本身没问题但如果隐藏维度设得过大而训练样本有限这部分投影很容易过拟合。我当时把隐藏维度从64调成32发现Macro-F1反而涨了就是因为投影参数量降下来之后模型把注意力集中在更有区分性的结构信息上。4.2 类型感知投影的工程实现工程上我建议把“类型投影”和“注意力层”拆成两个模块分别实现方便调试。类型投影的输入是节点数量原始特征维度输出是节点数量隐藏维度。按类型编号分组做矩阵乘法然后把结果拼回一个张量。实现注意力的部分有个常见误区不少人会直接调用现成GAT层再把不同边类型的邻接矩阵挨个传进去。这样确实能跑但softmax归一化是分开做的和论文里“跨类型统一归一化”的语义不一致。正确的做法是把所有边类型聚合在一个大邻接矩阵上跑稀疏注意力或者在循环里分别算消息但共享一份对数赔率最后统一softmax。我第一次实现时贪省事分开归一化结果收敛慢且不稳定改成统一归一化之后才恢复论文里的表现。4.3 注意力归一化的几个坑另一个坑在数值层面。稀疏矩阵的softmax如果自己写需要按行减去最大值防止指数溢出。在异构图里行长度差异很大有的中心节点有几百个邻居有的节点只有两三个。把大度数节点和小度数节点放在同一批训练注意力分布天然不同。复现时如果出现某些节点梯度突变建议先检查LeakyReLU的斜率原文设置是0.2太低会让注意力分数趋于饱和。我还试过给注意力分数加温度系数来调节分布的陡峭程度在小数据集上有一点帮助但数据集大了以后作用变弱。这类技巧可以直接当超参调不用太纠结。4.4 训练技巧与超参建议训练方面全图训练最简单但显存压力大。如果图规模被撑大建议用邻居采样或者按子图切分训练但要注意切分时别把异构边类型彻底打散每组子图尽量保留各种关系类型否则类型感知投影会退化。超参上我复用下来比较稳的组合是dropout在0.3左右学习率3e-3隐藏层维度64到128注意力头数4。很多人习惯堆3层GNN但在这个模型里我觉得2层加多跳稠密连接更稳。链路预测的负采样比我试过1:1到1:5最终1:2附近效果不错负采样太多会把模型注意力往假边方向带。还有一点是初始化。类型感知投影的权重如果全用默认正态初始化收敛会慢。我习惯给投影层做Xavier初始化并且为不同边类型设置不同seed扰动避免多条关系类型初始时过于对称导致注意力学到相同模式。5. 学术脉络从GAT到HetSANN再到图Transformer5.1 GAT、HAN和GTN在干什么要真正读懂HetSANN的价值得把它放回2019-2020年的上下文里。GAT证明注意力机制在图节点聚合上的有效性但它不区分边类型。HAN引入了两层注意力一层学同类型路径内部的节点权重一层学多条元路径之间的权重但整体还是以元路径为骨架。GTN尝试动态学习元路径的组合理论上更自由但可控性和实现复杂度都是成本。这些工作放在一起看其实有一条清晰的升级曲线从“手工定义语义”到“半自动化语义搜索”再到HetSANN的“边类型原生编码”。HetSANN没有在路径空间里绕来绕去而是直接告诉模型“这里的邻居有多种类型请自己看着办”算是一次简化也是一次转向。5.2 HetSANN设计里的“Transformer影子”现在回看HetSANN的设计会发现它和图Transformer的思路高度神似。Transformer本质上是让每个token对所有token做注意力位置编码负责注入顺序信息HetSANN让中心节点对跨类型邻居做注意力边类型编码负责注入关系信息。区别在于Transformer用位置编码HetSANN用类型感知投影。后来的异构图Transformer类方法基本都是沿着“注意力 类型编码 相对结构编码”这个路线走。说HetSANN是异构图上的早期Transformer雏形一点都不夸张。5.3 对后续工作的影响从引文网络看HetSANN被不少后续工作当作“无需元路径的注意力基线”来对比同时它也启发了不同类型编码方式在注意力模型里的应用。它的一个隐含贡献是提醒社区异构图里的“类型”不一定非得通过路径转换来消化直接建模到注意力打分函数里是一种更干净的做法。如果你现在要设计一个异构图模型面对“用不用元路径”这个问题时这篇论文的决策过程能给你提供一个很好的参考坐标。元路径不是不能用的工具但把它当默认选项可能在出发之前就已经丢了一部分结构信息。这篇论文我前前后后精读加复现下来最大的收获不是模型本身多强而是它让我重新理解了“类型感知”这四个字的重量。你不需要为每一种关系精心设计一条路径来告诉模型“这很重要”只要给模型足够的表达能力它自己能从数据里判断什么时候该看演员什么时候该看导演。我们做模型的人很多时候过度依赖人工先验忘记了把决定权还给数据和训练过程。这个道理在异构图里成立在很多NLP任务里其实也成立。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →