首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
KGAT解析:知识图谱与图注意力网络驱动的推荐系统
📅 2026/10/2 13:22:19
✍️ 爱科研究院
👁 阅读 3,247
刚把 KGAT 这篇论文啃完趁着热乎劲儿还没散赶紧把笔记整理出来。这算是知识图谱推荐方向绕不开的一篇工作KDD 2019浙江大学向萌哲他们做的。如果你在关注推荐系统怎么解决冷启动、稀疏性问题或者想弄清楚知识图谱的信息到底怎么和用户行为融合这篇论文值得仔细读一读。先说一个总的感受KGAT 这个模型核心思想并不复杂但它把事情做得很完整——从嵌入表示、高阶关系建模到可解释性都有比较妥帖的落地方式。而且这篇论文在思路上是递进的它不是凭空造一个模型而是先分析已有方法的不足然后顺着逻辑一步步补完读起来思路非常顺。我整理了一下自己的阅读笔记和复现过程中踩过的坑放在下面。1. 它解决了什么问题先说清楚背景再谈模型1.1 协同过滤的瓶颈在哪里传统协同过滤Collaborative Filtering简称 CF靠的是用户-物品交互矩阵核心假设是历史行为相似的用户未来偏好也相似。这个思路在数据稠密的时候表现不错但现实中绝大多数场景用户交互的物品数量非常有限矩阵稀疏度经常在 99% 以上。交互数据一旦稀疏CF 的“共现”信号就捉襟见肘推荐质量明显下滑。为了解决稀疏性问题后来研究者想到了用辅助信息side information来补充用户和物品的表示。知识图谱就是其中一种非常自然的辅助信息——它把物品的属性、品类、关联实体和关系都结构化地组织起来。比如一部电影在知识图谱里可能关联着导演、主演、类型、获奖信息、同系列作品等。这些额外的连接关系能够在用户-物品交互之外提供更多可供模型学习的信号。1.2 知识图谱嵌入KGE方法的局限顺着这个思路早期工作直接套用知识图谱嵌入方法Knowledge Graph Embedding简称 KGE代表工作有 CKE、DKN 等。它们的方式很直接把图谱里的实体和关系嵌入到向量空间然后用这些向量增强物品或用户的表示。但这类方法有一个明显问题知识图谱嵌入和推荐任务的优化目标是割裂的。具体来说KGE 的优化目标通常是让嵌入表示能够还原图谱中的结构化事实比如 TransE 要求头实体向量加关系向量约等于尾实体向量。这个目标本身和“用户会不会点击这个物品”并没有直接关系。结果就是模型学到了不错的图谱表示但表示的质量并不一定对推荐效果有正向帮助。我复现 CKE 的时候这种感觉特别明显——图谱嵌入部分和协同过滤部分像是两个独立模块硬拼在一起整个模型训练完图谱信息对推荐的贡献其实相当有限。1.3 端到端学习的优势所在KGAT 的核心洞察在于应该把知识图谱的信息融合过程放到推荐任务的监督信号下进行端到端优化。它提出了一种图注意力网络结构让图谱中的信息传播过程和用户-物品交互建模在同一框架内共同学习。这样做的好处是图谱中的高阶关系能够按照对推荐目标有益的方式被选择性利用。比如同样是“同一个导演”这个关系对于喜欢文艺片的用户可能是强信号对于只爱看商业大片的用户可能就不那么重要。模型可以通过学习自动区分不同关系在不同上下文中的权重。另外一个重要优势是可解释性。因为 KGAT 在传播过程中用到了图谱中真实存在的路径user-item-entity-...所以推荐结果可以通过这些路径来解释——比如“因为你喜欢《星际穿越》而这部电影和你曾经看过的《盗梦空间》有同一个导演诺兰所以我们推荐了《敦刻尔克》”。这种解释方式比单纯基于向量相似度的推荐要直观得多。2. 核心机制拆解三个关键设计值得细细品味2.1 从用户-物品二部图到协作知识图CKGKGAT 首先做的事情是把用户-物品交互图二部图和知识图谱统一起来构建一个叫做协作知识图Collaborative Knowledge Graph简称 CKG的异构图。怎么理解这个过程简单来说就是把用户也当成一种特殊的实体放进图谱里。用户对物品的行为点击、购买、收藏被看成一种特殊的关系连接用户实体和物品实体。这样一来图里既有用户节点、物品节点也有图谱中各种属性节点导演、类型、品牌等它们通过不同的关系边相互连接。我实际构建 CKG 的时候踩过一个比较大的坑实体 ID 映射必须全局统一。就是说用户、物品、图谱实体需要在一个统一的 ID 空间里编号不能用户一套、物品一套、图谱实体又一套。否则后续做图采样和邻居聚合的时候索引错位的问题会非常隐蔽排查起来很痛苦。建议在数据预处理阶段就建立一个统一的映射表从源头解决这个问题。构建好 CKG 之后图上自然形成了一些“信息通路”。例如用户 u1 点击过物品 i1i1 在知识图谱中关联了导演 e1e1 又导演了物品 i2那么 u1 和 i2 之间就形成了一条长度为 3 的路径。这样的路径正是高阶关系学习的素材。2.2 嵌入表示层TransR 初始化是经验的总结KGAT 借用了 TransR 的思路来初始化实体和关系的嵌入表示。这里有必要多花些笔墨因为不少刚接触这个方向的读者会在这儿产生疑惑为什么不用 TransE 或者 TransH这三者之间的差异到底在哪里TransE 的关系建模方式是平移——它假设 h r ≈ t头实体向量加关系向量约等于尾实体向量。这种方式简单高效但处理一对多、多对一、多对多关系时力不从心。比如“导演”这个关系一个导演导演了多部电影TransE 很难让同一个 r 向量同时满足多个不同的电影向量与导演向量的平移关系。TransH 的改进是把关系建模到超平面上让实体在不同关系下有不同的投影表示。它部分解决了一对多的问题但本质仍是平移模型表达能力依然受限。TransR 的思路是给每个关系单独分配一个投影矩阵让实体向量先通过关系投影矩阵映射到关系对应的语义空间再做平移。这样的好处是不同关系可以在不同的语义子空间里建模表达能力明显增强。模型关联建模方式关系表示表达能力计算复杂度TransEh r ≈ t向量弱难处理一对多低TransH关系超平面上的平移向量超平面平移中等中TransR关系空间内的平移矩阵向量较强高KGAT关系投影矩阵 注意力聚合矩阵向量强高我自己的实操经验是即使后续 KGAT 训练过程中嵌入表示会被不断更新但一个合理的初始化确实能显著加快收敛速度。因为图注意力层的聚合依赖于初始嵌入的质量如果初始嵌入是随机噪声注意力权重很难学到有意义的分布。2.3 图注意力传播层KGAT 的精华所在这是整篇论文最核心的部分。KGAT 的嵌入传播层在 CKG 上递归执行每一层都做了两件事计算注意力权重聚合邻居信息。注意力权重的计算逻辑对于图中的一个节点 h它的邻居集合是图中的三元组 (h, r, t)。KGAT 通过一个打分函数 π(h, r, t) 来衡量邻居 t 在关系 r 下对 h 的重要性。这个打分函数不是拍脑袋定的它有自己的讲究π(h, r, t) (W_r e_t)ᵀ tanh(W_r e_h e_r)其中 e_h、e_r、e_t 分别是头实体、关系、尾实体的嵌入向量W_r 是关系 r 对应的投影矩阵。这个公式的直觉理解是先把头实体和尾实体都投影到关系空间中然后计算它们之间的相似度再加上关系本身的信息。这个设计比直接使用 GCN 的均匀聚合要精细得多。GCN 在聚合邻居时给所有邻居分配相同的权重这在异构图中是不合理的——同样是一个电影节点它关联的导演实体和演员实体对该用户决策的影响显然不同。聚合完信息之后KGAT 采用了类似 GCN 的邻域信息聚合函数但不是简单加和而是把当前节点表示和邻居聚合表示拼接再经过一个线性变换得到更新后的节点表示e_h^agg LeakyReLU(W(e_h e_neighbor))e_h^{new} e_h^agg e_h第二行其实是一个残差连接我复现的时候发现这个残差设计很关键。如果没有它层数加深时信息丢失很严重尤其在 CKG 这样的异构图上。加上残差之后训练稳定性和最终效果都有明显改善。多层传播的含义KGAT 的传播层可以叠加多层每一层相当于在图上游走一步。一层传播能捕获一阶邻居信息两层传播能捕获二阶邻居信息以此类推。这就是论文中“高阶关系”的含义——不是知识图谱推理意义上的复杂逻辑链而是图结构上的多跳语义传播。值得注意的是这里的“阶数”并不等同于性能的单调提升。我自己做实验的时候发现2 层到 3 层之间通常有不错的收益但到 4 层以后收益变得很小甚至可能下降。这个现象在论文的消融实验部分也有体现。原因是多跳传播在带来信息增益的同时也引入了噪声——远处的邻居与当前节点的语义关联已经相当微弱。2.4 预测层与目标函数统一框架下的设计美学KGAT 的预测层设计得比较优雅。在完成 L 层嵌入传播后每个节点用户或物品会得到 L1 个表示初始嵌入 e⁰第一层传播后的 e¹第二层传播后的 e²……直到第 L 层的 eᴸ。论文的做法是对这些表示做求和或拼接得到最终的用户表示和物品表示。然后用户对物品的偏好得分通过内积计算ŷ(u, i) e_u^ᵀ e_i^这个设计思路和黄立峰他们的 NGCFNeural Graph Collaborative Filtering一脉相承都是将各层表示融合保留不同阶数的语义信息。损失函数则是典型的 BPRBayesian Personalized Ranking损失加上 L2 正则。BPR 的基本思想是对于用户 u已交互的物品 i⁺ 和未交互的物品 i⁻我们希望模型打分满足 ŷ(u, i⁺) ŷ(u, i⁻)。用公式表示就是最小化L Σ -ln σ(ŷ(u, i⁺) - ŷ(u, i⁻)) λ ‖Θ‖²这个负采样策略我在复现的时候特别关注了一下。KGAT 的做法是从用户所有未交互的物品中随机采样一个作为 i⁻。这个策略简单有效但负采样的数量和质量直接影响到训练效果。我试过每个正样本配 1 个负样本效果还行配 4 个负样本收敛更快一些但最终 AUC 差距并不大。3. 实验视角论文里的数字说明了什么3.1 数据集与 baseline 选择论文在三个公开数据集上做了实验Amazon-book、Last-FM、Yelp2018。这三个数据集覆盖了不同的推荐场景——图书、音乐、本地生活。每个数据集都配了对应的知识图谱物品和图谱实体的对齐工作做得比较细致。我记得论文报告的基础统计大概是这样的数据集交互数量图谱三元组数量物品-实体对齐数Amazon-book~190万~26万~3.6万Last-FM~42万~13万~1.2万Yelp2018~140万~180万~1.4万baseline 选得很有层次有只利用交互信息的 CF 方法BPRMF、NeuMF、有利用知识图谱特征的CKE、DKN、有图神经网络方向的GCN、GraphSAGE、NGCF基本把当时各类代表性方法都覆盖了。3.2 关键结果解读论文的核心结果显示KGAT 在三个数据集上都稳定超过所有 baseline。在 Amazon-book 上KGAT 相对最优 baselineNGCF在 Recall20 上有约 8% 左右的提升在 Last-FM 和 Yelp2018 上也有类似的优势。坦率地说这个提升幅度在推荐系统方向的论文里算是不错的但也没到颠覆性的程度。论文的真正价值更多在于验证了一个方向将知识图谱作为推荐辅助信息时端到端的学习方式比两阶段的独立嵌入更有效。这一点后来被很多后续工作继承和发展。另外论文还对比了 KGAT 在三种不同设置下的表现仅用协同信号去掉图谱部分、仅用知识图谱信号去掉交互部分、两者结合。结果显示两者结合效果最好而且知识图谱信号对冷启动场景的提升尤其明显。这符合直觉交互数据稀少的用户图谱路径能够提供更多可用的语义信息支撑推荐决策。3.3 消融实验里透露的设计取舍论文的消融实验还有一个值得关注的结论注意力机制确实带来了效果增益但增益幅度并没有想象中那么大大约是 2%~3% 的提升。这说明图谱结构信息本身的引入贡献了大部分收益注意力模块是在此基础上的精细调整。我自己的复现结果也印证了这一点。把 KGAT 的注意力权重改成均匀权重相当于退化成 GCN 风格的聚合效果确实会下降但下降幅度在可接受范围内。这也提醒我们在实际工程中如果算力受限简化注意力部分可能是一个性价比不错的选择。第四部分复现与实操要点。4.1 工程架构选择如果准备复现这篇论文建议使用 PyTorch 配合 DGLDeep Graph Library或者 PyGPyTorch Geometric。KGAT 涉及大量的图采样和邻居聚合操作直接用原生 PyTorch 写循环很痛苦而且效率极低。DGL 的dgl.heterograph可以直接支持异构图能够定义不同类型的节点和边非常契合 CKG 的数据结构。PyG 的HeteroData也有类似的能力。两者选一个就行我个人更习惯用 DGL它在消息传递message passing接口上更灵活一些。还有一个需要注意的地方图数据的规模控制。CKG 的规模是用户数 物品数 图谱实体数这么多节点边数则包括交互边和图谱关系边。数据集小还好数据集一大全图训练会非常吃内存。我第一次跑全量 Amazon-book 时直接 OOM内存溢出了后来改成邻居采样neighbor sampling每个 batch 只采样固定数量的邻居问题就解决了。4.2 关键超参和训练细节论文里透露的默认超参数大概是嵌入维度 64L2 正则系数 1e-5学习率 0.0001batch size 1024传播层数 3 层。这几个参数我复现的时候都试过调优结论是嵌入维度 64 是一个性价比很高的选择。升到 128 有增益但幅度不大训练时间几乎翻倍。降到 32 会明显掉点。学习率 0.0001 相当保守可以用 Adam 配合 0.001 的学习率先训后期手动降低学习率微调收敛速度会快不少。batch size 对最终效果影响不敏感主要影响训练速度和显存占用。传播层数论文推荐 3 层我测试下来 2 层到 3 层确实有提升但 3 层的训练耗时比 2 层多了一半以上。工业落地的话 2 层就够用。另外还有几个论文没细讲但我实测有效的技巧邻居数量限制。CKG 中有些节点邻居非常多比如热门电影、知名演员聚合全部邻居会拖慢速度。限制每个节点采样 20~50 个邻居效果几乎不受影响。特征归一化。初始嵌入如果直接训练不归一化容易出现梯度爆炸。加上 LayerNorm 或者简单做 L2 归一化训练稳定很多。早停策略。论文训练了较多个 epoch我复现时用验证集上的 Recall20 做早停一般 30~50 个 epoch 内就能收敛到比较好的水平。4.3 从论文到落地的距离论文是学术实验代码开源、流程明确但从论文到工业落地还有一段距离。主要差别在于学术实验的场景是离线评估offline evaluation而工业推荐是线上实时推理对延迟要求极高。KGAT 是标准的 GNN 结构需要迭代式地聚合多层邻居这在实时场景下做起来很吃力。工程上主要有两个缓解思路一是离线预计算实体表示线上直接查表。提前把 KGAT 训练好对全量物品计算最终嵌入向量存起来。线上推理时只需要计算用户的最新嵌入然后做向量检索。用户嵌入也可以近似处理——用最近一次更新的嵌入或者用轻量模型实时算。二是图裁剪。CKG 的规模在实际工业场景中可能达到亿级节点、十亿级边。全图训练几乎不可能必须做图分割或子图采样。之前提到的邻居采样就是最直接的手段。5. 常见问题与排查技巧实录5.1 训练不收敛或者收敛速度慢这是最容易碰到的问题通常和初始化有关。把 TransR 预训练步骤省略、直接随机初始化嵌入的话训练会显得很挣扎。建议先用 OpenKE 之类的工具库跑一遍 TransR得到实体和关系的初始嵌入再做后续训练。另一个容易忽略的原因是学习率过高。图神经网络对学习率敏感的程度超出想象我试过 lr0.01 时 loss 整个训练过程完全降不下去降到 0.0001 之后才正常。建议就用论文默认的 0.0001稳妥。5.2 显存/内存爆炸CKG 全图训练耗内存严重尤其是中间层生成的注意力权重矩阵如果邻居数量没有限制显存会迅速打满。解决办法是邻居采样加梯度累积。采样数量先设小一点比如 20确认代码没问题后再逐步调大。5.3 效果不如论文报告值很多复现者在这一步会怀疑人生。先说两个最常见原因第一负采样策略不一致。论文的采样是“随机从未交互物品采样”但并未说明具体随机种子和采样次数。这里的差异会带来几个点的指标波动。建议多换几个随机种子取平均不要只跑一次就下结论。第二数据划分方式。论文用的是按时间划分还是按用户随机划分会影响冷启动评估的难易程度。如果论文没有明确说明建议按自己的业务场景选择并明确标注在报告里。不同的划分策略下KGAT 的效果差异可能有 5 个点以上。5.4 注意力权重分布异常调试的时候可以把注意力权重打印出来看看分布。正常情况应该是偏态分布——少数关键邻居权重高大多数普通邻居权重低。如果你的权重分布接近均匀分布说明注意力机制没有学到有效区分度这通常是因为温度参数或初始化设置不合理也可能是训练还没收敛。6. 从 KGAT 到 LLM 时代一个值得关注的演进方向读这篇论文的时候我注意到最近有一个新的研究方向很有意思知识图谱微调可以增强大语言模型的知识操纵能力。这其实和 KGAT 的核心思想一脉相承——都是希望让图结构中的知识以某种方式融入到一个更大的模型框架中从而提升模型在特定任务上的表现。KGAT 在推荐系统上做的事情本质上是把知识图谱中的结构化信息以端到端可学习的方式注入到用户-物品交互模型中。而知识图谱微调增强大模型的方向是把知识图谱的推理能力注入到语言模型中让模型不仅仅是“记住”知识还能按照图谱结构进行“操纵”——比如多跳推理、关系组合、逻辑一致性控制。我在测试这类模型时发现加了知识图谱微调之后大模型在处理需要多跳关联的问题时输出的一致性和准确性比纯预训练模型要好不少。这和 KGAT 的实验结论有异曲同工之处结构化的图信息确实能提供纯统计学习之外的有效信号。不过坦率地讲研究是研究落地是落地。知识图谱的构建和维护成本很高不是所有场景都值得引入图谱信息。我个人的经验是如果交互数据已经足够稠密CF 类方法已经能取得不错的效果强行引入知识图谱未必有显著提升反而增加了系统复杂度和维护成本。图谱信息的优势场景主要在于冷启动严重、长尾物品多、用户行为稀疏的地方——这时候图上那些从物品属性延伸出去的路径才真正发挥作用。7. 一点个人心得最后简单聊几句感受。KGAT 这篇文章我反复读了几遍越读越觉得它值得学习的地方在于问题意识的递进性——从 CF 的稀疏性缺陷到 KGE 的优化目标割裂再到端到端图注意力网络的提出每一步都建立在充分分析已有工作不足的基础上而不是为了用某个技术而用某个技术。当然论文也不是没有可挑剔之处。比如注意力机制的复杂度和收益之间是否完全对等我认为未必。但作为 2019 年的工作它确实为知识图谱推荐这个方向奠定了很扎实的框架后来的很多工作比如 CKAN、KGIN 等都或多或少受到了它的启发。如果你是这个方向的新人我建议按这个顺序来读先读懂 CKE理解为什么两阶段方法不够好然后读 KGAT理解端到端图模型怎么解决这个问题最后读一两篇 KGAT 的后续改进工作理解社区在哪些方向做了扩展。这个阅读路径应该会让你对整个知识图谱推荐方向有一个比较立体和清晰的认识。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/2 13:22:19
嵌入式硬件RC/LC/RL滤波器设计避坑指南:从器件非理想性到PCB实现
2026/10/2 13:17:18
LS-Dyna模态分析实战:隐式求解与特征值计算详解
2026/10/2 13:17:18
SolidWorks二次开发C#入门:环境搭建与对象模型避坑指南
2026/10/2 14:12:22
AI Engineering from Scratch:产线级AI系统手工锻造指南
2026/10/2 14:12:22
国产MCU实战对比:STM32、GD32与CH32V103在真实项目中的表现与选型
2026/10/2 14:12:22
【保姆级教程】用 WeChat 3.9 + Memotrace + Claude Code 复现前任 Skills:把 settings 改到 TaoToken
2026/10/2 14:12:22
燃油效率与CO2排放数据集:从回归预测到特征工程的完整实战解析
2026/10/2 14:12:22
反无人机自动防御系统实战:立体防护与智能反制技术详解
2026/10/2 14:07:22
LSTM+Transformer混合模型时间序列预测实战:从数据读取到预测画图
2026/10/2 0:01:33
Jev模型详解:从本地部署到Codex接入与数据系统构建
2026/10/2 0:01:33
Paperclip:轻量级AI Agent编排中间件实战指南
2026/10/2 0:01:33
DeepSpeed ZeRO-3 与 MoE 训练实战:显存优化与通信调优
2026/10/1 22:21:25
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
2026/10/2 12:21:42
新手入门看这篇:建设网站加盟避坑指南与SEO实操
2026/10/1 21:38:34
论文AIGC疑似度是什么意思?想查论文AI率有哪些免费工具?
2026/10/2 12:19:13
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/2 4:07:50
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/2 6:07:10
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)