NewBeeNLP原创出品

公众号专栏作者@上杉翔二

悠闲会 · 信息检索

本篇文章follow一些 Graph in Rec 的文章,以前博主整理过的系列可以见:

  • 万物皆可Graph | 当推荐系统遇上图神经网络

  • 万物皆可Graph | 当推荐系统遇上图神经网络(二)

IMP-GCN

  • 论文:Interest-aware Message-Passing GCN for Recommendation

  • 地址:https://arxiv.org/abs/2102.10044

  • 代码:https://github.com/liufancs/IMP_GCN

来自WWW2021的文章,探讨推荐系统中的过平滑问题。从何向南大佬的NGCF开始一直强调的就是高阶邻居的协作信号是可以学习良好的用户和项目嵌入。虽然GCN容易「过平滑」(即叠加更多层时,节点嵌入变得更加相似,最终无法区分,导致性能下降),也可以用一些方法来缓解如LightGCN和LR-GCN模型,但作者认为他们忽略了一个很重要的问题:「用户的嵌入学习也可以涉及到与用户没有共同兴趣的高阶邻域用户。」 所以多层图卷积会使不同兴趣的用户具有相似的嵌入性。

应对这一点,作者提出一种新的「兴趣感知消息传递GCN (IMP-GCN)」,该模型将用户及其交互项分组到不同的子图中,在子图中进行高阶图卷积 。而这里的子图是由具有相似兴趣的用户及其交互项组成的。

子图由无监督的子图生成模块生成,该模块集成了用户特征和图结构,以识别具有相似兴趣的用户,然后通过保留这些用户及其交互项来构造子图。为此,其可以过滤掉在高阶图卷积运算中的负信息传播,从而通过叠加更多的图卷积层来保持用户的唯一性。模型图如上,简单来看就是一阶和多阶子图的融合,最后combination之后做预测。

  • 「Interest-aware Message-passing Strategy」 文章使用的传播都是LightGCN,因为它的有效性已经得到了很好的证明。

    最后经过图卷积后item????的最终表示是它在不同子图s中学习到的嵌入的组合:





































  • 「Layer Combination and Prediction」将每一层获得的嵌入结合起来,形成用户????和项目????的最终表示。

  • 「Subgraph Generation Module」 子图用于对具有共同兴趣的用户进行分组,所以这一任务很容易被抽象为为一个分类任务,即每个用户都被分类为一个组。具体地说,每个用户都由一个特征向量表示,此处融合ID(e0)和图传播后表示(e1)组成为以下:

    将获得的用户特征转换为具有2层神经网络去分类即可:

    Uo即表示了用户所属的组/子图。值得注意的是,这里将用户分为不同的组是一种无监督的方法,不需要真实标签。此处博主个人的理解是,有相似embedding的用户将生成的预测向量,所以会被归类为同一组。

LR-GCN

  • 论文:Revisiting Graph based Collaborative Filtering: A Linear Residual Graph Convolutional Network Approach

  • 地址:https://arxiv.org/abs/2001.10167v1

  • 代码:https://github.com/newlei/LR-GCCF

补一下前文说到的LR-GCN,来自AAAI2020。LR-GCN也始于两个问题:

  • 对于用户和项嵌入,GCN遵循使用图卷积操作和非线性变换进行邻域聚合的两个步骤。虽然图的卷积操作对聚合邻域信息和建模高阶图结构是有效的,但在GCN中的非线性特征变换所引入的额外复杂性有必要吗?

  • 目前大多数基于GCN的模型只能堆叠很少的层(例如,2层)。事实上,存在过度平滑效应从而导致每个节点的高阶邻居往往无法区分。虽然作者任务随着叠加层的增加,平滑效应最初可以缓解CF的数据稀疏性,但更多层引入的过度平滑效应会忽略每个用户的独特性,最终会降低推荐性能。

针对这两个问题,作者提出残差图卷积方法重新研究了基于图的CF模型(Linear Residual Graph Convolutional Collaborative Filtering)。模型图如上,其实解决方案已经十分的明显了,在每一步的传播中进行残差连接,并且没有非线性...

  • 在特征传播步骤的每一层上,使用一个简单的线性嵌入传播,而没有任何非线性转换。

    其中d是度,R是邻居。

  • 为了预测用户对项目的偏好,提出了一种基于残余的网络结构来克服过平滑。

简要看看关键代码吧:一些注意点已经备注在代码里

    def forward(self, user, item_i, item_j):  #得到embedding  users_embedding=self.embed_user.weightitems_embedding=self.embed_item.weight  #直接开始gcn,这里直接实现上面的那个公式,1无非线性2残差也是在这里一起做的,先user,再item。#然后尝试搭建多层的GCN。gcn1_users_embedding = (torch.sparse.mm(self.user_item_matrix, items_embedding) + users_embedding.mul(self.d_i_train))#*2. #+ users_embeddinggcn1_items_embedding = (torch.sparse.mm(self.item_user_matrix, users_embedding) + items_embedding.mul(self.d_j_train))#*2. #+ items_embeddinggcn2_users_embedding = (torch.sparse.mm(self.user_item_matrix, gcn1_items_embedding) + gcn1_users_embedding.mul(self.d_i_train))#*2. + users_embeddinggcn2_items_embedding = (torch.sparse.mm(self.item_user_matrix, gcn1_users_embedding) + gcn1_items_embedding.mul(self.d_j_train))#*2. + items_embeddinggcn3_users_embedding = (torch.sparse.mm(self.user_item_matrix, gcn2_items_embedding) + gcn2_users_embedding.mul(self.d_i_train))#*2. + gcn1_users_embeddinggcn3_items_embedding = (torch.sparse.mm(self.item_user_matrix, gcn2_users_embedding) + gcn2_items_embedding.mul(self.d_j_train))#*2. + gcn1_items_embedding# gcn4_users_embedding = (torch.sparse.mm(self.user_item_matrix, gcn3_items_embedding) + gcn3_users_embedding.mul(self.d_i_train))#*2. + gcn1_users_embedding# gcn4_items_embedding = (torch.sparse.mm(self.item_user_matrix, gcn3_users_embedding) + gcn3_items_embedding.mul(self.d_j_train))#*2. + gcn1_items_embeddinggcn_users_embedding= torch.cat((users_embedding,gcn1_users_embedding,gcn2_users_embedding,gcn3_users_embedding),-1)#+gcn4_users_embeddinggcn_items_embedding= torch.cat((items_embedding,gcn1_items_embedding,gcn2_items_embedding,gcn3_items_embedding),-1)#+gcn4_items_embedding##然后实现bpr的loss计算,即先得到i和juser = F.embedding(user,gcn_users_embedding)item_i = F.embedding(item_i,gcn_items_embedding)item_j = F.embedding(item_j,gcn_items_embedding)  # # pdb.set_trace() prediction_i = (user * item_i).sum(dim=-1)prediction_j = (user * item_j).sum(dim=-1) #再相减,补上一个L2# loss=-((rediction_i-prediction_j).sigmoid())**2#self.loss(prediction_i,prediction_j)#.sum()l2_regulization = 0.01*(user**2+item_i**2+item_j**2).sum(dim=-1)# l2_regulization = 0.01*((gcn1_users_embedding**2).sum(dim=-1).mean()+(gcn1_items_embedding**2).sum(dim=-1).mean())loss2= -((prediction_i - prediction_j).sigmoid().log().mean())# loss= loss2 + l2_regulizationloss= -((prediction_i - prediction_j)).sigmoid().log().mean() +l2_regulization.mean()# pdb.set_trace()return prediction_i, prediction_j,loss,loss2

一起交流

想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定要备注信息才能通过)

END -

BOOM!推荐系统遇上多模态信息

2021-05-26

真不是炼丹,务实敢为的 MoCo v3

2021-05-24

RTX 3090的深度学习环境配置指南:Pytorch、TensorFlow、Keras

2021-05-23

100+篇论文合集:GNN在NLP中的应用

2021-05-21

万物皆可Graph | 当推荐系统遇上图神经网络(三)相关推荐

  1. 万物皆可Graph | 当推荐系统遇上图神经网络(四)

    作者 | 上杉翔二 悠闲会 · 信息检索 整理 | NewBeeNLP 本篇文章继续整理这个系列Graph in Rec 的文章,以前博主整理过的系列可以见: 万物皆可Graph | 当推荐系统遇上图 ...

  2. 万物皆可Graph | 当推荐系统遇上图神经网络(二)

    NewBeeNLP原创出品 公众号专栏作者@上杉翔二 悠闲会 · 信息检索 前段时间,我们关注过图神经网络在推荐系统中的应用:万物皆可Graph | 当推荐系统遇上图神经网络.今天继续来看看这个方向, ...

  3. 【图神经网络】万物皆可Graph | 当推荐系统遇上图神经网络

    NewBeeNLP原创出品 公众号专栏作者@上杉翔二 悠闲会 · 信息检索 图神经网络可以说是现在AI领域的超级宠儿.针对推荐系统的稀疏性问题,图方法还真的很适合,主要原因有下: 推荐系统中存在很多的 ...

  4. 万物皆可Graph | 当信息检索遇上图神经网络

    作者 | 上杉翔二 悠闲会 · 信息检索 整理 | NewBeeNLP 本篇文章继续整理 Graph in Rec&Search 这个系列的文章,以前博主整理过的系列可以见: 万物皆可Grap ...

  5. 当推荐系统遇上图学习:基于图学习的推荐系统最新综述

    ©作者|Shoujin Wang 单位|麦考瑞大学博士后 研究方向|数据挖掘,机器学习,推荐系统 论文简介 本文给大家介绍一篇被今年国际人工智能联合会议 IJCAI 2021 接收的从图机器学习的视角 ...

  6. 【赠书】当深度学习遇上图: 图神经网络的兴起!

    大家好,我是kaiyuan.周末愉快! 日常给关注支持『NewBeeNLP』的朋友们送几本书,这次赠书是图神经网络方面的.各大顶会随便一刷都有图网络的身影,我们之前也有分享过相关内容的技术文章 Gra ...

  7. 当深度学习遇上图: 图神经网络的兴起!(文末送书)

    当深度学习遇上图,会碰撞出怎样的火花呢? 本文就带你来了解一下--近年来逆势而上的一门技术:图神经网络! 内容选自<图神经网络:基础与前沿(全彩)>一书! 01 什么是图 也许我们从来没有 ...

  8. 当深度学习遇上图: 图神经网络的兴起!

    当深度学习遇上图,会碰撞出怎样的火花呢? 本文就带你来了解一下--近年来逆势而上的一门技术:图神经网络! 内容选自<图神经网络:基础与前沿(全彩)>一书! 01 什么是图 也许我们从来没有 ...

  9. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...

最新文章

  1. C#中JSON和对象之间互相转换功能示例
  2. Codeforces Round #644 (Div. 3)(A-E)
  3. 男人的快乐可以多简单?
  4. RabbitMQ-Java实现Publish/Subscribe订阅模式
  5. 解决问题:UserWarning: Matplotlib is currently using agg, which is a non-GUI backend.
  6. 软件测试——检查代码
  7. SNMP 模拟器 vxsnmpsimulator 使用方法
  8. 基于Spark的电影推荐系统(推荐系统~2)
  9. 深度学习之语义分割(SegNet)
  10. linux中测试环境的搭建
  11. 大学加权平均分计算器_澳大利亚移民宝藏专业----西澳大学幼教硕士解析
  12. “use strict” 严格模式使用
  13. 职业规划(一)怎么写简历
  14. python爬虫爬取拉勾网招聘信息
  15. PyTorch的自动求导机制详细解析,PyTorch的核心魔法
  16. 一次哔哩哔哩面试经历,内容太过真实
  17. J语言初步,绝妙的符号系统,神的计算器
  18. win10资源管理器经常无响应
  19. python 生成pdf 文字和图片_Python系列—PDF文本与图片抽取
  20. MapReduce程序中的万能输入FileInputFormat.addInputPaths

热门文章

  1. SAP License:SAP一个成功的案例之跳槽者必看
  2. LINUX yum用法
  3. unity5 静态和动态cubmap
  4. SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。...
  5. C# .NET学习经验总结
  6. Tensorflow初入门
  7. python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)
  8. Android两个控件叠在一起,如何让被挡住的控件显示出来
  9. 多线程中,NSOperationQueue和GCD的区别
  10. Android WebView 问题总集