用户行为数据是推荐系统常用且关键的数据,用户潜在兴趣与对物品的评价体现于行为历史。协同过滤算法是完全依赖用户和物品行为关系的推荐算法,从其名称可知原理为借助大家的反馈、评价和意见对海量信息过滤,筛选出用户可能感兴趣的信息。
以上图为例,电商网站商品库有游戏机、小说、杂志、电视机 4 件商品,推荐系统要决定是否向用户 X 推荐电视机,可利用用户 X 及其他用户对商品的历史评价数据。评价用“点赞”“踩”表示,构成有向图后转换为“共现矩阵”,“点赞”设为 1,“踩”设为 -1,无数据置为 0。生成共现矩阵后,推荐问题转化为预测矩阵中特定元素值的问题。
协同过滤算法先找到与用户 X 兴趣最相似的 n 个用户(Top n 用户,n 为超参数),假设 n 取 2,从共现矩阵中选出用户 B 和用户 C 作为相似用户,因他们对“电视机”评价为负面,预测用户 X 对“电视机”评价也为负面,实际中不向用户 X 推荐“电视机”。
该过程存在两点不严谨之处:一是用户相似度的定义方式;二是预测的负面评价应有分数衡量,但推荐分数的计算方法未明确。
在共现矩阵中,每个用户对应的行向量其实就可以当作一个用户的 Embedding 向量。则可以参考其相似度计算方式确定用户相似度的计算方法。
最经典的方法是利用余弦相似度,它衡量了用户向量 i 和用户向量 j 之间的向量夹角大小。夹角越小,余弦相似度越大,两个用户越相似,它的定义如下:
除余弦相似度外,还有皮尔逊相关系数、欧式距离等。
在得到Top n个相似用户之后,利用 Top n 用户生成最终的用户 u 对物品 p 的评分是一个比较直接的过程。这里,我们假设的是“目标用户与其相似用户的喜好是相似的”,根据这个假设,我们可以利用相似用户的已有评价对目标用户的偏好进行预测。最常用的方式是,利用用户相似度和相似用户评价的加权平均值,来获得目标用户的评价预测,公式如下所示。
其中,权重 是用户 u 和用户 s 的相似度, 是用户 s 对物品 p 的评分。
在获得用户 u 对不同物品的评价预测后,最终的推荐列表根据评价预测得分进行排序即可得到。到这里,我们就完成了协同过滤的全部推荐过程。
协同过滤是经典推荐算法,但存在缺点:共现矩阵通常很稀疏,在用户历史行为少的情况下,寻找相似用户不准确。为此,视频流媒体公司 Netflix 改进协同过滤算法,提出矩阵分解算法,增强了模型处理稀疏矩阵的能力。
如图 (a) 所示,协同过滤算法利用用户观看历史,找出与目标用户看过相同视频的相似用户,将这些相似用户喜欢的其他视频推荐给目标用户,方式直观。
矩阵分解算法则是为每个用户和视频生成隐向量,将其定位到隐向量表示空间,距离相近的用户和视频兴趣特点接近,据此将相近视频推荐给目标用户。例如为用户 Dave 推荐时,可按向量距离由近到远生成推荐列表。矩阵分解本质类似 Embedding 方法,主要是先分解协同过滤的共现矩阵生成隐向量,再依据隐向量相似性进行推荐。
从形式上看,矩阵分解的过程是直观的,就是把一个 mxn 的共现矩阵,分解成一个 mxk 的用户矩阵和 kxn 的物品矩阵相乘的形式。
有了用户矩阵和物品矩阵,用户隐向量和物品隐向量就非常好提取了。用户隐向量就是用户矩阵相应的行向量,而物品隐向量就是物品矩阵相应的列向量。
将共现矩阵分解的常用方法是梯度下降,其原理即通过求取偏导更新权重,梯度更新公式为 。实现梯度下降关键在于定义损失函数 L,这样才能通过求导确定梯度方向,这里给出矩阵分解损失函数的定义。
包含三部:定义模型,使用 fit 函数训练模型,提取物品和用户向量。
// 建立矩阵分解模型
val als = new ALS()
.setMaxIter(5)
.setRegParam(0.01)
.setUserCol("userIdInt")
.setItemCol("movieIdInt")
.setRatingCol("ratingFloat")
//训练模型
val model = als.fit(training)
//得到物品向量和用户向量
model.itemFactors.show(10, truncate = false)
model.userFactors.show(10, truncate = false
深度学习给推荐系统带来了革命性的影响,能够显著提升推荐系统的效果,原因主要有两点,一是深度学习极大地增强了推荐模型的拟合能力,二是深度学习模型可以利用模型结构模拟用户兴趣的变迁、用户注意力机制等不同的用户行为过程。
在矩阵分解模型结构里,用户和物品的 One - hot 向量分别位于两侧,先经隐向量层转换为隐向量,再通过点积交叉得到打分预测,但点积作为特征向量交叉方式过于简单,在数据模式复杂时易出现欠拟合。
深度学习能大大加强模型的拟合能力,以 NeuralCF 模型为例,用多层神经网络替换点积层。由于多层神经网络理论上能拟合任意函数,增加神经网络层可解决模型欠拟合问题。
“欠拟合”指的是模型复杂度低,无法很好地拟合训练集数据的现象
“过拟合”是指模型在训练集上的误差很小,但在测试集上的误差较大的现象
不同的深度学习模型具有不同的模型结构,正是这样的规律,让它能够轻松模拟人们的思考过程和行为过程。
典型的例子就是阿里巴巴的模型 DIN(深度兴趣网络)和 DIEN(深度兴趣进化网络)。它们通过在模型结构中引入注意力机制和模拟兴趣进化的序列模型,来更好地模拟用户的行为。
左侧为DIN 模型,它在神经网络中增加了一个叫做“激活单元“的结构,这个单元就是为了模拟人类的注意力机制。举个例子来说,我们在购买电子产品,比如说笔记本电脑的时候,更容易拿之前购买电脑的经验,或者其他电子产品的经验来指导当前的购买行为,很少会借鉴购买衣服和鞋子的经验。这就是一个典型的注意力机制,我们只会注意到相关度更高的历史购买行为,而 DIN 模型就是模拟了人类的注意力特点。
DIEN模型(右侧)则在引入注意力机制的同时,还模拟了用户兴趣随时间的演化过程,可以预测下一部用户会喜欢什么。
演化图的中心部分,为多层神经网络,也称多层感知机,简称 MLP,是深度学习最基础结构,也是整个演化图的核心。它像黑盒,对输入特征深度组合交叉,输出兴趣值预测。其他深度推荐模型基于其进行结构改进。
从多层感知机向上,还有一个重点模型 Deep Crossing。Deep Crossing 实际上是一类经典深度学习模型的代表,相比于 MLP,Deep Crossing 在原始特征和 MLP 之间加入了 Embedding 层。这样一来,输入的稀疏特征先转换成稠密 Embedding 向量,再参与到 MLP 中进行训练,这就解决了 MLP 不善于处理稀疏特征的问题。可以说,Embedding+MLP 的结构是最经典,也是应用最广的深度学习推荐模型结构。
从 MLP 向下,是 Google 提出的推荐模型 Wide&Deep。它把深层的 MLP 和单层的神经网络结合起来,希望同时让网络具备很好的“记忆性”和“泛化性”。Wide&Deep 提出以来,凭借着“易实现”“易落地”“易改造”的特点,获得了业界的广泛应用。围绕着 Wide&Deep 还衍生出了诸多变种,比如,通过改造 Wide 部分提出的 Deep&Cross 和 DeepFM,通过改造 Deep 部分提出的 AFM、NFM 等等。总之,Wide&Deep 是业界又一得到广泛应用的深度推荐模型。