✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。
我是Srlua小谢,在这里我会分享我的知识和经验。🎥
希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮
记得先点赞👍后阅读哦~ 👏👏
📘📚 所属专栏:传知代码论文复现
欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙
目录
概述
模型讲解
演示效果
核心逻辑
使用方式
部署方式
参考文献
本文所有资源均可在该地址处获取。
概述
图卷积网络(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 = configself.dataset : dataloader.BasicDataset = datasetself.__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_usersself.num_items = self.dataset.m_itemsself.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 functionnn.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。
使用方式
1.首先在/data文件中导入items和user数据,运行data_init.py文件进行数据初始化
2.
在parse.py中修改模型参数
3.运行main.py
部署方式
python3.8即可,拥有pytorch环境
搭建环境
pip install -r requirements.txt
参考文献
SIGIR 2020. Xiangnan He, Kuan Deng ,Xiang Wang, Yan Li, Yongdong Zhang, Meng Wang(2020). LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation, Paper in arXiv.
参考代码:
https://github.com/kuandeng/LightGCN
希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!