Multi-GCCF:物尽其用

1 一点点引入

Multi-Graph convolution collaborative filtering(Multi-GCCF) 属于基于图神经网络的协同过滤算法。

协同过滤算法通常基于这样一个假设:相似的用户往往喜欢同样的item,而具有相似客户的item往往会得到相似的评分。所以,大多数协同过滤算法基于user-item二分网络做出推荐,但由于在实际场景中每个user所对应的item数量是有限的,这就会导致构造出的user-item二分网络非常稀疏。此时,使用图卷积等深度学习算法很难在有限特征信息的基础上生成一个表示能力较强的embedding。

Mutil-GCCF的作者通过考虑user-user的交互信息和item-item的交互信息来缓解这一问题。在二分网络中,节点的类型包括item和user。各节点的一阶邻居为不同类别的节点,而二阶邻居则是同类节点。虽然考虑二阶邻居可以将user-useritem-item的交互关系考虑进去,但作者希望显式地考虑将其考虑进去。于是,构建user-user网络和item-item网络对算法进行了改进。

此外, user节点和item节点的类型不同,在信息聚合阶段使用同样的参数聚合两类不同类型的节点信息是不够合理的。Multi-GCCF在更新节点embedding时使用了两套参数将这两类节点分别聚合和特征转换,考虑user节点与item节点的内在差异。

P.S. 小伙伴们看完有收获可以帮忙点个赞嘛,也给我一些动力 ^_ ^!

2 Multi-GCCF一瞥

Multi-GCCF主要分为以下三个部分:

  1. 基于user-item二分网络生成节点的embedding;
  2. 基于user-user网络与item-item网络生成embedding;
  3. 使用skip-connection将初始的节点特征与最终的节点embedding连接,以避免信息层层传递导致的信息丢失。

总体框架如下:

2.1 Bipartite Graph Convolutional neural networks

Bipar-GCN层包含forward samplingbackward aggregating两块。其中,forward sampling的作用在于防止节点度幂律分布带来的影响。在采样完模型1到KKK层的邻居节点之后,采用GCN来聚合邻居信息。

假设为每个节点学习到的初始embedding为eue_ueueve_vev(若初始的节点输入有特征信息,这个初始embedding可以使用MLP学习)。

kkk层目标user的embedding更新机制如下:
huk=σ(Wuk[huk−1;hN(u)k−1]),hu0=eu{\bf h}_u^k=\sigma({\bf W}_u^k[{\bf h}_u^{k-1};{\bf h}^{k-1}_{N(u)}]), {\bf h}_u^0=e_u huk=σ(Wuk[huk1;hN(u)k1]),hu0=eu
其中,Wuk{\bf W}_u^kWuk为可学习的参数,σ\sigmaσ为tanh激活函数,[;][;][;]为拼接操作。hN(u)k−1{\bf h}^{k-1}_{N(u)}hN(u)k1的更新规则如下:
hN(u)k−1=AGGREGATORu(hvk−1,v∈N(u))h^{k-1}_{N(u)}={\bf AGGREGATOR}_u({\bf h}_v^{k-1},v \in N(u)) hN(u)k1=AGGREGATORu(hvk1,vN(u))

AGGREGATORu=σ(MEAN({hvk−1Quk}),v∈N(u))){\bf AGGREGATOR}_u=\sigma({\bf MEAN(\{h}_v^{k-1}{\bf Q}_u^k\}),v \in N(u))) AGGREGATORu=σ(MEAN({hvk1Quk}),vN(u)))

Quk{\bf Q}_u^kQuk为第kkk层user聚合权重矩阵。

同样地,第kkk层目标item的embedding更新机制如下:
hvk=σ(Wvk[hvk−1;hN(v)k−1]),hv0=ev{\bf h}_v^k=\sigma({\bf W}_v^k[{\bf h}_v^{k-1};{\bf h}^{k-1}_{N(v)}]), {\bf h}_v^0=e_v hvk=σ(Wvk[hvk1;hN(v)k1]),hv0=ev

hN(v)k−1=AGGREGATORv(huk−1,v∈N(v))h^{k-1}_{N(v)}={\bf AGGREGATOR}_v({\bf h}_u^{k-1},v \in N(v)) hN(v)k1=AGGREGATORv(huk1,vN(v))

AGGREGATORv=σ(MEAN({huk−1Qvk}),u∈N(v))){\bf AGGREGATOR}_v=\sigma({\bf MEAN(\{h}_u^{k-1}{\bf Q}_v^k\}),u \in N(v))) AGGREGATORv=σ(MEAN({huk1Qvk}),uN(v)))

整体示意图如下:

由上面的公式和示意图可以看出,Multi-GCCF对于user和item的embedding生成是分开的,使用了两组不同的权重。这一操作也就是文中提到的,考虑user节点和item节点的内在差异。

这里对于初始embedding的生成可以深入探讨一下。比如,若没有拿到user和item的特征,使用one-hot作为编码是否可行?根据LightGCN的实验,是否可以将非线性激活和线性特征转换去除?还是说可以用LightGCN做出来的第一层embedding作为Multi-GCCF的初始embedding,能否有效?有兴趣的小伙伴可以相互交流一下~

不了解LightGCN的小伙伴可以看一下: LightGCN不相信非线性激活与特征转换。

2.2 Multi-Graph Encoding

构建user-user网络与item-item网络的目的是为了缓解user-item二分网络的信息不充足,其原因在于大多数用户对应的item数量是有限的,数据会比较稀疏,所以通过构建这两个网络来补充信息。

具体的user-user网络与item-item网络的构建方式为:计算rating/click矩阵行或列的余弦相似性,并根据相似性建立节点之间的连边,其中,相似性阈值的确定是要使得网络的平均度为10。

有了网络之后,节点的embedding生成规则如下:
zu=σ(∑i∈N′(u)eiMu);zv=σ(∑j∈N′(v)ejMu)z_u=\sigma(\sum_{i \in N'(u)}e_i{\bf M}_u);z_v=\sigma(\sum_{j \in N'(v)}e_j{\bf M}_u) zu=σ(iN(u)eiMu);zv=σ(jN(v)ejMu)
其中,Mu{\bf M}_uMuMv{\bf M}_vMv为可学习参数,N′(u)N'(u)N(u)N′(v)N'(v)N(v)为节点uuu与节点vvv的一阶邻居节点。

得到了MGE层的输出后,将其与Bipar-GCN层的embedding拼接。

2.3 Skip-connection

由于节点的初始特征在经过多层非线性激活和特征转换之后,其在embedding中的信息有所流失,作者为了在节点表示中保留节点的初始特征,利用一个全连接层对节点初始特征进行转化得到了一个制定维度的embedding与Bipar-GCN层和MGE层的embedding进行连接。

2.4 关于如何拼接

如前面提到的,Multi-GCCF会生成三种类型的embedding:

  1. Bipar-GCN层生成的embedding;
  2. MGE层生成的embedding;
  3. Skip connection部分基于全连接生成的embedding。

那么如何将这三种embedding进行拼接呢?文章中的作者尝试了element-wise sumconcatenation以及Attention,具体如下:

2.5 损失函数

Multi-GCCF所用的损失函数为BPR损失,基本思想是最大化正样本和负样本之间的差距,即用户会购买的商品与用户不会购买的商品之间的概率差距越大越好,具体公式如下:
LBPR=∑u,i,j∈O−logσ(eu∗ei∗−eu∗ej∗)+λ∣∣Θ∣∣22+β(∣∣eu∗∣∣22+∣∣ei∗∣∣22+∣∣ej∗∣∣22)L_{BPR}=\sum_{u,i,j \in O} -log\sigma(e^*_ue^*_i - e^*_ue^*_j)+\lambda||\Theta||_2^2+\beta(||e^*_u||_2^2+||e^*_i||_2^2+||e^*_j||_2^2) LBPR=u,i,jOlogσ(eueieuej)+λΘ22+β(eu22+ei22+ej22)
其中,O={(u,i,j)∣(u,i)∈R+,(u,j)∈R−}O=\{(u,i,j)|(u,i) \in {\bf R}^+, (u,j)\in {\bf R}^-\}O={(u,i,j)(u,i)R+,(u,j)R}R+{\bf R}^+R+R−{\bf R}^-R为采样得到的正样本和负样本,Θ\ThetaΘ为模型的参数。

3 效果如何

首先是和baseline对比了一下Recall和NDCG,见下表

由表可知,几乎在所有数据集中,Multi-GCCF的性能都是最好的。

然后测试了Multi-GCCF个组件的贡献,结果如下:

由上表可以看出,三个组成部分都是可以带来性能增益的。

最后,测试了上文提到的不同的embedding拼接方式带来的性能:

由表可知,element-wise sum是一个比较合适的选择。

4 总结

Multi-GCCF给我个人带来的启发有以下几点:

  1. 当二分网络比较稀疏时,建网是一条可行的路径。此外,skip connection可以帮助我们保留住初始的特征。个人认为Multi-GCCF性能好的原因在于他做了三种不同的embedding,以使得最终的embedding具有较强的表示能力。但各部分embedding如何生成其实还有优化的空间,比如,使用不同的方法考虑user和item节点的差异。
  2. 文中没有提到过Multi-GCCF的效率,我认为这是一个有待考量的方面。如何提升其效率应该也是一个比较有意思的问题。

参考资料

  1. Multi-Graph Convolution Collaborative Filtering

GNN推荐算法(二)—Multi-GCCF:物尽其用相关推荐

  1. 推荐系统算法_机器学习和推荐系统(二)推荐算法简介

    推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...

  2. 【推荐】Twitter推荐算法架构

    note 文章目录 note 一.推特开源推荐算法 二.Twitter Recommendation Algorithm 2.1 召回模型 2.2 排序模型 三.基础建设 Reference 一.推特 ...

  3. 数据挖掘干货总结(六)--推荐算法之CF

    本文共计1245字,预计阅读时长八分钟 推荐算法(二)--CF算法 一.推荐的本质 推荐分为非个性化和个性化,非个性化推荐比如各类榜单,而本系列主要介绍个性化推荐,即: 在合适的场景,合适的时机,通过 ...

  4. 推荐算法(二)--算法总结

    转自:https://www.jianshu.com/p/1464eab67711 推荐算法分类 1 个性化推荐 1.1 基于用户推荐(Demographic-based Recommendation ...

  5. 基于协同过滤算法的电影推荐系统设计(二) - ALS算法详解

    0 系列文章目录 0.1 基于协同过滤算法的电影推荐系统设计(一) - 项目简介 0.2 基于协同过滤算法的电影推荐系统设计(二) - 推荐系统介绍 ALS是alternating least squ ...

  6. 欧几里得最短距离公式_推荐算法原理(二)欧几里得距离计算物品间相似度

    在上篇文章中介绍了如何利用余弦定理计算两个物品间的相似度:KiKlaus:推荐算法原理(一)余弦定理计算物品间相似度​zhuanlan.zhihu.com 这种计算方法虽然简单,但是在衡量空间两个向量 ...

  7. 基于聚类的推荐算法笔记——以豆瓣电影为例(二)(附源代码)

    基于聚类的推荐算法笔记--以豆瓣电影为例(二)(附源代码) 第一章 聚类算法介绍 基于聚类的推荐算法笔记一 第二章 数据介绍 基于聚类的推荐算法笔记二 第三章 实现推荐算法 基于聚类的推荐算法笔记三 ...

  8. 【推荐算法】从零开始做推荐(二)——TopK推荐的评价指标,计算原理与样例

    前言   推荐系统的评价指标在不同类型的推荐场景下,选用的不同.有些推荐的评价指标并非完全出自推荐系统,而是从搜索算法,信息检索,机器学习等相关领域沿用过来,因此网上有些对评价指标的解释并非完全以推荐 ...

  9. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

最新文章

  1. 今晚8点开播 | 微信高级研究员解析深度学习在NLP中的发展和应用
  2. matlab神经网络 时间序列,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?...
  3. html input选择框样式修改,关于type=file的input框样式修改小结
  4. android分辨率比例成像,像素不是唯一 决定成像效果你必知的真相
  5. winform分页案例简单实现方式~
  6. Win32ASM学习[10]:传送指令
  7. Python str / bytes / unicode 区别详解 - Python零基础入门教程
  8. java 生成客户端代码_swagger-codegen生成java客户端代码
  9. 矩阵转置相关公式_线性代数入门——矩阵的转置运算及对称矩阵的概念
  10. 视频教程-思科网络工程师CCNP高级路由技术-路由协议
  11. 用InkScape绘制中国人寿LOGO
  12. 结对编程_我从结对编程面试中学到的东西
  13. 程序之父: Pascal之父:尼克劳斯·沃思(一)
  14. Tomcat IP访问限制
  15. 基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)
  16. 浅谈计算机语言与英语,浅谈日常英语与计算机专业英语区别.doc
  17. [轻笔记]Successor Features for Reinforcement learning
  18. 在 Java 中如何加快大型集合的处理速度
  19. 多线程进阶=》JUC并发编程02
  20. [aaronyang]分享我的博客园皮肤代码

热门文章

  1. 计算机的哪个盘影响电脑速度,电脑哪个盘会影响网速 网速变慢是怎么回事【解决方法】...
  2. 【Revit闪退小技巧】Revit打开启动时候闪退完美解决
  3. 移动端banner css3(@keyframes )实现
  4. 禅道安装及团队成员登录
  5. 荣耀双十一AR虚拟大直播来了 秦时明月人物实力带货
  6. mysql latid1_mysql数据库触发器详解-阿里云开发者社区
  7. html skype加好友代码,分享个刚学会的电子邮件中加Skype即时联络标签的方法~有用请顶...
  8. 如何把一张大图均匀切割成网格小图
  9. 《逆袭必看》的人不懂的顶级学习方法“承重墙学习法”_java管理系统
  10. 面试中常被问到的(20)select,poll,epoll对比