《现代推荐算法》矩阵分解系列(SVD,FunkSVD,BiasSVD)原理

Eliza ·
更新时间:2024-09-21
· 631 次阅读

/关注公众号 长歌大腿,发送“机器学习”关键字,可获取包含机器学习(包含深度学习),统计概率,优化算法等系列文本与视频经典资料,如《ESL》《PRML》《MLAPP》等。/
文章来源《现代推荐算法》矩阵分解系列(SVD,FunkSVD,BiasSVD)原理 .

奇异值分解(SVD)

奇异值分解(SVD)原理与主要应用在数据降维中,可以将这个用户物品对应的m×n矩阵M进行SVD分解,并通过选择部分较大的一些奇异值来同时进行降维,也就是说矩阵M此时分解为:

Mm×n=Um×kTDk×kVk×nM_{m \times n} = U_{m \times k}^{T}D_{k \times k}V_{k \times n}Mm×n​=Um×kT​Dk×k​Vk×n​

其中k是矩阵M中较大的部分奇异值的个数,一般会远远的小于用户数和物品树。如果我们要预测第i个用户对第j个物品的评分,则只需要计算,通过这种方法,可以将评分表里面所有没有评分的位置得到一个预测评分。通过找到最高的若干个评分对应的物品推荐给用户。

通过上面的简单原理讲解,大家可以看出这种方法简单直接。但是基于SVD的矩阵分解要求矩阵是稠密的,整个矩阵的所有位置不能有空白。有空白时M是没法直接去SVD分解的。所以,这就到了是为什么SVD主要应用的途径是“数据降维”,因为它提出的思维就是用来数据降维的。那么这种数学理论知识又扎实的算法,又想用在了推荐系统中,但是数据又要求稠密怎么办,第一个思路就是开头说的方法是对评分矩阵中的缺失值进行简单的补全,比如用全局平均值或者用用户物品平均值补全,得到补全后的矩阵。接着可以用SVD分解并降维。

有了上面的补全策略,传统SVD在推荐算法上依旧不太容易工业化应用。因为用户数和物品一般目前都是海量数据,任何一个平台一个数据库都是千万级数据,这也就是为什么分布式存储和云计算能够大面积应用的根本原因,。针对于海量数据的一个矩阵做SVD分解是非常耗时的。能够在数学理论完善的基础上加之更难,使数据要求不是稠密的,计算复杂度降低是一个可行的思路,针对于这两点,各位机器学习界大神做了各种优化,下面来看看实际可以用于推荐系统的矩阵分解。

FUNKSVD又称为LFM算法。

FunkSVD就是在SVD的技术上优化“数据稠密”+“计算复杂度告”+“只可以用来数据降维”难题的。一个矩阵做SVD分解成3个矩阵很耗时,同时还面临稀疏的问题,那么解决稀疏问题,同时只分解成两个矩阵呢?期望矩阵M这样进行分解成以下这个形式:

Mm×n=Pm×kTQk×nM_{m \times n} = P_{m \times k}^{T}Q_{k \times n}Mm×n​=Pm×kT​Qk×n​

SVD理论知识完善,在数据降维应用成熟,FunkSVD如何将矩阵M分解两个特征维度为P和Q再继续优化计算成了难题,这里各位机器学习大神提出了更久远更理论知识丰富的线性回归的思想。主要目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,他们给出的思路就是用均方差作为损失函数,来学习出的P和Q的参数。线性回归思维理论的好处是优化策略完善,梯度下降,理论知识成熟,计算难度低。

对于某一个用户评分,采用FunkSVD进行矩阵分解,则拟合函数表示为qiTpiq_{i}^{T}p_{i}qiT​pi​,采用均方差做为损失函数,则期望尽可能的小(损失函数极小值),如果考虑所有的物品和样本的组合,则我们期望最小化下式

∑i,j(mi,j−qjTpi)2\sum_{i,j}(m_{i,j}-q_{j}^{T}p_{i})^{2}i,j∑​(mi,j​−qjT​pi​)2

只要能够最小化损失上面的式子,并求出极值所对应的,就可以得到矩阵P和Q,那么对于任意矩阵M任意一个空白评分的位置,可以通过计算qjTpiq_{j}^{T}p_{i}qjT​pi​预测评分。

当然,在实际应用中,我们为了防止过拟合,会加入一个L2的正则化项,因此正式的FunkSVD的优化目标函数J(p,q)J(p,q)J(p,q)是这样的

argminpi,qj∑i,j(mi,j−qjTpi)2+λ(∥pi∥22+∥qj∥22) argmin_{p_{i},q_{j}} \sum_{i,j}(m_{i,j}-q_{j}^{T}p_{i})^{2} + \lambda (\left \| p_{i} \right \|_{2}^{2}+\left \| q_{j} \right \|_{2}^{2})argminpi​,qj​​i,j∑​(mi,j​−qjT​pi​)2+λ(∥pi​∥22​+∥qj​∥22​)

λ\lambdaλ为正则化系数。

对于这个优化问题,我们一般通过梯度下降法来进行优化得到结果。

将上式分别对求导得到:

∂J∂pi=−2(mij−qjTpi)qj+2λpi\frac{\partial J}{\partial p_{i}} = -2(m_{ij}-q_{j}^{T}p_{i})q_{j}+2 \lambda p_{i}∂pi​∂J​=−2(mij​−qjT​pi​)qj​+2λpi​
∂J∂qj=−2(mij−qjTpi)pi+2λqj\frac{\partial J}{\partial q_{j}} = -2(m_{ij}-q_{j}^{T}p_{i})p_{i}+2 \lambda q_{j}∂qj​∂J​=−2(mij​−qjT​pi​)pi​+2λqj​

则在梯度下降法迭代时的迭代公式为:

pi=pi+α((mi,j−qjTpi)qj−λpi)p_{i} = p_{i}+\alpha((m_{i,j}-q_{j}^{T}p_{i})q_{j}-\lambda p_{i})pi​=pi​+α((mi,j​−qjT​pi​)qj​−λpi​)
qj=qj+α((mi,j−qjTpi)pi−λqj)q_{j} = q_{j}+\alpha((m_{i,j}-q_{j}^{T}p_{i})p_{i}-\lambda q_{j})qj​=qj​+α((mi,j​−qjT​pi​)pi​−λqj​)

通过迭代我们最终可以得到P和Q,进而用于推荐。FunkSVD算法虽然思想很简单,但是在实际应用中效果非常好,这真是验证了大道至简。

BiasSVD的推荐算法

好了,我们知道一种了矩阵分解的FunkSVD算法,但是针对于这种打分,而且多半是以这种社交媒体或者网站平台为主,那么久会导致了很多商业问题和难点,很难做到合理化、公平化,因为有人的参与是最难的,经过了各种网站实时反馈,打开有以下几个问题:

人员问题(或者水军问题),就是参与人员的问题,比如有的人就是比较好说话,他对每一部看过的电影或者物品,都觉得很好,都给了很高的评分;也有一部分人艺术审美很高,比较严格,他对绝大部分都给了比大众水平低的分,当然这两部分人都有可能是水军,都是利益关联方,但是他们的数据是不准确的,不能反映真实大众的想法,怎么降低这部分误差成了关键。

作品问题,如说山寨电影,比如山寨物品,这部分本身就具有问题,而靠贴流量贴标签贴热点等状态,聚集了很多的评分,也反映不出真实大众的水平,所以降低这部分物品的误差也是关键。

全局问题,简单以电影为例,也许赶上了某一个时间段的大众审美热度,大家都去拍这个题材,而这个题材分数整体偏高了,如何降低这种全局偏差也成了关键。

解决上面三种问题的思维是上面机器学习流程里的优化问题,因为是属于提升问题,那么针对于机器学习最常用的优化就是“正则化”+“偏置项”,正则化是为了防止整个模型的过分拟合,偏置项是我既然知道参与的部分数据本身具有误差,那我人工手动提前去在损失函数里增加这部分偏差考虑,在计算求解中求出这个参数,然后应用在新的数据里就应该是更符合大众,更准确地数据了。

假设评分系统平均分为u,第i个用户的用户偏置项为bi,而第j个物品的物品偏置项为bj,则加入了偏置项以后的优化目标函数J(p,q)J(p,q)J(p,q)是这样的

argminpi,qj∑i,j(mi,j−μ−bi−bj−qjTpi)2+λ(∥pi∥22+∥qj∥22+∥bi∥22+∥bj∥22) argmin_{p_{i},q_{j}} \sum_{i,j}(m_{i,j}-\mu -b_{i}-b_{j}-q_{j}^{T}p_{i})^{2} + \lambda (\left \| p_{i} \right \|_{2}^{2}+\left \| q_{j} \right \|_{2}^{2}+\left \| b_{i} \right \|_{2}^{2}+\left \| b_{j} \right \|_{2}^{2})argminpi​,qj​​i,j∑​(mi,j​−μ−bi​−bj​−qjT​pi​)2+λ(∥pi​∥22​+∥qj​∥22​+∥bi​∥22​+∥bj​∥22​)

优化目标也可以采用梯度下降法求解。和FunkSVD不同的是,此时我们多了两个偏执项的迭代公式和FunkSVD类似,只是每一步的梯度导数稍有不同而已,这里就不给出了。而一般可以初始设置为0,然后参与迭代。这里给出bib_{i}bi​ bjb_{j}bj​的迭代方法

bi=bi+α(mi,j−bi−bj−μ−qjTpi−λbi)b_{i} = b_{i}+\alpha(m_{i,j}-b_{i}-b_{j}-\mu-q_{j}^{T}p_{i}-\lambda b_{i})bi​=bi​+α(mi,j​−bi​−bj​−μ−qjT​pi​−λbi​)
bj=bj+α(mi,j−bi−bj−μ−qjTpi−λbj)b_{j} = b_{j}+\alpha(m_{i,j}-b_{i}-b_{j}-\mu-q_{j}^{T}p_{i}-\lambda b_{j})bj​=bj​+α(mi,j​−bi​−bj​−μ−qjT​pi​−λbj​)

通过迭代最终可以得到P和Q,进而用于推荐。BiasSVD增加了一些额外因素的考虑,因此在某些场景会比FunkSVD表现好。


作者:yifan_nir



svd 矩阵分解 推荐算法 算法 矩阵

需要 登录 后方可回复, 如果你还没有账号请 注册新账号