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

本文所涉及所有资源均在这里可获取。


📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。

📗本文收录于论文复现系列,大家有兴趣的可以看一看

📘相关专栏C语言初阶C语言进阶系列、恒川的日常汇报系列等,大家有兴趣的可以看一看

📙Python零基础入门系列,Java入门篇系列、docker技术篇系列、Apollo的学习录系列正在发展中,喜欢Python、Java、docker的朋友们可以关注一下哦!

神经网络的公式推导与代码实现

本文所涉及所有资源均在这里可获取。

概述

图卷积网络(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为节点覆盖率。

核心逻辑

核心代码逻辑:

python 复制代码
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环境

搭建环境

python 复制代码
 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

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方链接获取:https://www.aspiringcode.com/content


如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!

制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。

相关推荐
wasp520几秒前
【开源】Banana Slide:一个基于nano banana pro[特殊字符]的原生AI PPT生成应用,迈向真正的"Vibe PPT"
人工智能·开源
说私域2 分钟前
破局互联网产品开发困境:开源AI智能名片链动2+1模式S2B2C商城小程序的实践与启示
人工智能·小程序·开源·私域运营
开源技术1 小时前
深入了解Turso,这个“用Rust重写的SQLite”
人工智能·python
初恋叫萱萱1 小时前
构建高性能生成式AI应用:基于Rust Axum与蓝耘DeepSeek-V3.2大模型服务的全栈开发实战
开发语言·人工智能·rust
水如烟8 小时前
孤能子视角:“组织行为学–组织文化“
人工智能
大山同学8 小时前
图片补全-Context Encoder
人工智能·机器学习·计算机视觉
向哆哆8 小时前
打造高校四六级报名管理系统:基于 Flutter × OpenHarmony 的跨端开发实践
flutter·开源·鸿蒙·openharmony·开源鸿蒙
薛定谔的猫19828 小时前
十七、用 GPT2 中文对联模型实现经典上联自动对下联:
人工智能·深度学习·gpt2·大模型 训练 调优
树℡独9 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
壮Sir不壮9 小时前
2026年奇点:Clawdbot引爆个人AI代理
人工智能·ai·大模型·claude·clawdbot·moltbot·openclaw