我是靠谱客的博主 靓丽鸵鸟,最近开发中收集的这篇文章主要介绍《推荐系统笔记(七)》因子分解机(FM)和它的推广(FFM、DeepFM),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

b### 前言
不同于线性模型只能从利用数据的一阶特征,FM可以通过特征组合,利用数据的二阶甚至更高阶的特征,从而更好的完成回归或者分类任务。

下面,我们将分别介绍因子分解机(FM)、FFM以及DeepFM的原理。在此之后,我们将利用deepctr第三方库,对movielens数据集进行预测。

因子分解机

给定数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T={(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ R n x_iinmathbb{R}^n xiRn y i y_i yi为标签。通过线性模型预测,有
y ^ = w 0 + ∑ i = 1 n w i ⋅ x ( i ) hat y=w_0+sum_{i=1}^nw_i cdot x^{(i)} y^=w0+i=1nwix(i)

但是这样是否就已经足够了呢?

举个例子,不同国家不同日期的用户购买决策

  • 数据特征维度:用户ID,国家,日期,商品
  • 数据1:0,中国,2016/02/05,灯笼
  • 数据2:1,美国,2016/12/25,火鸡
  • ……

上面的例子中,02/05是中国春节前夕,中国人更加倾向于购买年货;12/25是美国圣诞节前夕,美国人更加倾向于购买火鸡等过节物品。

这就说明v,当国家和日期这两个特征组合起来,构成的 国家+日期 这个新的特征,可能对用户购买商品的预测更有帮助。

这也是我们要用因子分解机的原因,因子分解机可以组合特征,利用一维特征和二维特征同时进行预测。

1. FM

我们在原有的线性模型上加入二阶特征,即FM,
y ^ = w 0 + ∑ i = 1 n w i ⋅ x ( i ) + ∑ i = 1 n ∑ j = i + 1 n w i , j ⋅ x ( i ) x ( j ) hat y=w_0+sum_{i=1}^nw_i cdot x^{(i)}+sum_{i=1}^nsum_{j=i+1}^nw_{i, j}cdot x^{(i)}x^{(j)} y^=w0+i=1nwix(i)+i=1nj=i+1nwi,jx(i)x(j)

这里, x ( i ) x ( j ) x^{(i)}x^{(j)} x(i)x(j)为二阶特征组合, w i , j w_{i, j} wi,j为二阶特征系数。

这存在一个问题,即原本数据集 T T T中,能提取到多少二阶特征组合?一般来说,是非常少的,这就意味着仅仅能估计少量的 w i , j w_{i, j} wi,j,而更多的系数无法估计。

为了解决这个困难,我们模仿MF的方法,令
w i , j = v i T v j w_{i, j}=v_i^Tv_j wi,j=viTvj

其中, v i v_i vi k k k维列向量。这样,原始FM模型可以改为

y ^ = w 0 + ∑ i = 1 n w i ⋅ x ( i ) + ∑ i = 1 n ∑ j = i + 1 n v i T v j ⋅ x ( i ) x ( j ) hat y=w_0+sum_{i=1}^nw_i cdot x^{(i)}+sum_{i=1}^nsum_{j=i+1}^nv_i^Tv_jcdot x^{(i)}x^{(j)} y^=w0+i=1nwix(i)+i=1nj=i+1nviTvjx(i)x(j)

紧接着,这带来计算复杂度的问题,为了计算 ∑ i = 1 n ∑ j = i + 1 n v i T v j ⋅ x ( i ) x ( j ) sum_{i=1}^nsum_{j=i+1}^nv_i^Tv_jcdot x^{(i)}x^{(j)} i=1nj=i+1nviTvjx(i)x(j),计算的加法和乘法达到了 O ( k n 2 ) O(kn^2) O(kn2)的复杂度。

为了简便计算,我们可以将原式化简,即
∑ i = 1 n ∑ j = i + 1 n v i T v j ⋅ x ( i ) x ( j ) = 1 2 ( ∑ i = 1 n ∑ j = 1 n v i T v j ⋅ x ( i ) x ( j ) − ∑ i = 1 n v i T v i ⋅ x ( i ) x ( i ) ) = 1 2 ( ( ∑ i = 1 n v i x ( i ) ) 2 − ∑ i = 1 n ( v i x ( i ) ) 2 ) begin{array}{lll} &&sum_{i=1}^nsum_{j=i+1}^nv_i^Tv_jcdot x^{(i)}x^{(j)}\ &=&frac{1}{2}(sum_{i=1}^nsum_{j=1}^nv_i^Tv_jcdot x^{(i)}x^{(j)}-sum_{i=1}^nv_i^Tv_icdot x^{(i)}x^{(i)})\ &=& frac{1}{2}left((sum_{i=1}^nv_ix^{(i)})^2-sum_{i=1}^n(v_ix^{(i)})^2right) end{array} ==i=1nj=i+1nviTvjx(i)x(j)21(i=1nj=1nviTvjx(i)x(j)i=1nviTvix(i)x(i))21((i=1nvix(i))2i=1n(vix(i))2)

通过上面的化简,我们可以把计算的复杂度降为 O ( k n ) O(kn) O(kn)

综上,我们可以把FM模型写为
y ^ = w 0 + ∑ i = 1 n w i ⋅ x ( i ) + 1 2 ( ( ∑ i = 1 n v i x ( i ) ) 2 − ∑ i = 1 n ( v i x ( i ) ) 2 ) hat y=w_0+sum_{i=1}^nw_i cdot x^{(i)}+frac{1}{2}left((sum_{i=1}^nv_ix^{(i)})^2-sum_{i=1}^n(v_ix^{(i)})^2right) y^=w0+i=1nwix(i)+21((i=1nvix(i))2i=1n(vix(i))2)

用于回归问题时,我们可以采用平方误差,即
L o s s = ∑ i = 1 N ( y i − y ^ ( x i ) ) 2 Loss = sum_{i=1}^Nleft(y_i-hat y(x_i)right)^2 Loss=i=1N(yiy^(xi))2

在二分类问题时,我们则可以采用logloss,即
L o s s = − 1 N ∑ i = 1 N ( y i ⋅ l o g ( s i g m o i d ( y ^ ( x i ) ) ) + ( 1 − y i ) ⋅ l o g ( s i g m o i d ( y ^ ( x i ) ) ) ) Loss=-frac{1}{N}sum_{i=1}^Nleft(y_icdot log(sigmoid(hat y(x_i)))+(1-y_i)cdot log(sigmoid(hat y(x_i)))right) Loss=N1i=1N(yilog(sigmoid(y^(xi)))+(1yi)log(sigmoid(y^(xi))))

2. FFM

在FM模型中,我们用特征 i i i的隐向量 v i v_i vi来拟合二阶项系数 w i , j w_{i, j} wi,j。实际上,我们的特征往往是通过one-hot编码得到。

举个例子

  • 原始两个特征:国家 节日
  • 数据1:中国 圣诞
  • 数据2:中国 春节
  • 数据3:美国 圣诞
  • 数据4:美国 春节
  • one-hot编码之后四个特征:国家_中国 国家_美国 节日_圣诞 节日_春节
  • 数据1:1 0 1 0
  • 数据2:1 0 0 1
  • 数据3:0 1 1 0
  • 数据4:0 1 0 1

编码之后有四个特征,它们两两组合,形成二阶特征。每个特征 x ( i ) x^{(i)} x(i)都对应着一个隐向量 v i v_i vi,二阶特征的系数 w i , j w_{i, j} wi,j即为对应两个特征隐向量的乘积 v i T v j v_i^Tv_j viTvj

但是,对于特征组合

  • 国家_中国 * 国家_美国
  • 国家_中国 * 节日_春节

而言,国家_中国 对应的都是同一个隐向量,我们说这可能并不合理。为了解决这个可能的问题,我们说,对于不同filed的特征,在特征组合时某个特征 x ( i ) x^{(i)} x(i)对应的隐向量也应该不同。这里的field={国家,节日}。

具体来说,二阶特征的系数 w i , j w_{i, j} wi,j即为对应两个特征隐向量的乘积 v i , f ( j ) T v j , f ( i ) v_{i,f(j)}^Tv_{j, f(i)} vi,f(j)Tvj,f(i),即
w i , j = v i , f ( j ) T v j , f ( i ) w_{i, j}=v_{i,f(j)}^Tv_{j, f(i)} wi,j=vi,f(j)Tvj,f(i)

其中, f ( i ) f(i) f(i)是特征 x ( i ) x^{(i)} x(i)所处的field。

这样,FFM模型可以写为
y ^ = w 0 + ∑ i = 1 n w i ⋅ x ( i ) + ∑ i = 1 n ∑ j = i + 1 n v i , f ( j ) T v j , f ( i ) ⋅ x ( i ) x ( j ) hat y=w_0+sum_{i=1}^nw_i cdot x^{(i)}+sum_{i=1}^nsum_{j=i+1}^nv_{i,f(j)}^Tv_{j, f(i)}cdot x^{(i)}x^{(j)} y^=w0+i=1nwix(i)+i=1nj=i+1nvi,f(j)Tvj,f(i)x(i)x(j)

这个时候是没办法化简的。

3. DeepFM

上面的内容我们仅仅考虑了二阶特征组合,为了考虑更高阶特征组合的问题,我们引入深度神经网络(DNN)。

我们可以将DeepFM分成两个部分:

  • FM部分,提取一阶特征和二阶特征组合
  • DNN部分,提取更高阶的特征组合
  • 最后将两部分得到的结果结合起来,生成最终结果

由于我们的输入经过one-hot编码之后,变成一个非常庞大的稀疏矩阵,要想有效通过DNN得到结果,必须将其降维,一个通用的做法是通过dense embedding将输入转化为稠密的较小规模输入。

接下来,我们将分别说明,DeepFM如何获取一阶特征、二阶特征以及更高阶特征。

  • 在原有特征的基础上进行one-hot编码,得到的特征向量维度很大,却也稀疏
  • 一阶特征:FM部分,直接用one-hot编码之后获得的特征向量,进行线性相加
  • 二阶特征:FM部分,对one-hot编码之后获得的特征向量进行dense embedding,其实就是获得各个特征对应的隐向量的过程,对隐向量做乘法
  • 高阶特征:DNN部分,通过上面的步骤,获得每个特征的隐向量,对于一个输入,每个field内必然只有一个k维隐向量,将这些隐向量拼接起来,作为DNN的输入
  • 对于FM和DNN获得的结果,我们通过下式加以综合,作为最终结果 y ^ = s i g m o i d ( y F M + y D N N ) hat y=sigmoid(y_{FM}+y_{DNN}) y^=sigmoid(yFM+yDNN)

最后

以上就是靓丽鸵鸟为你收集整理的《推荐系统笔记(七)》因子分解机(FM)和它的推广(FFM、DeepFM)的全部内容,希望文章能够帮你解决《推荐系统笔记(七)》因子分解机(FM)和它的推广(FFM、DeepFM)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部