什么是因子分解?在本文的含义表示:矩阵分解、因子分解机等等。而什么是矩阵分解、因子分解机?看完这篇文章你将会有答案。
传统推荐系统中的矩阵分解
在很多情况下,数据的一小段携带了数据集中的大部分信息,其他信息则要么是噪声,要么就是毫不相关的信息。矩阵分解可以将原始矩阵表示成新的易于处理的形式,这种新形式是两个或多个矩阵的乘积。
假设存在以下user和item的数据矩阵,这是一个极其稀疏的矩阵,这里把这个评分矩阵记为R,其中的元素表示user对item的打分。“?”表示未知的,也就是要你去预测的,现在问题来了:如何去预测未知的评分值呢?可以证明,对任意一个矩阵A,都有它的满秩分解:
user\item | 1 | 2 | 3 | … |
---|---|---|---|---|
1 | 5 | 4 | 4.5 | … |
2 | ? | 4.5 | ? | … |
3 | 4.5 | ? | 4.4 | … |
… | … | … | … |
有方法证明,对任意一个矩阵A,都有它的满秩分解。
那么刚才的评分矩阵R也存在这样一个分解,所以可以用两个矩阵P和Q的乘积来表示评分矩阵R:
R U ∗ I = P U ∗ K Q K ∗ I R_{U*I}=P_{U*K}\!Q_{K*I} RU∗I=PU∗KQK∗I
上图中的U表示用户数,I表示商品数。然后就是利用R中的已知评分训练P和Q使得P和Q相乘的结果最好地拟合已知的评分,那么未知的评分也就可以用P的某一行乘上Q的某一列得到了:
r ^ u i = q i T p u \widehat{r}_{u_i}=q_{i^T}\!p_u r ui=qiTpu
这是预测用户u对商品i的评分,它等于P矩阵的第u行乘上Q矩阵的第i列。这个是最基本的SVD算法。
举例:
具体来说,对于一个给定的用户行为数据集(数据集包含的是所有的user、item,以及每个user有过行为的item列表),使用矩阵分解建模后,我们可以得到如下模型:
R矩阵是user-item矩阵,Rij表示的是user i 对item j的兴趣度,这正是我们需要的值。P是user-class矩阵,Pij表示的是user i对class j的兴趣度;Q是class-item矩阵,矩阵值Qij表示的是item j在class i中的权重,权重越高越能作为该类的代表。\(q_i^T!p_u\)表示用户u和项目i的相互作用,也就是用户对项目表现出的感兴趣的程度。
####总结:
矩阵分解把一物多类、多维度的类别、类别权重这几类问题都解决了!
SVD:加入预测基准的矩阵分解
问题:
以上的矩阵分解只考虑到用户对各类别的偏好、物品在各类别上的权重。却并没有考虑到,用户宽松度(用户总是倾向给更低或更高分数)、电影口碑对用户评分结果的影响。
Baseline Predictors:
平均评分记作全局平均数u,使用向量 b i b_i bi表示电影i的评分相对于平均评分的偏差,向量 b u b_u bu表示用户u做出的评分相对于平均评分的偏差。
则预测分数值:
r ^ u i = u + b i + b u + q i T p u \widehat{r}_{u_i}=u+b_i+b_u+q_{i^T}\!p_u r ui=u+bi+bu+qiTpu
举例:
预测用户 J o e Joe Joe对 T i t a n n i c Titannic Titannic电影的评价。设,电影平均打分 μ = 3.7 μ=3.7 μ=3.7;用户 J o e Joe Joe挑剔,打分一般比平均分低 0.3 0.3 0.3; T i t a n n i c Titannic Titannic电影口碑好,比一般要高 0.5 0.5 0.5分; J o e Joe Joe对 T i t a n n n i c Titannnic Titannnic的基准预测是: 3.7 − 0.3 + 0.5 = 3.9 3.7-0.3+0.5=3.9 3.7−0.3+0.5=3.9
SVD++:一种加入隐式反馈的SVD模型
####隐式反馈
以上只是针对评分矩阵,用户直接给物品此时推荐打分的称之为显示反馈。存在一种隐式反馈,用户没有对物品进行过打分评价,但却有其他隐性的表示用户对该物品喜好的行为,比如浏览、收藏、点赞等行为。
在式中,隐式反馈被作为附加的项目隐因子加入模型中,附加的隐式反馈将每一个项目i与因子向量\({y_i}\in{R^f}\)联系起来,用于表示用户是否对该项目有过打分。
具体模型如下:
r ^ u i = u + b i + b u + q i T ( p u + ∣ R ( u ) ∣ − 1 / 2 ∑ j ∈ R ( u ) y j ) \widehat{r}_{u_i}=u+b_i+b_u+q_{i^T}\!(p_u+{|R(u)|}^{-1/2}\!{\sum}_{j\in{R(u)}}\!y_j) r ui=u+bi+bu+qiT(pu+∣R(u)∣−1/2∑j∈R(u)yj)
集合中R(u)包含了用户评价过的项目。在式中,用户被建模为 p u + ∣ R ( u ) ∣ − 1 / 2 ∑ j ∈ R ( u ) y j p_u+{|R(u)|}^{-1/2}\!{\sum}_{j\in{R(u)}}\!y_j pu+∣R(u)∣−1/2∑j∈R(u)yj里的内容。其中 P u P_u Pu通过用户的显式反馈(打分)学习得到; ∣ R ( u ) ∣ − 1 / 2 ∑ j ∈ R ( u ) y j {|R(u)|}^{-1/2}\!{\sum}_{j\in{R(u)}}\!y_j ∣R(u)∣−1/2∑j∈R(u)yj表示用户的隐式反馈行为: ∣ R ( u ) ∣ − 1 / 2 {|R(u)|}^{-1/2} ∣R(u)∣−1/2是相应的特征权重,通常采用这里的归一化项;\({y_i}\)表示隐式特征向量。
举例说明如下:
用户的有两种隐式反馈行为,一种为租赁历史,用\({N_1}(u)\)表示,另一种为浏览历史,用\({N_2}(u)\)表示。
那么SVD++的模型可以写为:
r ^ u i = u + b i + b u + q i T ( p u + ∣ N 1 ( u ) ∣ − 1 / 2 ∑ j ∈ ∣ N 1 ( u ) y j ( 1 ) + ∣ N 2 ( u ) ∣ − 1 / 2 ∑ j ∈ ∣ N 2 ( u ) y j ( 2 ) ) \widehat{r}_{u_i}=u+b_i+b_u+q_{i^T}\!(p_u+{|N^1(u)|}^{-1/2}\!{\sum}_{j\in{|N^1(u)}}\!{y_j}^{(1)}+{|N^2(u)|}^{-1/2}\!{\sum}_{j\in{|N^2(u)}}\!{y_j}^{(2)}) r ui=u+bi+bu+qiT(pu+∣N1(u)∣−1/2∑j∈∣N1(u)yj(1)+∣N2(u)∣−1/2∑j∈∣N2(u)yj(2))
因子分解机(FM)
因子分解机,借鉴了隐因子模型和矩阵分解的思想,但是将隐因子之间的内积表示为因子之间的交互关系。它是2010年提出来的新模型,它可以在极其稀疏的情况下预测可信赖的参数。
因子分解机就是一种通用模型,它的提出可以改变传统很多因式分解算法不足,因为传统的模型在遇到一个任务都需要进行模型建立,然后训练参数。因式分解机列出了的变量交互,使用了特征工程法来变换大部分因子分解的模型。的模型方程式可以在线性时间内被计算出来。而且它依赖于线性数量的参数。这样可以进行参数的直接优化和存储并且不需要存储大量的训练数据来进行预测。因子分解机也适用于所有的数据类型,可以用来预测任何的实值特征向量。相对于其他的矩阵分解模型来说,因子分解机是一个通用模型。
回顾一下多元多项式回归(加入了自相关项、交互项):
y ^ ( x ) = W 0 + ∑ i = 1 p W i X i + ∑ i = 1 p ∑ j > = i p W i , j X i X j \widehat{y}(x)=W_0+{{\sum}_{i=1}}^p\!W_i\!X_i+{{\sum}_{i=1}}^p\!{{\sum}_{j>=i}}^p\!W_{i,j}\!X_i\!X_j y (x)=W0+∑i=1pWiXi+∑i=1p∑j>=ipWi,jXiXj
####因子分解机模型
y ^ ( x ) = W 0 + ∑ i = 1 p W i X i + ∑ i = 1 p ∑ j > i p < V i , V j > X i X j \widehat{y}(x)=W_0+{{\sum}_{i=1}}^p\!W_i\!X_i+{{\sum}_{i=1}}^p\!{{\sum}_{j>i}}^p\!<V_i,V_j>\!X_i\!X_j y (x)=W0+∑i=1pWiXi+∑i=1p∑j>ip<Vi,Vj>XiXj
三阶及以上的FM模型不仅对每对变量间的相互作用进行建模,还对每三个变量之间的交互作用进行建模估计。首先去掉了自相关项,其次类别变量间的相互作用被因子分解。在多项式回归中,类别变量间的相互作用 W i j W_{ij} Wij与 W i j ∗ {W_{ij}^{*}} Wij∗与是相互独立的,而FM中用两个低秩矩阵的内积来近似表示。
####将变量间的交互作用投射到隐空间
< V i , V j > <V_i,V_j> <Vi,Vj>将变量之间的相互作用投射到了一个隐式空间,具体来说:
W i , j W_{i,j} Wi,j表示为:
W i , j ≈ < V i , V j > = ∑ f = 1 k V i , f V j , f W_{i,j}\approx<V_i,V_j>={{\sum}_{f=1}}^k\!V_{i,f}\!V{j,f} Wi,j≈<Vi,Vj>=∑f=1kVi,fVj,f
定义V_i为超参数,他表示了有k个属性因子的第i个变量。其中, < V i , V j > <V_i,V_j> <Vi,Vj>表示了两个变量的相互作用。
W i j ∗ {W_{ij}^{*}} Wij∗表示为:
W i , j ∗ ≈ < V i , V j ∗ > = ∑ f = 1 k V i , f V j ∗ , f W_{i,j^*}\approx<V_i,V_{j^*}>={{\sum}_{f=1}}^k\!V_{i,f}\!V{j^*,f} Wi,j∗≈<Vi,Vj∗>=∑f=1kVi,fVj∗,f
这样使得 W i , j W_{i,j} Wi,j与 W i j ∗ {W_{ij}^{*}} Wij∗之间共享了某种作用,这一特点使得尤其适用于那种数据十分稀疏,而又包含多类别变量的场景。当数据集中只有两种类别变量时(例如,用户和物品),与传统的矩阵分解模型是相等的。
线性时间复杂度
时间复杂度直接计算的话是 O ( k n 2 ) O(kn^2) O(kn2),因为所有的变量之间的相互作用关系都必须被计算。
∑ i = 1 p ∑ j > i p < V i , V j > X i X j {{\sum}_{i=1}}^p\!{{\sum}_{j>i}}^p\!<V_i,V_j>\!X_i\!X_j ∑i=1p∑j>ip<Vi,Vj>XiXj之中的参数并不同时需要来自i特征和j特征。所以可以通过因式分解的组合与优化之后将其时间复杂度降低到线性时间,公式变换为:
∑ i = 1 p ∑ j > i p < V i , V j > X i X j {{\sum}_{i=1}}^p\!{{\sum}_{j>i}}^p\!<V_i,V_j>\!X_i\!X_j ∑i=1p∑j>ip<Vi,Vj>XiXj
= 1 2 ∑ i = 1 p ∑ j = 1 p < V i , V j > X i X j − 1 2 ∑ i = 1 p < V i , V j > X i X i ={\frac{1}{2}}{{\sum}_{i=1}}^p\!{{\sum}_{j=1}}^p\!<V_i,V_j>\!X_i\!X_j-{\frac{1}{2}}{{\sum}_{i=1}}^p\!<V_i,V_j>\!X_i\!X_i =21∑i=1p∑j=1p<Vi,Vj>XiXj−21∑i=1p<Vi,Vj>XiXi
= 1 2 ( ∑ i = 1 p ∑ j = 1 p ∑ f = 1 k V i , f V j , f X i X j − ∑ i = 1 p ∑ f = 1 k V i , f V j , f X i X i ) ={\frac{1}{2}}({{\sum}_{i=1}}^p\!{{\sum}_{j=1}}^p\!{{\sum}_{f=1}}^k\!V_{i,f}\!V_{j,f}\!X_i\!X_j-{{\sum}_{i=1}}^p\!{{\sum}_{f=1}}^k\!V_{i,f}\!V_{j,f}\!X_i\!X_i) =21(∑i=1p∑j=1p∑f=1kVi,fVj,fXiXj−∑i=1p∑f=1kVi,fVj,fXiXi)
= 1 2 ∑ f = 1 k ( ( ∑ i = 1 p V i , f X i ) ( ∑ j = 1 p V j , f X j ) − ∑ i = 1 p V i , f 2 V j 2 ) ={\frac{1}{2}}{{\sum}_{f=1}}^k(({{\sum}_{i=1}}^p\!V_{i,f}\!X_i)({{\sum}_{j=1}}^p\!V_{j,f}\!X_j)-{{\sum}_{i=1}}^p\!V_{i,f}^2\!V_{j}^2) =21∑f=1k((∑i=1pVi,fXi)(∑j=1pVj,fXj)−∑i=1pVi,f2Vj2)
= 1 2 ∑ f = 1 k ( ( ∑ i = 1 p V i , f X i ) 2 − ∑ i = 1 p V i , f 2 V j 2 ) ={\frac{1}{2}}{{\sum}_{f=1}}^k({({{\sum}_{i=1}}^p\!V_{i,f}\!X_i)}^2-{{\sum}_{i=1}}^p\!V_{i,f}^2\!V_{j}^2) =21∑f=1k((∑i=1pVi,fXi)2−∑i=1pVi,f2Vj2)
重新组合和优化之后,该函数模型的时间复杂度降低到了线性时间 O ( k n ) O(kn) O(kn)。
####模型参数求解
此时,模型的参数变为 W 0 , W 1 , W 2 , . . . , W P , V 1 , 1 , . . . , V p , k W_0,W_1,W_2,...,W_P,V_{1,1},...,V_{p,k} W0,W1,W2,...,WP,V1,1,...,Vp,k。
同任何一种有监督学习一样,为优化模型参数,需要定义损失函数来最小化观测数据S与模型之间的误差,对观测数据集中的每一对,求出观测值y与预测值 y ^ \widehat{y} y 之间误差之和,并对其最小化,以求得最佳的参数集合 Θ \Theta Θ。
O P T ( S ) = a r g m i n Θ ∑ ( x , y ) ∈ S l ( y ^ ( x ∣ Θ ) , y ) OPT(S)=argmin_\Theta\sum_{(x,y)\in{S}}l(\widehat{y}(x|\Theta),y) OPT(S)=argminΘ(x,y)∈S∑l(y (x∣Θ),y)
损失函数 y y y的定义根据不同的任务而不同,对于回归问题,一般定义平方损失:
l ( y ^ ( x ) , y ) = ( y ^ ( x ) − y ) 2 l(\widehat{y}(x),y)={(\widehat{y}(x)-y)}^2 l(y (x),y)=(y (x)−y)2
对于二值分类问题,一般定义逻辑斯蒂损失:
l ( y ^ ( x ) , y ) = l o g ( 1 + e x p ( − y ^ ( x ) y ) ) l(\widehat{y}(x),y)=log(1+exp(-\widehat{y}(x)y)) l(y (x),y)=log(1+exp(−y (x)y))
另一方面, F M FM FM模型中包含了大量的参数,特别是因子分解维度取值较大时,这时需要加入正则化项来防止模型过拟合。在中,我们使用 l 2 l2 l2范数正则化,则优化函数变为:
O P T ( S ) = a r g m i n Θ ( ∑ ( x , y ) ∈ S l ( y ^ ( x ∣ Θ ) , y ) + ∑ θ ∈ Θ λ θ θ 2 ) OPT(S)=argmin_\Theta(\sum_{(x,y)\in{S}}l(\widehat{y}(x|\Theta),y)+\sum_{\theta\in\Theta}\lambda_{\theta}{\theta}^2) OPT(S)=argminΘ((x,y)∈S∑l(y (x∣Θ),y)+θ∈Θ∑λθθ2)
λ θ \lambda_{\theta} λθ表示正则化项的系数, ∑ θ ∈ Θ θ 2 \sum_{\theta\in\Theta}{\theta}^2 ∑θ∈Θθ2表示参数集合 Θ \Theta Θ的 L 2 L2 L2范数。得到优化函数后,可以用一些常见的优化学习方法,如交替最小二乘法、随机梯度下降、马尔科夫蒙特卡罗法、自适应随机梯度下降等进行参数的求解。这里不做一一介绍,下一位同学会给大家讲解交替最小二乘。
优势:
1.在稀疏数据进行参数预测失败的情况下,可以良好地预测。
2.有线性时间复杂度.
3.因子分解机适用于所有的数据类型,可以用来预测任何的实值特征向量。
4.传统的因子模型,每遇到一种新问题,都需要在矩阵分解的基础上建立一个新模型,并在学习参数过程中调节各种参数。FM可以进行参数的直接优化和存储并且不需要存储大量的训练数据来进行预测。
参考博客&文献:
http://blog.csdn.net/u010146543/article/details/48347683
http://blog.sina.com.cn/s/blog_628cc2b70102w4t3.html
http://blog.csdn.net/wjmishuai/article/details/71191945
余秋宏,《基于因子分解机的社交网络关系推荐研究》
向宇川,《基于因子分解模型的移动上下文推荐系统研究》