技术干货 | 推荐效果提升2.48%,MindSpore图神经网络BGCF详解!
技术干货 | 推荐效果提升2.48%,MindSpore图神经网络BGCF详解!
作者:于璠
作者主页:https://www.zhihu.com/people/yu-fan-42-9
文章来源:https://zhuanlan.zhihu.com/p/376281098
本篇属于MindSpore图神经网络模型系列,主要分享MindSpore原创图神经网络BGCF,十分欢迎各位一起探讨图神经网络算法的发展以及之后的应用场景。

推荐系统中通常将用户和物品发生的交互作为正样本。尤其在隐式反馈的数据中,会将所有未观察到交互的物品作为负样本。这种做法会对于存在潜在偏好的物品(下次会购买的物品或者根本没有暴露在用户视野中的物品)进行错误的标签。针对推荐系统中的交互不确定性问题,华为MindSpore团队和诺亚方舟实验室提出了一种基于贝叶斯的图神经网络协同过滤模型[1] (Bayesian Graph Collaborative Filtering, BGCF)。BGCF在三个推荐benchmark上的效果均超过了SOTA图神经网络推荐模型。并且在华为应用市场游戏推荐场景下,相比于最佳基准模型,BGCF的新用户推荐和老用户推荐效果提升了2.48%和1.71%,充分验证了模型能有效缓解交互稀疏和新用户冷启动问题。论文已被KDD2020录用,代码已基于MindSpore开源发布,欢迎大家使用。
论文链接:
代码链接:
https://gitee.com/mindspore/mindspore/tree/master

推荐系统倾向于对拥有相似兴趣的用户推荐同样的物品,这就是协同过滤(collaborative filtering)的思想。矩阵分解(matrix factorization)作为其中的经典方法在Netflix比赛中取得最佳效果。矩阵分解通过学习用户和物品向量从而重构用户物品历史交互。具体可以参考Matrix Factorization Techniques for Recommender Systems[2]这篇论文。简单来说如公式(1),假设用户维度向量 和物品维度向量
,通过两者的内积
作为用户对于物品的偏好预测:
(1)
之后利用观察到的用户-物品交互记录作为描述物品和用户关系的ground-truth,并希望偏好预测 能够较好拟合。在大多数推荐方法中,没有观测到的用户-物品交互记录作为负样本参与训练。但是在实际情况下,这种方法存在不确定性。一方面,没有交互记录的用户-物品也许是因为物品并没有暴露在用户视野中,并不能代表用户对于该物品否定的偏好;另一方面,用户和物品交互收集于有噪环境里,存在虚假或者误导的正向偏好。

图神经网络
BGCF全称Bayesian Graph Collaborative Filtering,是一种利用贝叶斯的图神经网络解决推荐问题的方法。在图神经网络中,用户和物品的交互视为一种二部图,同时用户之间的相似性以及物品之间的共性可以显示地建模成用户-用户和物品-物品图。

图1:用户和物品交互图[8]
随着Graph Convolutional (Neural) Networks (GCNs)[3]的提出,越来越多的GNN模型从邻居节点中提取信息并学习出更好的节点特征表示。相关研究[4]表明,在推荐系统集成图特征表示能够很好地缓解数据稀疏性和冷启动问题**,并显著提升推荐的关联性。**
贝叶斯方法
BGCF基本思想来源于Bayesian Personalized Ranking(BPR)算法**,如公式(2)所示,优化目标 最大使得正确的个性化排序可以由某个模型给出,其中
表示模型的参数向量。根据贝叶斯公式,优化目标转为两部分,其中右边部分与数据集无关,因此最大化左边
部分。简化来说,希望表示参数向量的模型使得预测的用户-物品排序更加准确,最终形式转化为对于用户u使得每一个预测物品对中的正样本分数和负样本分数差距更大。具体思想参考Bayesian Personalized Ranking from Implicit Feedback[5]这篇论文。**
(2)
不同于先前GNN推荐方法,BGCF为了缓解原图中潜在的不确定性造成的影响,将交互图也视为一种随机变量**,从而建模原观察图数据中的不确定性。模型后验概率如公式(3):**
(3)
即通过观察的用户-物品排序 的预测真实用户-物品排序的概率
。根据蒙特卡洛近似方法,可以通过经验分布从而得到近似分布,因此利用采样图方法通过多次采样来拟合真实的用户-物品交互。最终用户
对于物品
和物品
的预测排序可以近似表示为公式(4),即通过多张采样图生成的用户向量和物品向量应用到公式(2)中。
(4)
其中, 来源于
的建模生成。BGCF利用node-copying的方法生成新的交互图
,利用生成的采样交互图拟合真实交互图
。

图 2:node-copying 示意图
如图2,用户A的点击记录是苹果和香蕉,用户B的点击记录是橘子、西瓜和苹果。node-copying方法将用户B的偏好复制给用户A,从而生成近似的新交互记录图,但同时与原观察图存在充分的多样性差异,使得模型能够更充分地学习。具体的Node-copying细节参考这篇论文[6]。

BGCF模型的训练过程如图3所示。

图 3:BGCF训练过程图
不同于原交互图上每条边都是真实的用户-物品交互记录,生成的采样图的边是“伪造”的。因此,借鉴graph attention network (GAT)[7]的注意力策略,节点不同边赋予不同的权重。同时原交互图和采样图使用平均聚合来学习节点表示。最终节点的表示是原图和采样图节点表示的结合。生成的用户和物品表示利用公式(4)从而实现对于推荐过程的建模。
基于MindSpore图引擎,BGCF实现异构图采样,分别获取用户节点和物品
节点的邻居。代码如下:
1. u_neighs = train_graph.get_sampled_neighbors( 2. node_list=u_group_nodes, neighbor_nums=[self.num_samples], neighbor_types=[1]) 3. i_neighs = train_graph.get_sampled_neighbors( 4. node_list=i_group_nodes, neighbor_nums=[self.num_samples], neighbor_types=[0])
GNN模型部分采用节点聚合,在MindSpore上实现均值和注意力聚合。代码如下:
1. class AttenConv(nn.Cell): 2. …… 3. def construct(self, self_feature, neigh_feature): 4. query = self.expanddims(self_feature, 1) 5. neigh_matrix = self.dropout(neigh_feature) 6. 7. score = self.matmul_t(query, neigh_matrix) 8. score = self.softmax(score) 9. atten_agg = self.batch_matmul(score, neigh_matrix) 10. atten_agg = self.squeeze(atten_agg) 11. 12. output = self.matmul(self.concat((atten_agg, self_feature)), self.out_weight) 13. return output 1. class MeanConv(nn.Cell): 2. …… 3. def construct(self, self_feature, neigh_feature): 4. neigh_matrix = self.reduce_mean(neigh_feature, 1) 5. neigh_matrix = self.dropout(neigh_matrix) 6. 7. output = self.concat((self_feature, neigh_matrix)) 8. output = self.act(self.matmul(output, self.out_weight)) 9. return output
BGCF使用MindSpore混合精度训练,在维持单精度训练的网络精度前提下,利用半精度数据格式加速深度神经网络训练过程。

我们在业界公开数据集和工业数据集上进行了一系列实验,从而验证BGCF在推荐召回**、多样性、稀疏性和冷启动问题上优秀的效果。**
总体性能比较
如表格1,在三个公开数据集上,BGCF模型在大多推荐指标上均超过了基于图的SOTA推荐模型。说明利用贝叶斯的方法建模交互中的不确定性能够显著提升推荐性能。

表格 1:BGCF推荐性能比较

图 4:准确性-多样性实验结果图
准确率-多样性权衡
在准确率-多样性权衡实验中,如图4,BGCF相比于之前的SOTA图推荐模型NGCF有着显著提升,说明了BGCF模型推荐物品更加多样性。

图 5:在不同用户群体中模型性能相对提升图
处理稀疏数据
如图5可见,当用户平均交互量低于40,BGCF模型相比于基准模型相对提升最多。这验证了模型在处理稀疏的用户和物品交互上的优越性能。
我们在华为应用市场推荐系统也验证了模型的有效性。如图6所示,工业界推荐系统通常包括三个模块:候选集选择,匹配,排序。
图 6:工业界应用市场推荐系统结构图
候选集选择模块用于从成千上万个item中为每个用户选出几百个item;接着匹配模块为每个item预测一个评分;最后排序模块结合匹配模块输出的评分以及其他的一些原则(多样性,商业)为每个用户生成一个排序列表。我们将BGCF模型在候选集选择模块进行离线验证,和已有模型的对比结果表明,我们的模型取得了更优越的性能,相比于NGCF取得了2.17%的效果提升。对老用户和新用户的性能分析表明我们的模型在老用户推荐上效果提升了1.71%,在新用户推荐上效果提升了2.48%,进一步表明了我们的模型在缓解冷启动问题上的优越性。
对于BGCF的介绍就到这里啦,欢迎大家批评指正。
最后给MindSpore打个广告,期待大家多多参与。
MindSpore官网:https://www.mindspore.cn/
MindSpore论坛:https://bbs.huaweicloud.com/forum/forum-1076-1.html
参考文献: