专栏名称: AI科技大本营
迎来到AI科技大本营。这里汇集了优秀的AI学习者,技术大咖和产业领袖;提供接地气的实战课程。在这里和优秀的人一起成长。
目录
相关文章推荐
歸藏的AI工具箱  ·  Claude 3.7 Sonnet ... ·  21 小时前  
歸藏的AI工具箱  ·  Claude 3.7 Sonnet ... ·  21 小时前  
量子位  ·  DeepSeek-R1秘籍轻松迁移,最低只需 ... ·  昨天  
爱可可-爱生活  ·  【EasyR1:基于veRL的高效、可扩展多 ... ·  2 天前  
爱可可-爱生活  ·  【LUCY:一款专注于语言理解和控制的AI项 ... ·  2 天前  
51好读  ›  专栏  ›  AI科技大本营

从原理到落地,七大维度详解矩阵分解推荐算法

AI科技大本营  · 公众号  · AI  · 2019-08-23 20:19

正文


作者 | gongyouliu
编辑丨Zandy
来源 |  大数据与人工智能 ( ID: ai-big-data)


导语:作者在《 协同过滤推荐算法 》这篇文章中介绍了 user-based item-based 协同过滤算法,这类协同过滤算法是基于邻域的算法(也称为基于内存的协同过滤算法),该算法不需要模型训练,基于非常朴素的思想就可以为用户生成推荐结果。还有一类基于隐因子(模型)的协同过滤算法也非常重要,这类算法中最重要的代表就是本节我们要讲的矩阵分解算法。矩阵分解算法是 2006 年 Netflix 推荐大赛获奖的核心算法,在整个推荐系统发展史上具有举足轻重的地位,对促进推荐系统的大规模发展及工业应用功不可没。


本篇文章我们会详细介绍矩阵分解算法的方方面面。我们会从矩阵分解算法的 核心思想、矩阵分解算法的算法原理、矩阵分解算法的求解方法、矩阵分解算法的拓展与优化、近实时矩阵分解算法、矩阵分解算法的应用场景、矩阵分解算法的优缺点 等 7 个方面来讲解矩阵分解算法。希望通过本文的学习,读者可以很好地了解矩阵分解的算法原理与工程实现,并且具备自己动手实践矩阵分解算法的能力,可以尝试将矩阵分解算法应用到自己的推荐业务中。


一、矩阵分解算法的核心思想

我们在《 协同过滤推荐算法 》这篇文章中讲过,用户操作行为可以转化为如下的用户行为矩阵。其中 是用户i对标的物 j 的评分,如果是隐式反馈,值为 0 或者 1 (隐式反馈可以通过一定的策略转化为得分,具体参考《 协同过滤推荐算法 》这篇文章介绍),本文我们主要用显示反馈(用户的真实评分)来讲解矩阵分解算法,对于隐式反馈,我们将在第四节 5 中专门讲解和说明。


图1:用户对标的物的操作行为矩阵


矩阵分解算法是将用户评分矩阵 分解为两个矩阵 的乘积。



其中, 代表的用户特征矩阵, 代表标的物特征矩阵。


某个用户对某个标的物的评分,就可以采用矩阵 对应的行(该用户的特征向量)与矩阵 对应的列(该标的物的特征向量)的乘积。有了用户对标的物的评分就很容易为用户做推荐了。具体,可以采用如下方式为用户做推荐:


首先可以将用户特征向量 乘以标的物特征矩阵 ,最终得到用户对每个标的物的评分


图2:为用户计算所有标的物评分


得到用户对标的物的评分 后,从该评分中过滤掉用户已经操作过的标的物,针对剩下的标的物得分做降序排列取 topN 推荐给用户。


矩阵分解算法的核心思想是将用户行为矩阵分解为两个低秩矩阵的乘积,通过分解,我们分别将用户和标的物嵌入到了同一个 k 维的向量空间( k 一般很小,几十到上百),用户向量和标的物向量的内积代表了用户对标的物的偏好度。所以,矩阵分解算法本质上也是一种 嵌入方法


上面提到的 k 维向量空间的每一个维度是 隐因子( latent factor ) ,之所以叫隐因子,是因为每个维度不具备与现实场景对应的具体的可解释的含义,所以矩阵分解算法也是一类隐因子算法。这 k 个维度代表的是某种行为特性,但是这个行为特性又是无法用具体的特征解释的,从这点也可以看出,矩阵分解算法的可解释性不强,我们比较难以解释矩阵分解算法为什么这么推荐。


矩阵分解的目的是通过机器学习的手段将用户行为矩阵中缺失的数据(用户没有评分的元素)填补完整,最终达到可以为用户做推荐的目标。


讲完了矩阵分解算法的核心思路,那么我们怎么利用机器学习算法来对矩阵进行分解呢?这就是下节要讲的主要内容。


二、矩阵分解算法的算法原理

前面只是很形式化地描述了矩阵分解算法的核心思想,本节我们来详细讲解怎么将矩阵分解问题转化为一个机器学习问题,从而方便我们训练机器学习模型、求解该模型,具备最终为用户做推荐的能力。


假设所有用户有评分的 对( 代表用户, 代表标的物)组成的集合为 A, ,通过矩阵分解将用户 和标的物 嵌入 k 维隐式特征空间的向量分别为:




那么用户 对标的物 的预测评分为 ,真实值与预测值之间的误差为 。如果预测得越准,那么 越小,针对所有用户评分过的 对,如果我们可以保证这些误差之和尽量小,那么有理由认为我们的预测是精准的。


有了上面的分析,我们就可以将矩阵分解转化为一个机器学习问题。具体地说,我们可以将矩阵分解转化为如下等价的求最小值的最优化问题。


公式1:矩阵分解等价的最优化问题


其中 是超参数,可以通过交叉验证等方式来确定, 是正则项,避免模型过拟合。通过求解该最优化问题,我们就可以获得用户和标的物的特征嵌入(用户的特征嵌入 ,就是上一节中用户特征矩阵 的行向量,同理,标的物的特征嵌入 就是标的物特征矩阵 的列向量),有了特征嵌入,就可以为用户做个性化推荐了。


那么剩下的问题是怎么求解上述最优化问题了,这是下节主要讲解的内容。


三、矩阵分解算法的求解方法


对于上一节讲到的最优化问题,在工程上一般有两种求解方法, SGD( S tochastic G radient D escent) 和 ALS( A lternating L east S quares) 。下面我们分别讲解这两种方法的实现原理。



3.1 利用 SGD 来求解矩阵分解

假设用户 对标的物 的评分为 , 嵌入 k 维隐因子空间的向量分别为 ,我们定义真实评分和预测评分的误差为 ,公式如下:



我们可将公式 1 写为如下函数



求偏导数,具体计算如下:




有了偏导数,我们沿着导数(梯度)相反的方向更新 ,最终我们可以采用如下公式来更新




上式中 为步长超参数,也称为学习率(导数前面的系数 2 可以吸收到参数 中),取大于零的较小值。 先可以随机取值,通过上述公式不断更新 ,直到收敛到最小值(一般是局部最小值),最终求得所有的


SGD 方法一般可以快速收敛,但是对于海量数据的情况,单机无法承载这么大的数据量,所以在单机上是无法或者在较短的时间内无法完成上述迭代计算的,这时我们可以采用下面的 ALS 方法来求解,该方法可以非常容易做分布式拓展。


3.2  利用 ALS 来求解矩阵分解


ALS 方法是一个高效的求解矩阵分解的算法,目前 Spark Mllib 中的协同过滤算法就是基于 ALS 求解的矩阵分解算法,它可以很好地拓展到分布式计算场景,轻松应对大规模训练数据的情况(参考文献 6 中有 ALS 分布式实现的详细说明)。下面对 ALS 算法原理及特点做一个简单介绍。


ALS 算法的原理基本就是名字表达的意思,通过交替优化求得极值。一般过程是先固定 ,那么公式 1 就变成了一个关于 的二次函数,可以作为最小二乘问题来解决,求出最优的 后,固定 ,再解关于 的最小二乘问题,交替进行直到收敛。对工程实现有兴趣的读者可以参考 Spark ALS 算法的源码。相比 SGD 算法,ALS 算法有如下两个优势。


(1) 可以并行化处理


从上面 的更新公式中可以看到,当固定 后,迭代更新 时每个 只依赖自己,不依赖于其他的标的物的特征向量,所以可以将不同的 的更新放到不同的服务器上执行。同理,当 固定后,迭代更新 时每个 只依赖自己,不依赖于其他用户的特征向量,一样可以将不同用户的更新公式放到不同的服务器上执行。Spark 的 ALS 算法就是采用这样的方式做到并行化的。


(2) 对于隐式特征问题比较合适


用户真正的评分是很稀少的,所以利用隐式行为是更好的选择(其实也是不得已的选择)。当利用了隐式行为,那么用户行为矩阵就不会那么稀疏了,即有非常多的 对是非空的,计算量会更大,这时采用 ALS 算法是更合适的,因为固定 或者 ,让整个计算问题更加简单,容易求目标函数的极值。读者可以阅读参考文献 5,进一步了解隐式反馈利用 ALS 算法实现的原因及细节( Spark MLlib 中的 ALS 算法即是参考该论文来实现的)。



四、矩阵分解推荐算法的拓展与优化


前面几节对矩阵分解的原理及求解方法进行了介绍,我们知道矩阵分解算法是一个非常容易理解并易于分布式实现的算法。不光如此,矩阵分解算法的框架还是一个非常容易拓展的框架,可以整合非常多的其他信息及特性到该框架之下,从而丰富模型的表达空间,提升预测的准确度。本节我们就来总结和梳理一下矩阵分解算法可以进行哪些拓展与优化。


4.1整合偏差(bias)项


在第二节,用户u对标的物v的评分采用公式 来预测,但是不同的人对标的物的评价可能是不一样的,有的人倾向于给更高的评分,而有的人倾向于给更低的评分。对于同一个标的物,也会受到外界其他信息的干扰,影响人们对它的评价(比如视频,可能由于主演的热点事件导致该视频突然变火),这两种情况是由于用户和标的物引起的偏差。我们可以在这里引入 Bias 项,将评分表中观察到的值分解为 4 个部分:全局均值( global average ),标的物偏差( item bias ),用户偏差( user bias )和用户标的物交叉项( user-item interaction )。这时,我们可以用如下公式来预测用户 u 对标的物 v 的评分:



其中 是全局均值, 是标的物偏差, 是用户偏差, 是用户与标的物交叉项。那么最终的优化问题就转化为:
该优化问题同样可以采用 SGD 或者 ALS 算法来优化,该方法在开放数据集及工业实践上都被验证比不整合 Bias 的方法有更好的预测效果(见参考文献 8 )。


4.2  增加更多的用户信息输入


由于用户一般只对很少的标的物评分,导致评分过少,可能无法给该用户做出较好的推荐,这时可以通过引入更多的信息来缓解评分过少的问题。具体来说,我们可以整合用户隐式反馈(收藏、点赞、分享等)和用户人口统计学信息(年龄、性别、地域、收入等)到矩阵分解模型中。


对于隐式反馈信息,我们用 来表示用户有过隐式反馈的标的物集合。 是用户对标的物v的隐式反馈的嵌入特征向量(这里为了简单起见,我们不区分用户的各种隐式反馈,只要用户做了一次隐式反馈,认为有隐式反馈,即是采用布尔代数的方式来处理隐式反馈)。那么对用户所有的隐式反馈 ,累计的特征贡献为



我们可以对上式进行如下的归一化处理



对于用户人口统计学信息,假设 是用户的所有人口统计学属性构成的集合, 是属性 在嵌入特征向量空间的表示。那么用户 u 所有的人口统计学信息可以综合表示为



最终整合了用户隐式反馈和人口统计学信息后(包括偏差项)的用户预测公式可以表示为:



同样地,我们可以写出最终的优化目标函数。由于公式太长,这里不写出来了。该模型也可以用 SGD 和 ALS 算法来求解。


4.3  整合时间因素


到目前为止,我们的模型都是静态的。实际上,用户的偏好、用户对标的物的评分趋势、以及标的物的受欢迎程度都是随着时间变化的(读者可以阅读参考文献 11,对怎么在协同过滤中整合时间因素有更深入的了解)。


拿电影来说,用户可能原来喜欢爱情类的电影,后面可能会转而喜欢科幻喜剧类电影,所以我们用包含时间的 来表示用户的偏好特性向量。用户开始对某个视频偏向于打高分,经过一段时间后,用户看的电影多了起来,用户的审美越来越挑剔,所以一般不会再对一个电影打很高的分数了,除非他觉得真的特别好,因此,我们可以用包含时间的 来表示用户的偏差随着时间而变化。

对于标的物偏差也一样,一个电影可能开始不是很火,但是如果它的主演后面演了一部非常火的电影,也会将将原来的电影热度带到一个新的高度。比如,最近比较火的李现演的《亲爱的,热爱的》,导致李现人气高涨,他原来演的《南方有乔木》的百度搜索指数在《亲爱的,热爱的》播出期间高涨(见下面图 3 )。因此,我们可以用包含时间的 来表示标的物偏差随着时间的变化而变化的趋势。标的物本身的特征 ,我们可以认为是稳定的,它代表的是标的物本身的固有属性或者品质,所以不会随着时间而变化。


图3:《南方有乔木》在《亲爱的,热爱的》播出期间(2019.07.09播出)百度搜索指数高涨


基于上面的分析,我们最终的预测用户评分的公式整合时间因素后可以表达为


整合时间因素的模型效果是非常好的,具体可以阅读参考文献 8 进一步了解。

4.4  整合用户对评分的置信度


一般来说,用户对不同标的物的评分不是完全一样可信的,可能会受到外界其他因素的影响,比如某个视频播出后,主播发生了热点事件,肯定会影响用户对该视频的评价,节假日,特殊事件也会影响用户的评价。对于隐式反馈,一般我们用 0 和 1 来表示用户是否喜欢该标的物,多少有点绝对,更好的方式是引入一个喜欢的概率/置信度,用户对该标的物操作次数越多、时间越长、付出越大,相应的置信度也越大。因此,我们可以在用户对标的物的评分中增加一个置信度的因子 ,那么最终的优化公式就变为:




4.5  隐式反馈


参考文献 5 中有对隐式反馈矩阵分解算法的详细介绍,这里对一些核心点做讲解,让读者对隐式反馈有一个比较明确的认知。


用二元变量 表示用户 u 对标的物的偏好, =1 表示用户 u 对标的物 v 有兴趣, =0 表示对标的物 v 无兴趣。 是用户 u 对标的物的隐式反馈,如观看视频的时长,点击次数等等。 的关系见下面公式。



越大,有理由认为用户对标的物兴趣的置信度越高,比如一个文章读者看了好几篇,肯定比看一遍更能反映出读者对这篇文章的喜爱。具体可以用下面的公式来衡量用户 u 对标的物 v 的置信度



上式中 代表用户 u 对标的物 v 的偏好置信度, 是一个超参数,论文中作者建议取 ,效果比较好。


基于隐式反馈,求解矩阵分解可以采用如下的公式, 即是置信度, 定义如上面的公式。



上述隐式反馈算法逻辑将用户的操作 分解为置信度 和偏好 能够更好地反映隐式行为的特征,并且从实践上可以大幅提升预测的准确度。同时,通过该分解,利用代数上的一些技巧及该模型的巧妙设计,该算法的时间复杂度与用户操作行为总次数线性相关,不依赖于用户数和标的物数,因此非常容易并行化(读者可以参考文献 5 了解更多技术实现细节)。


隐式反馈也有一些缺点,不像明确的用户评分,无法很好地表达负向反馈,用户购买一个物品可能是作为礼物送给别人的,他自己可能不喜欢这个物品,用户观看了某个视频,有可能是产品进入视频详情页时是自动起播的,这些行为是包含很多噪音的。


4.6  整合用户和标的物metadata信息


参考文献 9 给出了一类整合用户和标的物 metadata 信息的矩阵分解算法,该算法可以很好地处理用户和标的物冷启动问题,在同等条件下会比单独的内容推荐或者矩阵分解算法效果要更好,该算法在全球时尚搜索引擎 Lyst 真实推荐场景下得到验证。我们在下面简单介绍一下该算法的思路。


表示所有用户的集合, 表示所有标的物的集合。 表示用户特征集合(年龄、性别、收入等), 表示标的物特征集合(产地、价格等)。 分别表示用户对标的物的正负反馈集合。 是用户 u 的特征表示(每个用户用一系列特征来表示)。同理, 表示标的物i的特征集合。


对于每个特征 ,我们用 分别表示用户和标的物嵌入到d维的特征空间的特征向量。 分别表示用户和标的物的 bias 项。


那么用户 u 的隐因子表示,可以用该用户的所有特征的嵌入表示之和,具体来说,可以表示为:



同理,标的物 i 的隐因子也可以用该标的物所有特征的嵌入向量的和来表示,具体如下:



我们分别用 表示用户 u 和标的物 i 的 bias 向量表示。那么,用户 u 对标的物i的预测评分可以用如下公式表示



其中, 可以采用如下的函数形式,



有了上面这些基础介绍,最终可以用如下的似然函数来定义问题的目标函数,通过最大化似然函数,求得 这些嵌入的特征向量。



上面利用特征的嵌入向量之和来表示用户或者标的物向量,这就很好地将 metadata 信息整合到了用户和标的物向量中了,再利用用户向量 和标的物向量 的内积加上 bias 项,通过一个 logistic 函数来获得用户 u 对标的物 i 的偏好概率/得分,从这里的介绍可以看到,该模型很好地将矩阵分解和 metadata 信息整合到了一个框架之下。感兴趣的读者可以详细阅读原文,对该方法做进一步了解(该文章给出了具体的代码实现,是一个非常好的学习资源,代码见 https://github.com/lyst/lightfm)。


五、近实时矩阵分解算法


前面三节对矩阵分解的算法原理、求解方法、拓展进行了详细介绍。前面介绍的方法基本上是适合做批处理的,通过离线训练模型,再为用户推荐。批处理比较适合对时效性要求不太高、消费标的物需要时间比较长的产品,比如电商推荐、长视频推荐等。而有些产品,比如今日头条、快手、网易云音乐,这类产品的标的物要么用户消费时间短要么单位时间内会产生大量标的物,用户很短的时间就听完了一首歌,每天有大量用户上传短时视频到快手平台。

针对这类产品,用离线模型不能很好的捕获用户的实时兴趣变化,另外,因为有很多新标的物加入进来,批处理也无法及时将新标的物整合到推荐中,解决这两个问题的方法之一是做近实时的矩阵分解,这样可以实时反映用户兴趣变化及更快地整合新标的物进推荐系统。


那么可以做到对矩阵分解进行实时化改造吗?答案是肯定的,业内有很多这方面的研究成果及工业实践应用,有兴趣的读者可以详细阅读参考文献 1、2、14、15、16、17,这 6 篇文章有对近实时矩阵分解算法的介绍及工程实践经验的案例分享。在本节我们讲解一种实时矩阵分解的技术方案,该方案是腾讯在 2016 年发的一篇文章上提供的(见参考文献 1 ),并且在腾讯视频上进行了实际检验,效果相当不错,该算法的实现方案简单易懂,非常值得借鉴。下面我们从算法原理和工程实现两个维度来详细讲解该算法的细节。


5.1  算法原理


该实时矩阵分解算法也是采用第四节 1 中整合偏差项来预测用户 u 对标的物 v 的评分,具体预测公式如下:



其中 是全局均值, 是标的物偏差, 是用户偏差, 是用户标的物交叉项。那么最终的优化问题就转化为:



我们定义


基于上面的最优化问题,我们可以得到如下的 SGD 迭代更新公式:



该论文采用跟第四节 5 中隐式反馈中一样的思路,用 表示用户 u 对标的物 v 的偏好置信度, 的计算公式如下,其中 a、b 是超参数, 分别是用户播放视频 v 的播放时长及视频 v 总时长。



该论文中也尝试过采用



这类线性公式,但是经过线上验证,上述对数函数的公式效果更好。


作者公司也是做视频的,作者曾经用公式




来计算视频的得分,其中 ratio 就是视频播放时长与视频总时长的比例,等价于上面的 ,log 是对数函数,上式中乘以 10 是为了将视频评分统一到 0 到10 之间,并且当 ratio=0 时, =0,当 ratio=1 时, =10。这个公式跟腾讯论文中的公式本质上是一致的。


采用对数函数是有一定的经济学道理在里面的,因为 是自变量 x 的递减函数,即导数(斜率)是单调递减函数,当自变量 x 越大时,函数值增长越慢,因此基于该公式的数学解释可以说明对数函数是满足经济学上的“边际效应递减”这一原则的。针对视频来说,意思就是你在看前面十分钟代表的兴趣程度是大于在最后看十分钟的,这就像你在很饿的时候,吃前面一个馒头的满足感是远大于吃了 4 个馒头之后再吃一个馒头的满足感的。


用户u对视频v的偏好 为二元变量, =1 表示用户喜欢视频 v (用户播放、收藏、评论等隐式行为), =0 表示不喜欢(视频曝光给用户而用户未产生行为或者视频根本没有曝光给用户),具体公式如下:



在近实时训练矩阵分解模型时,只有当 =1 的(隐式)用户行为才更新模型, =0 时直接将该行为丢弃,而更新时,学习率跟置信度成正比,用户越喜欢该视频,该用户行为对训练模型的影响越大,具体采用如下公式来定义学习率,它是 的线性函数。



具体的实时训练采用 SGD 算法,算法逻辑如下:


算法1:利用 SGD 实时训练矩阵分解算法


Input:用户操作行为,(用户 id,视频 id,具体隐式操作行为)三元组
(1)  计算
(2)  if =1 then
(3) if u is new, then
(4) Initialize
(5) end
(6) if v is new, then
(7)Initialize
(8)end
(9)Compute by
(10)Compute by
(11)
(12)
(13)
(14)
(15)  end


5.2  工程实现


上面讲完了实时训练矩阵分解算法的原理,下面我们来讲讲怎么为用户做推荐,以及在工程上怎么实现实时为用户做推荐。


首先,我们简单描述一下怎么为用户进行推荐。具体为用户生成推荐的流程如下图,一共包含 5 个步骤。下面分别对每个步骤的作用加以说明。


图4:为用户实时生成推荐的流程


步骤 1:获取种子视频集


种子是用户最近偏好(有过隐式反馈的)的视频,或者用户历史上有偏好的视频,分别代表了用户的短期和长期兴趣,这些行为直接从用户的隐式反馈行为中获取,只要前端对用户的操作埋点,通过实时日志收集就可以获取。


步骤 2:获取候选推荐视频集


一般来说,全量视频是非常巨大的,实时为用户推荐不可能对全部视频分别计算用户对每个视频的偏好预测,因此会选择一个较小的子集作为候选集(这即是召回的过程),我们需要确保该子集很大概率上是用户可能喜欢的,我们先计算出用户对该子集中每个视频的偏好评分,最终将预测评分最高的 topN 推荐给用户。


该论文通过选取步骤 1 中种子集的视频的相似视频作为候选集,因为种子视频是用户喜欢的,它的相似视频用户喜欢的概率也相对较大,所以这种方式的召回是有理论依据的。视频相似度会在后面介绍。


步骤 3:获取特征向量


从分布式存储中获取用户和候选集视频的特征向量,该向量会用于计算用户对候选集中视频的偏好。特征向量的计算会在后面介绍。


步骤 4:预测评分偏好


有了步骤3中的用户和视频特征向量,就可以用公式


来计算该用户对每个候选集中视频的偏好度。

步骤 5:候选集排序


步骤 4 计算出了用户对候选集中每个视频的偏好度,那么按照偏好度降序排列,就可以将 topN 的视频推荐给用户了。


当用户在前端进行隐式反馈操作时,用户的行为通过实时日志流到实时推荐系统,该系统根据上面 5 个步骤为每个用户生成推荐结果,用户最近及历史行为、视频相似度、用户特征向量、视频特征向量都存储在高效的分布式存储中(如 Redis、HBase、CouchBase 等分布式 NoSQL ),这 5 个步骤都是非常简单的计算,因此可以在几十毫秒之内为用户生成个性化推荐。最终的推荐结果可以插入(更新)到分布式存储引擎中,当用户在前端请求推荐结果时,推荐 web 服务器从分布式存储引擎中将该用户的推荐结果取出,并组装成合适的数据格式,返回到前端展示给用户。


用户最近及历史行为、视频相似度、用户特征向量、视频特征向量这些数据是通过另外一个后台实时程序来计算及训练的,跟推荐过程解耦,互不影响。在腾讯的文章中,是利用Storm来实现的,除了用Storm外,用Spark Streaming 或者 Flink 等流式计算引擎都是可以的,只是具体的实现细节不一样。

为了不拘泥于一种计算平台,下面结合个人的经验及理解,来讲解怎么生成这些在推荐过程中依赖的数据。这里我们抽象出实现的一般逻辑,具体生成数据的流程见下图,通过 4 个算子来完成数据生成过程,下面我们分别对这 4 个算子的功能加以说明。


图5:计算个性化推荐依赖的用户播放历史、视频相似度、用户&视频特征向量


算子1:提取用户隐式反馈行为


基于用户在前端对视频的隐式反馈,通过收集用户行为日志,做 ETL,将(用户id,视频 id,隐式操作,操作时间) 四元组插入消息队列(如 kafka ),供后面的算子使用。


算子2:生成用户反馈历史并存于分布式 key-value 存储中


基于消息队列中的用户行为四元组,将用户隐式反馈行为存于分布式存储中。注意,这里可以保留用户最近的操作行为及过去的操作行为,并且也可以给不同时间点的行为不同的权重,以体现用户的兴趣是随着时间衰减的。


算子3:计算视频之间的相似度


这里先说一下计算两个视频相似度的计算公式,腾讯这篇文章是通过如下3类因子的融合来计算两个视频最终的相似性的:
(1) 基于视频特征向量的相似性:
(2) 基于视频类型的相似性,其中 type(i) 是视频i的标签类型(如搞笑、时政等)



如果两个视频类型一样,类型相似性为 1,否则为 0 。


(3) 时间衰减因子






请到「今天看啥」查看全文