[TOC]
个性化推荐算法实践第02章基于邻域的个性化召回算法LFM
本章节重点介绍一种基于邻域的个性化召回算法,LFM。从LFM算法的理论知识与数学原理进行介绍。并结合公开数据集,代码实战LFM算法。
个性化召回算法LFM(latent factor model)算法综述
- 包含了LFM背景,结合LFM的实例与求解方法。
- 以及LFM算法的应用场景。
LFM(latent factor model)理论知识与公式推导
- LFM在建模后如何定义损失函数
- 如何迭代到模型收敛得到模型参数
LFM(latent factor model)算法与CF算法的优缺点比较
- 从理论的体系的完整度,离线训练复杂度
- 在线推荐的可解释性
- 完成LFM与CF算法的优缺点比较
个性化召回算法LFM(latent factor model)算法综述
对于基于邻域的机器学习算法来说,如果要给一个用户推荐商品,那么有两种方式。
一种是基于物品的,另一种是基于用户的。
基于物品的是,从该用户之前的购买商品中,推荐给他相似的商品。
基于用户的是,找出于该用户相似的用户,然后推荐给他相似用户购买的商品。
但是,推荐系统除了这两种之外,还有其他的方式。例如如果知道该用户的兴趣分类,可以给他推荐该类别的商品。
为了实现这一功能,我们需要根据用户的行为数据得到用户对于不同分类的兴趣,以及不同商品的类别归属。
LFM—隐语义模型,属于协同领域。
- LFM算法的背景
提到协同领域,很多人首先想到的就是item CF与user CF,那么这里说到的LFM与这两者又有什么区别呢?
首先简单回忆一下item CF与user CF。
item CF:主体是item,首先考虑的是item层面。也就是说,可以根据目标用户喜欢的物品,寻找和这些物品相似的物品,再推荐给用户。
user CF:主体是user,首先考虑的是user层面。也就是说,可以先计算和目标用户兴趣相似的用户,之后再根据计算出来的用户喜欢的物品给目标用户推荐物品。
那么LFM呢?
LFM:先对所有的物品进行分类,再根据用户的兴趣分类给用户推荐该分类中的物品。
那LFM具体的意义是什么呢?
为了方便大家理解,这里通过item CF再进一步说明。
item CF算法,是将item进行划分,这样一旦item贡献的次数越多,就会造成两个item越相近。举个例子来说,就是当你看你喜欢的电视节目的时候,为了不错过精彩的内容,你广告部分也会看;这时,后台就会统计,你看了电视节目,也看了广告。这样就可能分析出电视节目与广告比较接近。
然而,事实上两者并不一样,如果我们知道两者属于不同的tag,我们不会将他们放到一起,进行降权处理。但是建立大量的tag体系就需要消耗大量的人力标注打标签,人力标注不适用。继而需要机器学习完成分类。在0-1搭建个性化推荐系统算法中显然是不切实际的。那么LFM算法就应运而生。
LFM是根据用户对item的点击与否,来获取user与item之间的关系,item与item之间的关系。
我的理解就是,LFM不仅会考虑item,也会考虑item。
2、什么是LFM算法
LFM算法输入:user对item的点击矩阵
LFM模型参数:每一个user的向量表示和每一个item的向量表示。
方式:用user矩阵和item矩阵的矩阵乘 拟合 user对item的点击矩阵
我们知道行向量乘以列向量是一个常数。完美情况下,user向量和item向量的相乘可以拟合点击矩阵的数值。我们可以看出本模型是从user对item的点击矩阵得到的user-item的向量。所以lfm也是矩阵分解的算法的一种。
LFM算法举例
输入:user对item的点击矩阵(1代表点击、0代表未点击)
user对item的点击矩阵
item1 | item2 | item3 | |
---|---|---|---|
user1 | 1 | 0 | 1 |
user2 | 0 | 1 | 0 |
user3 | 1 | 1 | 0 |
输出:
user1:[0.123, 0.325, …, 0.623], …
item1:[0.214, 0.034, …, 0.241], …
user和item的向量维度是自定义的,用user与item作内积即可判断user对item的偏好
图片左边是点击矩阵,user对item的行为矩阵(点击表示为1,没有点击表示为0)。图片右边是模型收敛得到的是use和item的向量。对于这个维度可以是之前设定的。维度可以理解为有哪一些特征会影响uers对item的喜好程度。特征例如:item title,是否含有图片,小清新的、吉他伴奏的、摇滚等等这些特征会影响用户的偏好。这里比如来说统计出来有7个特征。那么在模型设置的时候就可以把维度设置为7,得到的向量显然就是user1,Item1都会表示7维度的向量。那么将user1,item1的转置乘起来的话应该是一个常数。如果将每一个user和item的向量乘起来可以和点击矩阵的常数无限接近的话。那么这个模型的效果也就越好。
3、 LFM算法的应用场景举例
(1)获取user的item推荐列表(计算用户toplike)
模型得到了user和item的向量,针对于用户没有被展现的item,我们可以计算出他的一个用户对item的倾向性得分。取top即toplike,后直接完成用户对item的喜爱度列表,写入离线即可完成对在线的推荐。
(2)获取item间的相似度列表(计算item的topsim)
得到item的向量可以用很多表示距离的公式包括cos等等,计算出每一个item的相似度矩阵,该矩阵可以用于线上推荐。当用户点击item之后,给其推荐与该item的topsim item。
(3)挖掘item间隐含topic挖掘(计算item的topic)
根据得到的item向量,可以用聚类的方法,如K-means,层次聚类等等,取出一些隐含的类别。也就是一些隐含的topic,能将item分成不同的簇,推荐时按簇推荐
LFM(latent factor model)理论知识与公式推导
本小节主要从数学上重点介绍LFM,主要从建模方法、迭代、收敛等方面认识LFM算法
(1)LFM建模公式
p(u,i)表示user-item对,如果user点击了item,那么p(u,i)=1,否则p(u,i)=0。模型的最终输出为user向量和item向量,即$p_u$和$q_i$。其中F表示维度,也就是上一小节阐述的user对item喜欢与否的影响因素的个数。
那么具体如何得到$p_u$和$q_i$呢?
我们用机器学习中监督学习的思想解决。在F设定好之后,$p_{u}$和$q_{i}$可以用随机数进行初始化,初始化之后,如何进行迭代呢?
这里采用的方法是梯度下降。分别从损失函数对user向量的偏导和损失函数对item向量的偏导,以及user向量对item向量的迭代来分别介绍。
(2)损失函数
LFM loss function
解释公式:p(u,i)是训练样本的label,也就是说如果user点击了item,那么p(u,i)=1,否则p(u,i)=0。后面项是模型预估的user对item喜好程度,也就是前面所说的模型产出的参数p_{u}和q_{i}转置的乘积。这里的D是所有的训练样本的集合。
可以看到如果模型预估的数值与label越接近的话,损失函数数值越小,反之则越大。这里为了防止过拟合,增加了正则化项。如下公式,前半部分是将模型对于user-item对的喜好程度,并进行展开,是前面建模公式中讲到的,得到如下:
这里$\partial$是正则化系数,是用来平衡平方损失与正则化项,这里采用的是L2正则化,正则化目的是为了让模型更加简单化,防止由于$p_{u}$和$q_{i}$过度拟合训练样本中的数据使模型的参数过度复杂,造成泛化能力减弱。
(3)LFM算法迭代
损失函数对$p_{uf}$和$q_{if}$的偏导:
$\frac{\partial l o s s}{\partial p_{u f}}=-2\left(p(u, i)-p^{L E M}(u, i)\right) q_{i f}+2 \partial p_{u f}$
$\frac{\partial l o s s}{\partial q_{i f}}=-2\left(p(u, i)-p^{L F M}(u, i)\right) p_{u f}+2 \partial q_{i f}$
损失函数对$p_{uf}$和$q_{if}$的偏导之后,我们应用梯度下降的方法可以看到:
$p_{u f}=p_{u f}-\beta \frac{\partial l o s s}{\partial p_{u f}}$
$q_{i f}=q_{i f}-\beta \frac{\partial l o s s}{\partial q_{i f}}$
其中,$\beta$是learning rate,即学习率。
编程时候也会按照上述思路来实现代码。
(4)影响因素
哪些参数的设定会影响最终的模型效果?
1.负样本的选取
比起正样本,负样本的数量是非常多的。因为,展现给用户的item比用户点击的item要多的多。我们要有一定的负采样规则,我们选取那些充分展现而用户没有点击的item作为负样本。
那么什么叫做充分展现?
充分展现是指,这个item在所有的用户中,已经有了比较高的展现次数。
然后,我们就可以用user没有点击过的物品中,按照该item在所有用户中的展现次数做排序(来降序),取一定数目的item作为负样本。这个一定数目只要保证对该user来说,它的正负样本均衡就可以。比如,一个用户点击了100个item,那么同样也取100个负样本来保证正负样本的均衡。
2.隐特征F、正则参数$\partial$、学习率(learning rate $\beta$)
以上是对模型比较重要的三个参数。
其中正则参数$\partial$和学习率(learning rate $\beta$)通常设置为0.01-0.05,隐特征个数F通常设置为10-32之间。
当然你可以在实验过程中,根据具体数据分布来固定一些参数,对另一些参数做差异化实验。
比如说我们固定了正则参数$\partial$和学习率(learning rate $\beta$)都为0.01的情况下,我们来变隐特征F,将它从16-32-64等等取值来看最终的效果。上述的一些参数对模型的快速收敛和模型效果都是非常重要的。
LFM(latent factor model)算法与CF算法的优缺点比较
对于用户比较多的系统,用item CF比user CF更加具有可行性。
1.理论基础
LFM是比较传统的监督学习的打法,根据训练样本的label设定损失函数,利用最优化的方法使损失函数最小化。只不过这里的特征是隐特征,不像其他模型中的特征那样直观。
item CF是基于公式间求解相似度矩阵,相对来说,缺少了学习的过程。
所以,从理论基础的完备性上,LFM相对更好。
2.离线计算空间、时间复杂度
空间复杂度方面:item CF需要存储item sim表,需要的空间复杂度=物品数的平方;而LFM只需要存储user向量和item向量,所以空间复杂度=物品数目隐类数+用户数目隐类数。
相比较而言,显然LFM的空间复杂度更低。
时间复杂度方面:假设有M个用户,他们的平均点击序列长度为K,那么计算item相似度矩阵的时间复杂度=MKK;假设有D个样本,迭代N次,F是隐类的个数,那么训练LFM模型所需要的时间复杂度=DFN。由于LFM需要迭代,所以在耗时上略高于item CF,但是它们的耗时处于同一数量级。
3.在线推荐与推荐解释
item CF可以将item sim矩阵写入redis或者内存,线上基于用户实时点击去推荐,可以做到较好的响应用户的实时行为。
LFM由于得到user和item向量,在计算用户的toplike物品的时候,如果推荐系统的物品总量很大,那么就需要将每一个item做向量的点乘运算,复杂度是比较高的,离线计算相对来说比较耗时。得到用户的toplike物品表之后,也是写入redis或者内存之中,线上用户访问系统的时候,直接推荐计算好的toplike列表。但是这样就不能对用户的实时行为进行感知。现在像facebook也推出了一些向量召回的引擎,可以做到在线实时召回,但是依然也不能够在用户有了新行为之后立刻重新训练LFM模型得到新的向量。
所以,这这一方面,LFM效果略差。