因子分解机(FM,FFM,DeepFM,libfm,xlearn)

因子分解机

MF的局限性以及因子分解机

在之间的博客中具体描述了矩阵分解在推荐系统的应用,介绍了funkSVD,BiasSVD,SVD++等算法,这些算法的思想是将rateing矩阵分解为user矩阵和item矩阵的乘积。
但是在实际的推荐系统中,除了user和item特征,还有很多其他特征也需要加以应用,实际中一个预测问题包含的特征维度可能很多,因此有了后来的FM,FFM以及与DNN结合的deepFM算法。它们除了可以利用user和item特性外还能利用上其他特性对结果进行预测。
下面分别介绍这几种算法:

FM算法

对于特征向量: X = ( x 1 , x 2 , … , x n ) T X = {\left( {{x_1},{x_2}, \ldots ,{x_n}} \right)^T} X=(x1,x2,,xn)T
目标估计函数: y ∧ ( x ) = w 0 + w 1 x 1 + w 2 x 2 + … w n x n = w 0 + ∑ i = 1 n w n x n \mathop y\limits^ \wedge (x) = {w_0} + {w_1}{x_1} + {w_2}{x_2} + \ldots {w_n}{x_n} = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} y(x)=w0+w1x1+w2x2+wnxn=w0+i=1nwnxn
对于二阶表达式: y ∧ ( x ) = w 0 + ∑ i = 1 n w n x n + ∑ i = 1 n ∑ j = i + 1 n w i j x i x j \mathop y\limits^ \wedge (x) = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} + \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} } y(x)=w0+i=1nwnxn+i=1nj=i+1nwijxixj
使用Wij进行二阶特征组合的参数估计存在问题,即如果观察样本中没有出现过该交互的特征分量,那么直接估计将为0。
二阶特征代表了特征之间的两两组合,考虑了两个特征变量之间的交互影响。
对于Wij的估计,转换成了矩阵分解MF问题
y ∧ ( x ) = w 0 + ∑ i = 1 n w n x n + ∑ i = 1 n ∑ j = i + 1 n w i j x i x j = w 0 + ∑ i = 1 n w n x n + ∑ i = 1 n ∑ j = i + 1 n ⟨ V i , V j ⟩ x i x j \mathop y\limits^ \wedge (x) = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} + \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} }\\ = {w_0} + \sum\limits_{i = 1}^n {{w_n}{x_n}} + \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.{x_i}{x_j}} } y(x)=w0+i=1nwnxn+i=1nj=i+1nwijxixj=w0+i=1nwnxn+i=1nj=i+1nVi,Vjxixj
⟨ V i , V j ⟩ : = ∑ f = 1 k v i , f ⋅ v j , f \left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.: = \sum\limits_{f = 1}^k {{v_{i,f}} \cdot {v_{j,f}}} Vi,Vj:=f=1kvi,fvj,f
直接计算,复杂度为O(k*n^2)
n是特征个数,k是特征的embedding size
∑ i = 1 n ∑ j = i + 1 n ⟨ V i , V j ⟩ x i x j = 1 2 ∑ i = 1 n ∑ j = 1 n ⟨ V i , V j ⟩ x i x j − 1 2 ∑ i = 1 n ⟨ V i , V i ⟩ x i x i = 1 2 ( ∑ i = 1 n ∑ j = 1 n ∑ f = 1 k v i , f v j , f x i x j − ∑ i = 1 n ∑ f = 1 k v i , f v j , f x i x i ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) ( ∑ j = 1 n v j , f x j ) − ∑ i = 1 n v i , f 2 x i 2 ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) 2 − ∑ i = 1 n v i , f 2 x i 2 ) \begin{array}{l} \sum\limits_{i = 1}^n {\sum\limits_{j = i + 1}^n {\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.{x_i}{x_j}} } \\ = \frac{1}{2}\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {\left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.{x_i}{x_j}} } - \frac{1}{2}\sum\limits_{i = 1}^n {\left\langle {\left. {{V_i},{V_i}} \right\rangle } \right.{x_i}{x_i}} \\ = \frac{1}{2}\left( {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {\sum\limits_{f = 1}^k {{v_{i,f}}{v_{j,f}}} {x_i}{x_j} - } \sum\limits_{i = 1}^n {\sum\limits_{f = 1}^k {{v_{i,f}}{v_{j,f}}} {x_i}{x_i}} } } \right)\\ = \frac{1}{2}\sum\limits_{f = 1}^k {\left( {\left( {\sum\limits_{i = 1}^n {{v_{i,f}}{x_i}} } \right)\left( {\sum\limits_{j = 1}^n {{v_{j,f}}{x_j}} } \right) - \sum\limits_{i = 1}^n {v_{i,f}^2x_i^2} } \right)} \\ = \frac{1}{2}\sum\limits_{f = 1}^k {\left( {{{\left( {\sum\limits_{i = 1}^n {{v_{i,f}}{x_i}} } \right)}^2} - \sum\limits_{i = 1}^n {v_{i,f}^2x_i^2} } \right)} \end{array} i=1nj=i+1nVi,Vjxixj=21i=1nj=1nVi,Vjxixj21i=1nVi,Vixixi=21(i=1nj=1nf=1kvi,fvj,fxixji=1nf=1kvi,fvj,fxixi)=21f=1k((i=1nvi,fxi)(j=1nvj,fxj)i=1nvi,f2xi2)=21f=1k((i=1nvi,fxi)2i=1nvi,f2xi2)
通过公式变换,复杂度由 O ( k ∗ n 2 ) = > O ( k ∗ n ) O(k*{n^2}) = > O(k*n) O(kn2)=>O(kn)

FM与MF的区别:

  • FM矩阵将User和Item都进行了one-hot编码作为特征,使得特征维度非常巨大且稀疏
  • 矩阵分解MF是FM的特例,即特征只有User ID 和Item ID的FM模型
  • 矩阵分解MF只适用于评分预测,进行简单的特征计算,无法利用其他特征
  • FM引入了更多辅助信息(Side information)作为特征
  • FM在计算二阶特征组合系数的时候,使用了MF

FM的学习算法:

  • ALS,交替最小二乘法
  • SGD,随机梯度下降法
  • MCMC,马尔科夫链蒙特卡罗法

FFM

FFM引入field的概念:
对于FM对于Wij的估计,观察二阶特征的系数:把相同性质的特征归于同一个field,例如把所有的user作为一个field,把item作为一个field,把其他特征也放到一个field中。
观察FM对于Wij的估计
⟨ V i , V j ⟩ : = ∑ f = 1 k v i , f ⋅ v j , f \left\langle {\left. {{V_i},{V_j}} \right\rangle } \right.: = \sum\limits_{f = 1}^k {{v_{i,f}} \cdot {v_{j,f}}} Vi,Vj:=f=1kvi,fvj,f
对于不同field的特征采用了同样的隐形影响。
而对于FFM算法:
在这里插入图片描述
每个特征会有几个不同的隐向量,fj 是第 j 个特征所属的field。
隐向量的长度为 k,FFM的二次参数有 nfk 个,多于FM模型的 nk 个
由于隐向量与field相关,FFM二次项并不能够化简,计算复杂度是 O ( k ∗ n 2 ) O(k*{n^2}) O(kn2),因此FFM的k值一般远小于FM的k值

FM算法:

  • 每个特征只有一个隐向量
  • FM是FFM的特例

FFM算法

  • 每个特征有多个隐向量
  • 使用哪个,取决于和哪个向量进行点乘

DeepFM

FM算法可以做特征组合,但是特征组合需要的时间复杂度较大,所以在一般只使用二阶特征组合。如何既考虑到低阶特征又考虑到高阶特征,于是相应的算法DeepFM出现了。
DeepFM相当于FM+DNN,无需做特征工程进行特征组合,将特征工程的工作交给DNN进行训练。
DeepFM的结构
DeepFM的结构图。1
y ∧ = s i g m o i d ( y F M + y D N N ) \mathop y\limits^\wedge = sigmoid\left( {{y_{FM}} + {y_{DNN}}} \right) y=sigmoid(yFM+yDNN)
DeepFM = FM + DNN:
提取低阶(low order)特征 => 因子分解机FM
既可以做1阶特征建模,也可以做2阶特征建模

  • 提取高阶(high order)特征 => 神经网络DNN
    end-to-end,共享特征输入
  • 对于特征i,wi是1阶特征的权重,
    Vi表示该特征与其他特征的交互影响,输入到FM模型中可以获得特征的2阶特征表示,输入到DNN模型得到高阶特征。

DeepFM中的模块:

  • Sparse Features,输入多个稀疏特征
  • Dense Embeddings

对每个稀疏特征做embedding,学习到他们的embedding向量(维度相等,均为k),因为需要将这些embedding向量送到FM层做内积。同时embedding进行了降维,更好发挥Deep Layer的高阶特征学习能力

  • FM Layer
    一阶特征:原始特征相加
    二阶特征:原始特征embedding后的embedding向量两两内积
  • Deep Layer
    将每个embedding向量做级联,然后做多层的全连接,学习更深的特征
  • Output Units
    将FM层输出与Deep层输出进行级联,接一个dense层,作为最终输出结果

FM,FFM,DeepFM工具

FM工具

libFM(FM软件)
下载地址:https://github.com/srendle/libfm
使用文档:http://www.libfm.org/libfm-1.42.manual.pdf
FM论文作者Steffen Rendle提供的工具(2010年)
在KDD CUP 2012,以及Music Hackathon中都取得不错的成绩
不仅适用于推荐系统,还可以用于机器学习(分类问题)
实现三种优化算法:SGD,ALS,MCMC
支持2种输入数据格式:文本格式(推荐)和二进制格式

FFM工具

libFFM
https://github.com/ycjuan/libffm
xlearn
https://xlearn-doc-cn.readthedocs.io/en/latest/index.html
提供Python接口
支持LR,FM,FFM算法等
运行效率高,比libfm, libffm快

DeepFM工具

DeepCTR工具
https://github.com/shenweichen/DeepCTR
实现了多种CTR深度模型
与Tensorflow 1.4和2.0兼容

summary

FM算法:

  • 泛化能力强,能够考虑到多种特征以及特征组合
  • 相比于MF使用了更多的side information作为特征,同时在进行二阶特征估计的时候用到了MF
  • 计算复杂度,可以在线性时间对样本做出预测,通过公式变换将计算复杂度降到O(k*n)

DeepFM算法:

  • 相比于FM考虑到了高阶特征的影响因素,使用DNN对高阶特征进行发现
  • 更接近真实场景,真实场景中往往需要考虑到高阶特征的情况,所有在实际中效果更好
  • 使用DNN能够发现有些很难理解和解释的高阶特征

  1. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction,2017 ↩︎

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值