暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于图卷积网络的轻量化推荐模型(论文复现)

wei_shuo 2024-09-18
201

基于图卷积网络的轻量化推荐模型(论文复现)

本文所涉及所有资源均在传知代码平台可获取

概述

图卷积网络(Graph Convolution Network,GCN)已经广泛的应用于推荐系统,基于GCN的协同过滤算法(例如NGCF)缺少消融研究,此模型对NGCF进行了消融实验并提出了轻量化卷积网络。传统的GCN推荐模型(以NGCF为例)

在这里插入图片描述

其中的线性变换和非线性激活函数导致模型庞大,速度很慢,难于理解。
通过消融实验,去掉线性变换W和非线性激活函数σ,得到以下结果:

在这里插入图片描述

可以看到,去掉fn的recall和ndcg在两个常用数据集上的效果更好。
本模型的优势在于,轻量化了NGCF模型,在参数更小,速度更快的基础上,还提升了性能

模型讲解

在这里插入图片描述

模型集合了Item和User的邻居信息,切只保留这部分信息,通过多层的GCN,最后求均值,得到了最终的u、i向量,最后进Prediction

模型公式:

在这里插入图片描述

目标函数:

在这里插入图片描述

演示效果

在这里插入图片描述

其中precision、recall、ndcg为模型评判标准,epoch为迭代次数(可改参数)、loss为损失,Sample为节点覆盖率

核心逻辑

核心代码逻辑:

class LightGCN(BasicModel): def __init__(self, config:dict, dataset:BasicDataset): super(LightGCN, self).__init__() self.config = config self.dataset : dataloader.BasicDataset = dataset self.__init_weight() self.attention_layer = AttentionLayer(input_dim=64) self.mlp = MLP(input_dim=64) # self.contrast = Contrast(64, 0.5, 0.5) def __init_weight(self): self.num_users = self.dataset.n_users self.num_items = self.dataset.m_items self.latent_dim = self.config['latent_dim_rec'] self.n_layers = self.config['lightGCN_n_layers'] self.keep_prob = self.config['keep_prob'] self.A_split = self.config['A_split'] self.embedding_user = torch.nn.Embedding( num_embeddings=self.num_users, embedding_dim=self.latent_dim) self.embedding_item = torch.nn.Embedding( num_embeddings=self.num_items, embedding_dim=self.latent_dim) if self.config['pretrain'] == 0: #nn.init.xavier_uniform_(self.embedding_user.weight, gain=1) #nn.init.xavier_uniform_(self.embedding_item.weight, gain=1) #print('use xavier initilizer') # random normal init seems to be a better choice when lightGCN actually don't use any non-linear activation function nn.init.normal_(self.embedding_user.weight, std=0.1) nn.init.normal_(self.embedding_item.weight, std=0.1) world.cprint('use NORMAL distribution initilizer') else: self.embedding_user.weight.data.copy_(torch.from_numpy(self.config['user_emb'])) self.embedding_item.weight.data.copy_(torch.from_numpy(self.config['item_emb'])) print('use pretarined data') self.f = nn.Sigmoid() self.Graph = self.dataset.getSparseGraph() print(f"lgn is already to go(dropout:{self.config['dropout']})") # print("save_txt")

核心逻辑就是去掉传统图卷积中的非线性激活函数和线性变换,轻量化了模型,只保留了图的语义信息,目标函数选择了BPRLOSS

使用方式

在这里插入图片描述

首先在/data文件中导入items和user数据,运行data_init.py文件进行数据初始化

在这里插入图片描述

在parse.py中修改模型参数;运行main.py

部署方式

python3.8即可,拥有pytorch环境;搭建环境

pip install -r requirements.txt

文章代码资源点击附件获取

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论