NewBeeNLP原创出品

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

悠闲会 · 信息检索

前段时间,我们关注过图神经网络在推荐系统中的应用:万物皆可Graph | 当推荐系统遇上图神经网络。今天继续来看看这个方向,何向南老师组的又两大必读论文,分别发在SIGIR19'和SIGIR20'。

Neural Graph Collaborative Filtering

  • 论文:Neural Graph Collaborative Filtering

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

  • 代码:https://github.com/xiangwang1223/neural_graph_collaborative_filtering

协同过滤(collaborative filtering)的基本假设是相似的用户会对物品展现出相似的偏好,自从全面进入深度学习领域之后,一般主要是先在隐空间中学习关于user和item的embedding,然后重建两者的交互即interaction modeling,如MF做内积,NCF模拟高阶交互等。

但是他们并没有把user和item的交互信息本身编码进 embedding 中,这就是NGCF想解决的点:「显式建模User-Item 之间的高阶连接性来提升 embedding」

High-order Connectivity

解释高阶连通性如上图,图1左边为一般CF中user-item交互的二部图,双圆圈表示此时需要预测的用户u1,对于u1我们可以把有关他的连接扩展成右图的树形结构,l是能到达的路径长度(或者可以叫跳数),l=1表明能一步到达u1的item,此时可以看到最外层的跳数相同的i4跟i5相比(l都为3),用户u1对i4的兴趣可能要比i5高,因为i4->u2->i2->u1、i4->u3->i3->u1有两条路径,而i5->u2->i2->u1只有一条,所以i4的相似性会更高。所以如果能扩展成这样的路径连通性来解释用户的兴趣,就是高阶连通性。

NGCF的完整模型如下图,可以分为三个部分来看:

  • Embeddings:对user和item的嵌入向量,普通的用id来嵌入就可以了

  • Embedding Propagation Layers:挖掘高阶连通性关系来捕捉交互以细化Embedding的多个嵌入传播层

  • Prediction Layer:用更新之后带有交互信息的 user 和 item Embedding来进行预测

主要就是中间的交互信息捕捉怎么构建,主要思路是借助GNN的message passing消息传递机制:

其中Mu←i是消息嵌入(即要传播的信息),使用embedding后的user,item的特征












作为输入,然后两者计算内积相似度来控制邻域的信息,再加回到item上,用权重W控制权重,最后的N是u和i的度用来归一化系数,可以看做是折扣系数,随着传播路径长度的增大,信息慢慢衰减。

博主自己的理解是实际上做了一个小型的attention从领域的item整合信息,所以下一步就是用这些邻域信息更新user:

上标(1)表示一阶聚合,可以看到从领域的i中整合信息又考虑到了自身节点的信息,最后再激活一下。高阶传播实际就是将上述的一阶传播堆叠多层,这样经过 l 次聚合,每个节点都会融合其 l 阶邻居的信息,也就得到了节点的 l 阶表示,具体的传播如下图:

对应user u2来说,先由直接连接的i2,i4,i5开始是一阶,进行上述的聚合更新之后,聚合二阶邻居(此时u1也完成了更新),此时用u1和u2更新i2,同样的其他的item也会相应的更新,最后再由i1,i2,i3来更新u1,这样通过相互更新相互迭代,就完成了开篇那张图的树形结果。

如果把上述的更新换成矩阵形式的话:

其中






























这其实和GCN很像了。最后再将 L 阶的节点表示全部readout,分拼接起来作为最终的节点表示,再内积得到预测结果:

损失函数就是常规的成对loss操作

最后再看看ngcf的关键代码:

def _create_ngcf_embed(self):# Generate a set of adjacency sub-matrix.# 使用矩阵的解法,所以先得到邻接矩阵if self.node_dropout_flag:# node dropout.A_fold_hat = self._split_A_hat_node_dropout(self.norm_adj)else:A_fold_hat = self._split_A_hat(self.norm_adj)#最初的嵌入形式ego_embeddings = tf.concat([self.weights['user_embedding'], self.weights['item_embedding']], axis=0)all_embeddings = [ego_embeddings]#执行k层的消息传播for k in range(0, self.n_layers):temp_embed = []for f in range(self.n_fold):temp_embed.append(tf.sparse_tensor_dense_matmul(A_fold_hat[f], ego_embeddings))# u到u,聚合u所有邻居的消息side_embeddings = tf.concat(temp_embed, 0)# 特征变换矩阵sum_embeddings = tf.nn.leaky_relu(tf.matmul(side_embeddings, self.weights['W_gc_%d' % k]) + self.weights['b_gc_%d' % k])# i到u,合并自嵌入,邻居的嵌入bi_embeddings = tf.multiply(ego_embeddings, side_embeddings)# 再次变换特征bi_embeddings = tf.nn.leaky_relu(tf.matmul(bi_embeddings, self.weights['W_bi_%d' % k]) + self.weights['b_bi_%d' % k])#非线性激活函数,u到u和i到u的两部分ego_embeddings = sum_embeddings + bi_embeddings# message dropout.ego_embeddings = tf.nn.dropout(ego_embeddings, 1 - self.mess_dropout[k])#正则化norm_embeddings = tf.math.l2_normalize(ego_embeddings, axis=1)all_embeddings += [norm_embeddings]all_embeddings = tf.concat(all_embeddings, 1)#拼一起u_g_embeddings, i_g_embeddings = tf.split(all_embeddings, [self.n_users, self.n_items], 0)return u_g_embeddings, i_g_embeddings

LightGCN

  • 论文:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation

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

  • 代码:https://github.com/kuandeng/LightGCN

前一篇的NGCF主要遵循标准GCN变形得到,包括使用非线性激活函数和特征变换矩阵w1和W2。然而作者认为实际上这两种操作对于CF并没什么大用,理由在于不管是user还是item,他们的输入都只是ID嵌入得到的,即根本没有具体的语义(一般在GCN的应用场景中每个节点会带有很多的其他属性),所以在这种情况下,执行多个非线性转换不会有助于学习更好的特性;更糟糕的是,它可能会增加训练的困难,降低推荐的结果。

所以将非线性激活函数non-linear和特征变换矩阵feature transformation都去掉,只增加一组权重系数来邻域聚集weighted aggregate不同gcn层输出的嵌入为最终的嵌入,大大简化了模型。即在LightGCN中,只采用简单的加权和聚合器,放弃了特征变换和非线性激活的使用,所以公式变为(只剩下):

而且从上式可以看到它只聚合连接的邻居,连自连接都没有。最后的K层就直接组合在每个层上获得的嵌入,以形成用户(项)的最终表示:

其中αk设置为1/(K+1)时效果最好。其余的部分就和NGCF一模一样。

「为什么要组合所有层?」

  • GCN随着层数的增加会过平滑,直接用最后一层不合理

  • 不同层的嵌入捕获不同的语义,而且更高层能捕获更高阶的信息,结合起来更加全面

  • 将不同层的嵌入与加权和结合起来,可以捕获具有自连接的图卷积的效果,这是GCNs中的一个重要技巧

同样看一下关键部分的代码,代码量真的要简洁许多:

def _create_lightgcn_embed(self):if self.node_dropout_flag:A_fold_hat = self._split_A_hat_node_dropout(self.norm_adj)else:A_fold_hat = self._split_A_hat(self.norm_adj)ego_embeddings = tf.concat([self.weights['user_embedding'], self.weights['item_embedding']], axis=0)all_embeddings = [ego_embeddings]for k in range(0, self.n_layers):temp_embed = []for f in range(self.n_fold):temp_embed.append(tf.sparse_tensor_dense_matmul(A_fold_hat[f], ego_embeddings))#归一化已经在A里面得到A_hat了,所以这里直接聚合就完了side_embeddings = tf.concat(temp_embed, 0)ego_embeddings = side_embeddingsall_embeddings += [ego_embeddings]all_embeddings=tf.stack(all_embeddings,1)#然后拼一起all_embeddings=tf.reduce_mean(all_embeddings,axis=1,keepdims=False)u_g_embeddings, i_g_embeddings = tf.split(all_embeddings, [self.n_users, self.n_items], 0)return u_g_embeddings, i_g_embeddings

一起交流

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

END -

PET——文本分类的又一种妙解

2021-05-31

李沐:博士这五年

2021-05-29

李沐:工作五年反思

2021-05-25

三大部门七场面试,终拿字节AI NLP 算法offer

2021-05-18

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

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

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

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

    NewBeeNLP原创出品 公众号专栏作者@上杉翔二 悠闲会 · 信息检索 本篇文章follow一些 Graph in Rec 的文章,以前博主整理过的系列可以见: 万物皆可Graph | 当推荐系统 ...

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

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

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

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

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

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

  6. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络 (二)

    在从图(Graph)到图卷积(Graph Convolution): 漫谈图神经网络 (一)中,我们简单介绍了基于循环图神经网络的两种重要模型,在本篇中,我们将着大量笔墨介绍图卷积神经网络中的卷积操作 ...

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

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

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

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

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

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

最新文章

  1. 机器学习基础专题:分类
  2. ThreadPoolExecuotor源码参考
  3. iostat命令(转)
  4. java 正则 标签内容_java正则匹配html片段,并取得标签中的内容
  5. 你还在用迭代器处理集合吗?试试Stream,真香!
  6. Win8系统 界面大放送(Win8 抢先版)
  7. xfce 安装文泉驿字体
  8. 快手用户群体分析_报告称快手用户分布与移动互联网人群分布一致
  9. OpenVN客户端添加路由配置(流量分流)
  10. CITA 技术白皮书
  11. 关于hostapd 2.7版本的移植问题
  12. 牛客巅峰训练赛S2钻石王者——补题
  13. 【电子技术】如何抑制共模、差模噪声?
  14. 计算机毕业答辩程序无法运行,计算机专业毕业答辩程序
  15. 各路由初始登录地址和账号密码
  16. 随意发表见解易成无效表达
  17. 用google来查股票
  18. 王爽-汇编语言 万字学习总结
  19. 知乎上关于倒金字塔体的一片文章
  20. CSS 霓虹灯效果 (一)

热门文章

  1. 中小微企业税务数据的指标分析
  2. 信贷评分卡的顶层设计思路
  3. Beta发布-----欢迎来怼团队
  4. 树莓派添加USB外接硬盘
  5. 方便面为什么要是波浪形的 它是怎么做到的?
  6. VMware + Ubuntu16.04 网络无法使用问题
  7. Dataguard后台进程解析
  8. shell中的括号(小括号,大括号/花括号)
  9. 《mysql 必知必会》 笔记(五)
  10. 《人月神话》阅读笔记一