使用GNN实现的用户音乐推荐系统

最近在Mr.Duang先生的催更下以及接到的毕设单子来看打算选择基于GNN实现的个性化推荐系统作为这次更新的内容(在这方面,后续可能还会更新一个股票预测和文本情感分析的项目


相关课程🔗:https://web.stanford.edu/class/cs224w/

文献推荐📚:https://dl.acm.org/doi/pdf/10.1145/3568022

为什么需要(Anon酱)GNN?

许多现实世界的数据以连接图的形式存在,比如社交网络、交通网络和生物网络。我们较为熟悉的机器学习方法通常处理的是图片或者文本,而GNN可以直接处理图数据,捕捉节点之间的复杂关系。

GNN能够有效地捕获节点之间的相互作用和关系。例如,在社交网络中,朋友之间的关系可以影响一个人的行为,GNN能通过这些关系进行更准确的预测。

正是基于GNN的这些特性,我们可能将GNN用于我们的推荐系统之中,比如你的🐧🐧、🛰好友某天突然染上了少女乐队开始溜冰,那么很有可能B站也会往你的推荐列表里面掺🧊

GNN的基础模型

GNN通常处理的是二部图Bipartite Graph,就是说一个graph里边只有两种类型的节点,且任意一条边连接的两个节点种类不相同(比如说左边的是用户账户节点,右边的我们就可以建模为待推荐的视频📹链接。

特别地、在我们的推荐系统中我们的一条边edge可以描述为连接的用户想要这个商品,或者说可以给连接的用户推荐这个商品;我们可以根据用户的历史数据,比如说某用户过去一个月的网易云听歌历史我们可以构造出一个Bipartite Graph。

于是我们的求解问题就变成了根据这个已有的二部图来预测下一步的新边;将推荐系统的问题变成了一个edge prediction的问题。

过往的解决策略📐

过往的解决策略多数是基于矩阵分解、协同过滤算法的推荐策略:

这里介绍一种最为经典的名为FunkSVD的协同过滤推荐算法,但是这里的FunkSVD并不同于已有的数学意义上的典型SVD算法,这里的FunkSVD选择将评分矩阵拟合分解为两个矩阵相乘;

就像上图所展示的,我们的用户平台收集了很多用户对各种商品的评分(比如叔叔🐭收集了整个西安交通大学用户近一个月的B站视频点赞👍和投币视频、以及不喜欢的视频,然后根据这些指标构造一个二维的打分矩阵来描述用户整体对视频的偏好。

但是这样的矩阵其实是一个非常稀疏的矩阵:因为用户群体很大、视频量也是海量的🌊,一个用户只可能看过海量数据中的很小很小很小一部分,所以矩阵存在大量稀疏。

FunkSVD的原理

首先我们先做一些符号上的规定: 表示用户 对物品 的打分, 表示我们模型对这个值的估计值;

我们的推荐算法将用户 编码成向量 ,将物品 编码成 ,推荐系统用点乘来衡量

我们推荐系统其实需要完成的就是找到所有用户和物品的最佳编码,来使得 和打分表中非空的 最接近。然后再用 来评估未打分的空格,再来根据这个值来对用户为浏览过的视频进行推荐。

Sodayo,就像上图所展示的,上图中我们的每一个用户、商品都被编码成为一个四维的向量。

FunkSVD的工作流程

那么我们如何获得所谓的最佳用户以及商品编码呢?

没错,就是定义一个损失函数,然后在使用梯度下降去求最佳拟合就好,Sodayo

定义一个损失函数:

上述函数的第一项就是👈的拟合好坏、第二项叫做正则化项,是用来防止过拟合的, 接下来就可以使用梯度下降去计算最佳的以及了。

引入步长,每次沿着负梯度方向更新这两个向量即可: