基于图模型的第一篇论文复现,比起tensorflow,还是觉得pytorch框架更容易看懂。
论文思路:数据集构建用户-项目交互图,基于GCN思想,聚合邻居节点的信息,增强用户和项目的嵌入表示,以得到更为准确的评分预测。其中论文证明GCN中的非线性激活和数据转换不仅增加模型复杂度,还影响模型性能。数据不考虑用户和项目的属性信息,只有节点ID,评分数据反映边信息,不涉及额外信息,不需要额外的特征变换和非线性激活,基于简单的协同过滤思想。(现在很多论文都是基于图模型+协同过滤思想,优化推荐任务)
具体模型结构:
【1】数据集:gowalla,amazon-book,yelp2018,数据集一般都处理成train,test,user_list,item_list
图模型数据思路,构建节点,边数据,邻接矩阵构建,生成图结构
【2】参数:parse.py,模型的所有参数都在此封装,其中数据集列表默认是gowalla数据集,模型包含MF和Lgcn,默认是LightGcn
【3】world.py参数调用
【4】dataloader:数据集处理,模型采用bpr损失函数,需要抽样负样本。在这部分,作者分别做了两类数据集的处理,加了一个额外数据集lastfm,涉及社交属性的数据集,额外构建用户-用户社交网络,按理说,这个数据集构建的是异构图,作者与gowalla数据集构建图是同一个方法。创新思路可以考虑异构图,社会化推荐。
【5】utils.py:构建BPR损失函数,评价指标precision,recall,ndcg,跑模型发现,gowalla数据集跑完准确的只有55%,可能是这个指标数据结过不太好,作者论文中只写了recall和precison两个指标,数据结果基本与论文一致。
【6】register.py:查看加载数据集的稀疏度,打印具体参数等信息。
【7】procedure.py:模型训练测试流程
【8】main.py:调用model开始训练,打印结果
模型思路很简单,没有特征变换,没有非线性激活,没有很多需要反向传播优化的参数,其中节点区分用的是1/k,与一般采用注意力机制自学习的模型不同,相当于一种均值的形式,作者也提到这是未来优化的方向之一。另外存在疑问的一点,第一层网络,用户的紧邻是商品,到了第二次商品的紧邻是用户,用户-商品-用户,这种方式比起社会化推荐,似乎也包含用户的紧邻用户,只不过是间接邻居,是否可以考虑增加上用户-用户邻接信息,能进一步优化模型。利用注意力机制去学习参数权重。项目-用户-项目,这种传播,是否也包含兴趣的深层次传播。以后学习中尝试优化模型。另外一个创新思路是,考虑文本辅助信息,比如用户对商品的评论文本,已有学者,采用bert模型+LightGcn模型,实现更好地推荐任务。总觉得对于推荐,各种信息都考虑,比如用户,项目的属性,社交网络,项目知识图谱,考虑时效,动态推荐,等等一系列因素都涉及,或许结果会更优,但是模型好复杂,实现上好难。