一、推荐系统
1.1 推荐系统的应用
电子商务,电影视频,音乐电台,社交网络,阅读,基于位置(外卖,打车),个性化邮件,个性化广告
1.2 什么是推荐系统
根据用户的 历史行为 / 点赞 / 页面停留时间 等来推荐用户感兴趣的物品
推荐系统根据用户的以下行为来判断用户当前的需求或感兴趣的点:
- 历史行为
- 社交行为
- 兴趣点
- 所处的上下文环境(上下班时间/周末等)
- …
1.3 推荐系统的意义
目前我们处于互联网数据大爆炸的时代,每天会接收到很多的信息,但是并不是每种信息都感兴趣,所以推荐系统也是解决信息过载问题的思路。
对用户而言:
- 可以找到更感兴趣的东西
- 帮助自己来做决策
- 发现新鲜事物
对商家而言:
- 可以提供个性化的服务,提高信任度和粘度
- 增加营收
1.4 推荐系统的结构
1.5 推荐系统的评估
- 用户满意度:问卷调查
- 预测准确度:评分RMSE, MAE; TopN推荐
- 覆盖率:发现长尾物品
- 多样性:覆盖用户不同兴趣
- 新颖性(流行度反过来)
- 惊喜度,信任度,实时性,健壮性(Robust)
- 商业目标(广告盈利)
1.5.1 准确度
1、打分系统(有用户的打分实际数值,如电影评分3分)
- r u i r_{ui} rui:用户 u u u对物品 i i i的实际评分
- r ^ u i \hat r_{ui} r^ui:用户 u u u对物品 i i i的预测评分
-
∣
T
∣
|T|
∣T∣:用户数量
2、Top N推荐(推荐前N个预测的)
系统不会让用户给自己喜欢的东西打分,可以根据停留时间来判断其喜好程度。
- R ( u ) R(u) R(u):根据训练数据建立的模型在测试集上对用户的推荐
- T ( u ) T(u) T(u):用户在测试集上的真实选择
准确率vs召回率
准确率:在推荐的商品中,哪些是真正感兴趣的
召回率:在推荐的商品中,占用户感兴趣商品的比例
3、覆盖率(对平台而言)
马太效应:好的越好,坏的越坏,多的越多,少的越少
覆盖率表示了对物品长尾的发掘能力
有两个判别准则,一个维覆盖率Coverage,另一个是熵
Coverage:假如推荐商品类别数量为9w个,而冷门商品虽然被推荐了5000个,但是可能每种只推荐了一次,热门的商品还是被推荐的多,所以仍然会有马太效应。
熵:由于覆盖率仍然会有马太效应,所以用熵来评估推荐物品种类的多样性,已知熵是度量样本不确定性的准则,所以我们希望H越大越好,因为当每个商品被推荐的概率基本相同的时候,熵最大,所以用熵来评估平台对不同商品的推荐覆盖率。
4、多样性(对用户而言)
对用户而言,用户希望系统推荐的某类东西有一定的多样性,也就是有差异,比如颜色,款式等。
5、新颖度:商品给用户的新鲜感(推荐其不知道的商品)
6、惊喜度:与用户的历史兴趣不相似,但是用户确满意的
7、信任度:提供可靠的推荐理由
8、实时性:实时更新程度
二、推荐系统的不同类型
2.1 基于内容
实例:
对不同的书进行推荐:
2.2 协同过滤
协同过滤是一种基于近邻的推荐算法,是根据用户在物品上的行为找到物品或用户的“近邻”。
用户在物品上的行为 ——> 同类用户/同一用户可能喜欢的不同物品
相似度/距离定定义(两者是成反比的):
2.2.1 基于用户的协同过滤(user based Collaborative Filtering)
基于用户有共同行为的物品,计算用户的相似度,找到“近邻”用户,对其近邻在新物品上的评价进行加权推荐。
- 假设有n个用户: u i , i = 1 , 2 , . . . , n u_i,i=1,2,...,n ui,i=1,2,...,n
- 假设有m个物品: p j , j = 1 , 2 , . . . , m p_j,j=1,2,...,m pj,j=1,2,...,m
- 得分矩阵 v n × m v_{n\times m} vn×m, v i × j v_{i\times j} vi×j表示用户i对物品j的打分
- 物品i和物品j的相似度
S
(
i
,
j
)
S(i,j)
S(i,j)
- 选取TopK推荐或加权预测得分
示例:
同样是对电影评分进行预估,可以通过求列和列之间的相似度,也就是用户和用户之间的相似度,来判定某些相似的用户,从而从和他相似的用户中预估其对电影的打分。
假如用户5和用户3、10的相似度较高,则用用户3和10对第一个电影的评分的加权平均作为用户5对电影1的评分。
2.2.2 基于物品的协同过滤(item-based CF)
基于有相同用户交互的物品,计算物品相似度(A和B),找到物品的近邻(B),对其他喜欢A的用户做推荐。
假设有两种商品A和B,则同时喜欢两者的人群可能是相似性较高的,所以可以判定A和B的相似性应该是接近的,故可以把B推荐给喜欢A的人群。
- 假设有n个用户: u i , i = 1 , 2 , . . . , n u_i,i=1,2,...,n ui,i=1,2,...,n
- 假设有m个物品: p j , j = 1 , 2 , . . . , m p_j,j=1,2,...,m pj,j=1,2,...,m
- 得分矩阵 v n × m v_{n\times m} vn×m, v i × j v_{i\times j} vi×j表示用户i对物品j的打分
- 物品i和物品j的相似度
S
(
i
,
j
)
S(i,j)
S(i,j)
- 选取TopK推荐或加权预测得分
示例:对空白处进行预估
空白填充的目的:为了根据用户已打分的电影,推断出其没看过的电影的评分,预估出评分之后,按大小排序,推荐预估分数高的电影。
求行和行之间的相似度:
2.2.3 协同过滤的对比
工业界对基于物品的协同过滤用的更多,因为:
- 用户量一般远远大于某类新闻量,计算用户相似度计算量很大
- 人是比较“善变”,兴趣会很快变化,但是物品不会,不同物品的相似度不会改变
- 基于物品的推荐会提供给用户理由,使得推荐更有说服力
协同过滤的优缺点:
2.2.4 协同过滤的冷启动问题
2.3 隐语义模型
用户的评分矩阵有的位置是空着的,我们希望尽量正确的填满未打分的项。
2.3.1 隐语义模型的思想:
肯定会有一些隐藏的因素会影响用户的打分,不一定是人可以直接理解的隐藏因子,但是总会是由些因素影响了你的打分,所以,我们找到隐藏因子,可以对用户和商品进行关联。**
隐语义模型:寻找可能影响用户打分的隐藏因子
2.3.2 假设
隐藏因子个数小于用户和商品数,因为如果每个user都对应一个独立的隐藏因子,就没法做预测了。
2.3.3 数学理解
- R矩阵:用户对物品的偏好信息
- P矩阵:用户对各个物品类别的偏好信息
- Q矩阵:各个物品所归属的物品类别信息
隐语义模型就是要将用户对物品的偏好信息R矩阵,分解为P和Q的乘积,即通过物品类别class将用户和物品联系起来。
假如一个电影刚好不是战争片(得分-1),而用户刚好不喜欢战争片(-1),两者相乘刚好是1,刚好匹配。
2.3.4 隐语义模型要解决的问题
-
如何对物品进行分类,分成几类?
-
如何确定用户对哪些物品类别有兴趣,兴趣程度如何?
-
对于一个给定的类,选择这个类中的哪些物品进行推荐,如何确定物品在某个类别中的权重?
2.3.5 隐语义模型的样本问题
隐语义模型在显性反馈数据(也就是评分数据)上能解决评分预测问题并达到了很好的精度。不过推荐系统主要讨论的是隐性反馈数据集,这种数据集的特点 是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣)。那么,在隐性反馈数据集上应用隐语义模型解决推荐的第一个关键问题就是如何 给每个用户生成负样本。我们发现对负样本采样时应该 遵循以下原则:
-
对每个用户,要保证正负样本的平衡(数目相似);
-
每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品:一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物 品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣;
2.3.6 隐语义模型推导
假设:
- U U U个用户
- I I I个物品
- R R R为打分矩阵
- K K K个隐含变量(也就是将物品分为K个类型这是根据经验和业务知识进行反复尝试决定的)
求解:
- 矩阵 P U , k P_{U,k} PU,k:用户U对第k个分类的喜爱程度
- 矩阵 Q k , I Q_{k,I} Qk,I:物品i属于类别k的权重
(1)传统奇异值分解SVD用于推荐
可以将这个用户物品对应的m×n矩阵M进行SVD分解,并通过选择部分较大的一些奇异值来同时进行降维,也就是说矩阵M此时分解为r如下,通过这种方法,我们可以将评分表里面所有没有评分的位置得到一个预测评分。通过找到最高的若干个评分对应的物品推荐给用户: M m × n = U m × k Σ k × k V k × n T M_{m×n}=U_{m×k}Σ_{k×k}V_{k×n}^T Mm×n=Um×kΣk×kVk×nT
SVD的限制:要补值
- SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置不能有空白。有空白时我们的M是没法直接去SVD分解的。
传统SVD采用的方法是对评分矩阵中的缺失值进行简单的补全,比如用全局平均值或者用用户物品平均值补全,得到补全后的矩阵。接着可以用SVD分解并降维。
- SVD的时间复杂度为O(m^3),用户数和物品一般都是超级大,随便就成千上万了。这么大一个矩阵做SVD分解是非常耗时的。
(2)FunkSVD算法用于推荐
FunkSVD如何将矩阵M分解为P和Q呢?这里采用了线性回归的思想。我们的目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的P和Q。
隐语义模型是根据如下公式来计算用户U对物品I的兴趣度:
如何找到矩阵P/Q的最佳参数:随机初始化之后,利用梯度下降法优化损失函数
损失函数:
下式为正则项:
对两组未知数求偏导:
利用随机梯度下降法得到递推公式:
其中α是在梯度下降的过程中的步长(也可以称作学习速率),这个值不宜过大也不宜过小,过大会产生震荡而导致很难求得最小值,过小会造成计算速度下降,需 要经过试验得到最合适的值。
迭代最终会求得每个用户对于每个隐分类的喜爱程度矩阵P和每个物品与每个隐分类的匹配程度矩阵Q。
在用户对物品的偏好信息矩阵R 中,通过迭代可以求得每个用户对每个物品的喜爱程度,选取喜爱程度最高而且用户没有反馈过的物品进行推荐,也就是还原矩阵的未打分项。
在隐语义模型中,重要的参数有以下4个:
1)隐分类的个数F;
2)梯度下降过程中的步长(学习速率)α;
3)损失函数中的惩罚因子λ;
4)正反馈样本数和负反馈样本数的比例ratio;
这四项参数需要在试验过程中获得最合适的值.1)3)4)这三项需要根据推荐系统的准确率、召回率、覆盖率及流行度作为参考, 而2)步长α要参考模型的训练效率。
(3) BiasSVD算法用于推荐
BiasSVD假设评分系统包括三部分的偏置因素:
- 一些和用户物品无关的评分因素,用户有一些和物品无关的评分因素,称为用户偏置项。
- 而物品也有一些和用户无关的评分因素,称为物品偏置项。这其实很好理解。比如一个垃圾山寨货评分不可能高,自带这种烂属性的物品由于这个因素会直接导致用户评分低,与用户无关。
- 总体偏置项
假设评分系统平均分为μ,第i个用户的用户偏置项为bi,而第j个物品的物品偏置项为bj,则加入了偏置项以后的优化目标函数J(p,q)是这样的
这个优化目标也可以采用梯度下降法求解。和FunkSVD不同的是,此时我们多了两个偏执项bi,bj,,pi,qj的迭代公式和FunkSVD类似,只是每一步的梯度导数稍有不同而已,这里就不给出了。而bi,bj一般可以初始设置为0,然后参与迭代。这里给出bi,bj的迭代方法
通过迭代我们最终可以得到P和Q,进而用于推荐。BiasSVD增加了一些额外因素的考虑,因此在某些场景会比FunkSVD表现好。
2.3.7 隐语义方法小结
FunkSVD将矩阵分解用于推荐方法推到了新的高度,在实际应用中使用也是非常广泛。当然矩阵分解方法也在不停的进步,目前张量分解和分解机方法是矩阵分解推荐方法今后的一个趋势。
对于矩阵分解用于推荐方法本身来说,它容易编程实现,实现复杂度低,预测效果也好,同时还能保持扩展性。这些都是它宝贵的优点。当然,矩阵分解方法有时候解释性还是没有基于概率的逻辑回归之类的推荐算法好,不过这也不影响它的流形程度。小的推荐系统用矩阵分解应该是一个不错的选择。大型的话,则矩阵分解比起现在的深度学习的一些方法不占优势。