概述
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
xi∈Rn,
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=1∑nwi⋅x(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=1∑nwi⋅x(i)+i=1∑nj=i+1∑nwi,j⋅x(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=1∑nwi⋅x(i)+i=1∑nj=i+1∑nviTvj⋅x(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=1n∑j=i+1nviTvj⋅x(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=1n∑j=i+1nviTvj⋅x(i)x(j)21(∑i=1n∑j=1nviTvj⋅x(i)x(j)−∑i=1nviTvi⋅x(i)x(i))21((∑i=1nvix(i))2−∑i=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=1∑nwi⋅x(i)+21((i=1∑nvix(i))2−i=1∑n(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=1∑N(yi−y^(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=1∑N(yi⋅log(sigmoid(y^(xi)))+(1−yi)⋅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=1∑nwi⋅x(i)+i=1∑nj=i+1∑nvi,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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复