KGAT_基于知识图谱+图注意力网络的推荐系统(KG+GAT)

本文介绍了用于推荐的知识图谱注意力网络KGAT。传统推荐方法存在不足,KGAT将知识图谱与用户 - 项目图结合成协同知识图。它包含嵌入层、注意力嵌入传播层和预测层,通过递归传播邻域节点嵌入更新自身节点嵌入,并使用注意力机制区分邻域节点重要性,还给出了实验和代码解析。

Xiang Wang, Xiangnan He, Yixin Cao, Meng Liu and Tat-Seng Chua (2019). KGAT: Knowledge Graph Attention Network for Recommendation. Paper in ACM DL or Paper in arXiv. In KDD’19, Anchorage, Alaska, USA, August 4-8, 2019.
本文作者源码:https://github.com/xiangwang1223/knowledge_graph_attention_network

本人对KGCN的一些代码注释,有兴趣的道友可以看看
https://github.com/Archerxzs/KGAT-notes
文章最后附上本人对代码的解析

Abstract

为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来

传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员)

高阶关系:用一个/多个链接属性连接两个item

KG+user-item graph+high order relations—>KGAT

递归传播邻域节点(可能是users、items、attributes)的嵌入来更新自身节点的嵌入,并使用注意力机制来区分邻域节点的重要性

introduction

尽管CF方法具有有效性和普遍性,但它无法对辅助信息进行建模,例如项目属性、用户简档和上下文,因此在用户和项目很少交互的稀疏情况下表现不佳

解决方法:将这些辅助信息转换成一个通用的特征向量,和userID和itemID输入到监督学习模型(SL)进行预测得分(常见模型:FM,NFM,Wide&Depp,xDeepFm)

仍然存在的问题:这些模型将每个交互都建模为一个独立的数据实例,不考虑它们之间的关系,使得它们不能从用户的集体行为中提取协作信号

在这里插入图片描述

u1-[r1(Interact)]-i1-[r2(DirectedBy)]-e1

CF方法关注和i1有交互的相似user(u4,u5)

SL方法关注和e1有相同属性的相似item(i2)

期望:综上以上两种方法不仅可以对推荐进行互补,还使得user和item之间形成了高阶联系

但现有的SL方法不能将它们统一起来,并且无法考虑到高阶联系

(eg:黄圈中的u2,u3看的i2都是e1指导拍摄的,灰圈中的i3,i4和e1都有共同的关系,这两圈就被传统方法忽略了)

在这里插入图片描述

解决方法:

采用图中item的边信息(即knowledge graph)

knowledge graph+user-item graph–>collaborative knowledge graph协同知识图(CKG)

挑战:

1、节点会随着阶数的增加而急剧增加,会使得模型计算过载(选择多少邻居)

2、高阶关系对于预测的贡献不确定,需要模型来加权选择它们(邻居的重要性)

一些方法:

基于路径:提取携带高阶信息的路径,并将它们输入到预测模型中

路径选择算法:选择更重要的路径

定义元路径:需要大量领域知识

这两种路径选择方法没有对推荐目标进行优化

基于规则的:设计一个额外的损失项来捕获KG的结构来优化推荐模型的学习

目前存在的方法不是直接将高阶关系插入到优化推荐模型中,而是以隐式方法对它们进行编码,缺乏明确的建模,既不能保证捕捉到长期联系,也不能解释高阶建模的结果

GNN->KGAT

挑战:

1、递归嵌入传播,用领域节点嵌入来更新当前节点嵌入

2、使用注意力机制,来学习传播期间每个邻居的权重

优点:

1、与基于路径的方法相比,避免了人工标定路径

2、与基于规则的方法相比,将高阶关系直接融入预测模型

Task Formulation

User-Item Bipartite Graph:

  • G1 ={ (u,yui,i)∣u∈U,i∈I}{ U   user setI   item setyui{ 1 u和i有交互0 u和i无交互G_1\ =\{(u,y_{ui},i)|u∈U,i∈I\}\begin{cases} U \ \ \ user\ set \\ I \ \ \ item\ set \\ y_{ui}\begin{cases} 1 \ u和i有交互 \\ 0 \ u和i无交互\end{cases} \end{cases}G1 ={ (u,yui,i)uUiI}U   user setI   item setyui{ 1 ui0 ui

Knowledge Graph:item的信息(属性、外部知识)

例如一部电影可以用他的导演、演员、体裁等信息描述

(Hugh Jackman,ActorOf,Logan)

  • G2 ={ (h,r,t)∣h,t∈ε,r∈R}G_2\ =\{(h,r,t)|h,t∈\varepsilon,r∈R\}G2 ={ (h,r,t)h,tε,rR}

Item-entity alignments set:

  • $ A={(i,e)|i∈I,e∈\varepsilon}$
    • item i对应于entity eitem\ i 对应于 entity\ eitem ientity e

**Collaborative Knowledge Graph:**将用户行为和项目知识编码为一个统一的关系图

  • G={ (h,r,t)∣h,r∈ε′,r∈R′}G=\{(h,r,t)|h,r∈\varepsilon',r∈R'\}G={ (h,r,t)h,rε,rR}
    • ε′=ε∪U\varepsilon'=\varepsilon∪Uε=εU
    • R′=R∪{ Interact}    { Interact}为额外的关系R'=R∪\{Interact\}\ \ \ \ \{Interact\}为额外的关系R=R{ Interact}    { Interact}

Input:协作知识图G(包括G1和G2)Input:协作知识图G(包括G_1和G_2)Input:GG1G2

Output:y^ui:user u是否会交互item iOutput:\widehat{y}_{ui}:user\ u是否会交互item\ iOutput:y ui:user uitem i

High-Order Connectivity:

定义 L阶连通 :多跳关系的路径

e0r1>e1r2...rL>eLe_0\frac{r_1}{}>e_1\frac{r_2}{}...\frac{r_L}{}>e_Le0r1>e1r2...rL>eL (eL∈ε′ ,r∈R′)(e_L∈\varepsilon'\ ,r∈R')(eLε ,rR)

(el−1,rl,el)是第l个三元组,L是序列的长度(e_{l-1},r_l,e_l)是第l个三元组,L是序列的长度(el1,rl,el)lL

CF方法是建立在用户行为的相似性的基础上,即相似的用户在项目上表现出更相似的偏好

u1r1>i1−r1>u2r1>i2u_1\frac{r_1}{}>i_1\frac{-r_1}{}>u_2\frac{r_1}{}>i_2u1r1>i1r1>u2r1>i2

如上的连通路径会表现为u1可能对i2有偏好,因为u1的相似用户u2曾经对i2有过交互

SL方法更关注与相似属性的item

u1r1>i1r2>e1−r2>i2u_1\frac{r_1}{}>i_1\frac{r_2}{}>e_1\frac{-r_2}{}>i_2u1r1>i1r2>e1r2>i2

如上的连通路径会表现为u1可能对i2有偏好,因为i2和之前喜欢的i1有相同的导演e1

但是很难对u1r1>i1r2>e1−r3>i2u_1\frac{r_1}{}>i_1\frac{r_2}{}>e_1\frac{-r_3}{}>i_2u1r1>i1r2>e1r3

### KGAT Implementation in PyTorch Knowledge Graph Attention Network (KGAT) combines graph convolutional networks with attention mechanisms to model high-order relations within knowledge graphs. While specific tutorials directly targeting KGAT might not be widely available, understanding its components through existing resources can provide valuable insights. For implementing KGAT using PyTorch, one should first familiarize oneself with fundamental concepts such as datasets and dataloaders provided by PyTorch for efficient data handling[^3]. These tools facilitate the preparation of input data required for training models like KGAT. A typical approach involves constructing custom `Dataset` classes tailored specifically towards processing entities and relationships present in a given knowledge base. This allows for flexible manipulation of node features and adjacency matrices essential for propagation steps during forward passes. Additionally, leveraging advanced functionalities offered by libraries built atop PyTorch—such as DGL (Deep Graph Library)—can significantly simplify operations related to message passing over complex structures encountered when working with large-scale knowledge bases. Below is an illustrative snippet demonstrating initialization aspects relevant to setting up a basic framework suitable for experimenting with KGAT-like architectures: ```python import torch from torch.utils.data import Dataset, DataLoader import dgl class KnowledgeGraphDataset(Dataset): """Custom dataset class for loading entity pairs along with their labels.""" def __init__(self, triples_file_path): self.triples = load_triple_data(triples_file_path) def __len__(self): return len(self.triples) def __getitem__(self, idx): head_entity_id, tail_entity_id, relation_type = self.triples[idx] sample = { 'head': head_entity_id, 'tail': tail_entity_id, 'relation': relation_type } return sample def collate_fn(batch_samples): heads = [] tails = [] rels = [] for item in batch_samples: heads.append(item['head']) tails.append(item['tail']) rels.append(item['relation']) g = build_knowledge_graph(heads, tails, rels) return g train_dataset = KnowledgeGraphDataset('path/to/training/triples.txt') data_loader = DataLoader(train_dataset, batch_size=8, shuffle=True, collate_fn=collate_fn) for epoch in range(num_epochs): for step, bg in enumerate(data_loader): predictions = kgat_model(bg) loss = compute_loss(predictions, true_labels) optimizer.zero_grad() loss.backward() optimizer.step() ``` This code outlines key elements necessary for building pipelines around KGAT implementations while adhering closely to best practices recommended within the PyTorch ecosystem[^1].
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值