一、常见推荐算法的分类
1. 基于内容的推荐:
- 我们主要是利用物品的静态属性,向用户推荐其喜欢的且相似的内容。
2.协同过滤:
协同过滤是推荐系统的主流思想之一。
- 基于邻域的协同过滤:UserCF/ItemCF
- 基于模型的协同过滤:
- 隐语义模型(LFM/Latent Factor Model):
- 矩阵分解(MF)、LDA/LSA/pLSA
- 基于贝叶斯网络
- 基于SVM
Q:什么是隐语义模型:
A:
- 用户与物品之间存在隐含的联系
- 通过隐含特征(latent factor)联系用户兴趣和物品,基于用户行为的自动聚类
- 我们可以指定隐特征的个数,粒度可粗(隐特征少)、可细(隐特征多)
- 计算物品属于每个隐特征的权重,物品有多个隐特征的权重
- 但是隐特征的可解释性比较差,相比之下基于邻域的推荐更好理解。
Q:基于模型和基于邻域的推荐之间的区别:
A:
- 基于邻域的协同过滤推荐包括UserCF、ItemCF,其原理是将用户的所有数据读入到内存中并进行运算,同时这个也称为基于内存的协同过滤(Memory-based)。在数据量较少的情况下,可以进行实时推荐。
- 基于模型的协同过滤推荐,是采用机器学习的方法,将数据集分为训练集和测试集。一般用于离线训练,其训练时间较长,在训练完成后,其推荐过程较快。
二、矩阵分解简析
在推荐系统中,有两大应用场景
- 评分预测(Rating Prediction)
主要是用于评价网站,比如用户给自己看过的电影、书籍评过多少分。矩阵分解技术主要就是用于评分预测的问题。 - Top-N推荐(Item Ranking)
常用于购物网站,但是不易拿到用户的显式评分,但是可以通过用户的隐式反馈为用户推荐一个可能感兴趣的Item列表。排序任务,需要对排序模型进行建模。
在矩阵分解的过程中会用到隐语义模型LFM,这里的分解对象可以是相似度,也可以是评分矩阵。我们以评分矩阵为例子,整个数据集可以看做一张很大的矩阵,行是用户,列是物品,其中对应的值是用户对物品的打分。但是很显然,这个矩阵是很稀疏的,不可能每个人都对所有物品打过分。那这个时候我们可以考虑对这个原始矩阵进行分解:
M
∗
N
=
=
>
M
∗
K
+
K
∗
N
M
:
用
户
N
:
物
品
K
:
超
参
数
,
表
示
物
品
/
用
户
的
隐
特
征
的
种
类
M*N ==> M*K + K*N\\ M:用户\\ N:物品\\ K:超参数,表示物品/用户的隐特征的种类
M∗N==>M∗K+K∗NM:用户N:物品K:超参数,表示物品/用户的隐特征的种类
上式是将一个M✖N的原始矩阵,转换成为M✖K和K✖N的矩阵,一个是M个用户在K个隐特征维度上的映射,另一个N个物品在K个隐特征维度上的映射。
举个例子:
在一个电影的评分矩阵,我们要为用户找出其感兴趣的Item并推荐给他,在上图中有12个用户,9个电影,但是评分的数据是稀疏的。所以矩阵分解就是预测出矩阵中缺失的评分,使得预测评分能反应用户的喜欢程度,并把Top-N个电影推荐给用户。
在矩阵分解中,只有评分矩阵的得分是已知的,我们需要学习出User矩阵和Item矩阵,使得预测评分和真实评分的差异不断缩小。
在我们学得User矩阵和Item矩阵后,把这两个矩阵相乘,就能得到用户对每部电影的预测评分,评分值越大,表示该用户喜欢该电影的可能性越大,该电影就越值得推荐给用户。
我们根据用户向量和物品向量的内积求得用户u对物品i的预测批评分,所以有以下目标函数:
m
i
n
X
,
Y
∑
r
u
i
≠
0
(
r
u
i
−
x
u
T
⋅
y
i
)
+
λ
(
∑
u
∣
∣
x
u
∣
∣
2
2
+
∑
i
∣
∣
y
i
∣
∣
2
2
)
r
u
i
:
表
示
用
户
u
对
物
品
i
的
评
分
x
u
:
表
示
用
户
u
的
向
量
,
k
维
列
向
量
y
i
:
表
示
物
品
i
的
向
量
,
k
维
列
向
量
用
户
矩
阵
X
=
[
x
1
,
x
2
,
x
3
,
.
.
.
,
x
n
]
物
品
矩
阵
Y
=
[
y
1
,
y
2
,
y
3
,
.
.
.
,
y
n
]
\begin{aligned} &min_{X,Y}\sum_{r_{ui}≠0}(r_{ui}-x_u^T\cdot y_i)+\lambda(\sum_u||x_u||_2^2+\sum_i||y_i||_2^2)\\ &r_{ui} :表示用户u对物品i的评分\\ &x_u:表示用户u的向量,k维列向量\\ &y_i:表示物品i的向量,k维列向量\\ &用户矩阵X = [x_1,x_2,x_3,...,x_n]\\ &物品矩阵Y = [y_1,y_2,y_3,...,y_n] \end{aligned}
minX,Yrui=0∑(rui−xuT⋅yi)+λ(u∑∣∣xu∣∣22+i∑∣∣yi∣∣22)rui:表示用户u对物品i的评分xu:表示用户u的向量,k维列向量yi:表示物品i的向量,k维列向量用户矩阵X=[x1,x2,x3,...,xn]物品矩阵Y=[y1,y2,y3,...,yn]
三、目标函数的优化方法
有了目标函数之后,我们就需要通过优化方法对函数中的参数进行优化,使得loss减小,达到逼近真实值的效果。
对于目标函数最优化问题的解决办法如下:
- ALS,Alternating Least Square - 最小交替二乘法
- SGD,Stochastic Gradient Descent - 随机梯度下降
ALS的优化步骤
- 对于目标函数,我们可以先初始化矩阵Y,并固定矩阵Y,并优化矩阵X
- 紧接着,再固定矩阵X,优化矩阵Y
- 重复步骤1,2,直到X,Y不断收敛,使得目标函数减小
SGD的优化思路
SGD是以随机的方式遍历整个数据集,并给出每个已知评分的预测评分。用户和物品特征向量的调整就沿着评分误差越来越小的方向进行迭代更替,直到误差达到要求。所以SGD是不需要遍历所有样本即可完成特征向量的求解。
[^1]: 让变量沿着目标函数的负梯度方向进行移动,直到移动至极小值点。
既然提到了梯度下降,就先把梯度下降的公式贴出来:
梯度下降的方法除了SGD随机梯度下降,还有
- 批量梯度下降:在每次更新时会用到所有的样本,效果比较稳定,收敛慢
- mini-batch梯度下降:在每次更新时会用到b个样本(b<总样本数),收敛速度比较快。
四、MF公式的改进
先贴上MF公式:
r
u
i
=
q
i
T
⋅
p
u
r
u
i
:
表
示
预
测
的
评
分
q
i
:
表
示
物
品
在
隐
特
征
维
度
的
映
射
p
u
:
表
示
用
户
在
隐
特
征
维
度
的
映
射
\begin{aligned} &r_{ui}=q_i^T\cdot p_u\\ &r_{ui} :表示预测的评分\\ &q_i:表示物品在隐特征维度的映射\\ &p_u:表示用户在隐特征维度的映射 \end{aligned}
rui=qiT⋅purui:表示预测的评分qi:表示物品在隐特征维度的映射pu:表示用户在隐特征维度的映射
这时候需要考虑一种情况,就是如果用户打分比较苛刻,总分5分,3分已经是其最好的评分;又或者说,一个物品刚上架,受欢迎度比较火热,评分比较高。这些情况称之为打分偏置,即用户偏置/物品偏执,这个时候我们的推荐会根据评分的基线(即均分)去考虑问题。再细讲之前先上公式:
r
u
i
=
μ
+
b
i
+
b
u
+
q
i
T
⋅
p
u
+
λ
(
b
i
2
+
b
u
2
+
∣
∣
q
i
∣
∣
2
+
∣
∣
p
u
∣
∣
2
)
r
u
i
:
表
示
预
测
的
评
分
q
i
:
表
示
物
品
在
隐
特
征
维
度
的
映
射
p
u
:
表
示
用
户
在
隐
特
征
维
度
的
映
射
μ
:
表
示
所
有
评
分
信
息
的
平
均
分
b
i
:
表
示
物
品
打
分
的
偏
置
b
u
:
表
示
用
户
打
分
的
偏
置
\begin{aligned} &r_{ui}=\mu+b_i+b_u+q_i^T\cdot p_u+\lambda(b_i^2+b_u^2+||q_i||^2+||p_u||^2)\\ &r_{ui} :表示预测的评分\\ &q_i:表示物品在隐特征维度的映射\\ &p_u:表示用户在隐特征维度的映射\\ &\mu:表示所有评分信息的平均分\\ &b_i:表示物品打分的偏置\\ &b_u:表示用户打分的偏置 \end{aligned}
rui=μ+bi+bu+qiT⋅pu+λ(bi2+bu2+∣∣qi∣∣2+∣∣pu∣∣2)rui:表示预测的评分qi:表示物品在隐特征维度的映射pu:表示用户在隐特征维度的映射μ:表示所有评分信息的平均分bi:表示物品打分的偏置bu:表示用户打分的偏置
根据上面的公式举个例子理解一下,如果一个评分表有所有电影的打分信息,我们可以从中了解到这些打分信息的平均分为3分,这时候刚上了一部电影,很受大家欢迎,该电影的均分为4.5分。小明是一个比较严苛的用户,平时打分的均分都在2.5分。所以这个时候有
μ
:
均
分
3
分
b
i
物
品
的
偏
置
分
:
4.5
−
3
=
1.5
分
b
u
用
户
的
偏
置
分
:
2.5
−
3
=
−
0.5
分
∴
μ
+
b
i
+
b
u
=
3
+
1.5
+
(
−
0.5
)
=
4
分
\mu:均分3分\\ b_i物品的偏置分:4.5-3 = 1.5分\\ b_u用户的偏置分:2.5-3 = -0.5分\\ \therefore\mu+b_i+b_u=3+1.5+(-0.5)=4分
μ:均分3分bi物品的偏置分:4.5−3=1.5分bu用户的偏置分:2.5−3=−0.5分∴μ+bi+bu=3+1.5+(−0.5)=4分
四、MF算法的应用
在算法实际运用中,我们会采用SVD矩阵分解的方法,通过调包Surprise可以直接使用。除此之外,Surprise包还有基于协同过滤的KNN算法;基于基于统计的基准线预测打分的算法BaselineOnly等等。