矩阵分解
前记
矩阵分解在推荐系统里面应该说是最经典、最有代表性的算法了。除了基础 举证分解方法,后面衍生出了各种关于分解的方法,分解机、张量分解等等,我们来看看。
SVD
原始的SVD又名奇异值分解,如果是用户评分矩阵,首先需要对缺失值进行简单的不全,比如用全局平均,然后用SVD进行分解其中,R为原始的评分矩阵,维度是mn,U和V分贝是一个km和kn的正交矩阵,S为kk的对角矩阵,对角线上的每一个元素都是矩阵的奇异值。这种纯数学的方法计算量特别大,实际应用中的数据根本处理不了。Simon Funk的Funk-SVD方法解决了这个问题,思想很简单:直接通过训练集的观察值利用最小化RMSE学习P、Q矩阵,这就是机器学习的思想了。
SVD++
SVD矩阵分解非常成功,有很多的迭代的方法,最有名的就是SVD++了。提SVD++之前,我们先看一个简单的BiasSVD:
- 为训练集中所有记录的平均全局数
- b_u 为用户的偏置项,表示用户的评分偏好
- b_i 为物品的偏置项,表示物品的本身质量
如果将用户历史行为对用户评分预测影响考虑进来就是SVD++算法:
SVD++的核心思想是把基于领域的itemCF算法用矩阵分解的方法实现,转换的方法是这样的:
- itemCF算法其实可以转变成
- 把不再看成是物品的相似度矩阵,而是一个和P、Q一样的参数。对w矩阵也进行分解,把参数个数降低到2nF个, 其中是两个F维的向量
- 为了不增加太多参数导致过拟合,令x=q,这样就能得到上面的SVD++的模型了。
时间信息也是非常重要的,所有SVD++模型融合时间效应往往效果更好
具体的优化和迭代方法就不赘述了。
隐式反馈矩阵分解
spark的隐式反馈方法解析见https://www.jianshu.com/p/7d59612f9f49,核心思想是将观察到的隐式反馈值进行预测值和置信度的映射,重新改写了优化目标。
FM
FM是目前非常经典的广义分解算法,Factorization Machines with libFM
FM为什么是广义分解算法,因为如果把user和item分别进行one-hot编码feed给FM,MF就变成了一个biased的FM模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等。对于FM而言,我们可以加任意多的特征,比如user的历史购买平均值,item的历史购买平均值等,但是MF只能局限在两类特征。SVD++与MF类似,在特征的扩展性上都不如FM,在此不再赘述。
后面的FFM是FM的一个演进,通过引入field的概念,FFM把相同性质的特征归于同一个field,使得每两组特征交叉的隐向量都是独立的,可以取得更好的组合效果,但是使得计算复杂度无法通过优化变成线性时间复杂度。一般情况都是比FM效果更好,事实上,FM 可以看做只有一个场的 FFM。
基于特征的矩阵分解
svdFeature也是一种通用的分解模型,有能给把特征信息加入到矩阵分解中,比如时序信息,领域信息、层次信息等,具体分析见Feature-Based Matrix Factorization
张量分解
张量就是矩阵的推广,矩阵是二维关系建模,张量是N维关系建模。这个计算量太复杂了
开源工具
QMF:Quara出的单机多线程的加权ALS矩阵分解和BPR矩阵分解
lightfm:单机多线程的SVD矩阵分解、SVD++矩阵分解、BPR矩阵分解
spark:基于ALS的矩阵分解
LibFM : FM的单机多线程版本
SVD-Feature:基于特征的矩阵分解单机多线程版本
xlearn:FM和FFM的单机多线程版本
libffm:FFM的单机多线程版本
参考资料
《推荐系统实战》
https://tracholar.github.io/machine-learning/2017/03/10/factorization-machine.html
https://tech.meituan.com/deep_understanding_of_ffm_principles_and_practices.html