文章目录
因子分解机
因子分解机(Factorization Machine,FM),又称分解机,是由Steffen Rendle最早于2010年在ICDM会议Factorization Machines论文中提出,旨在解决大规模稀疏数据下的特征组合问题。传统机器学习方法,假设各特征之间相互独立,没有考虑特征间存在相互作用的情况,主要关注如何对特征赋予权重的问题。
FM 研究背景
在实际应用中,Categorical类型特征经过One-Hot编码之后,大部分样本数据是比较稀疏的。以广告CTR/CVR为例,用户的性别、职业、教育水平、用户偏好、商品品类等,经过One-Hot编码转换后都会导致样本数据的稀疏性。比如商品品类这种类型特征,假设商品末级品类有550个,采用One-Hot编码生成550个数值特征,但每个样本的550个特征中,有且仅有一个数值为非零,由此可见,数据的稀疏性在实际应用中不可避免。而One-Hot编码的另一特点是会导致特征空间剧增。
另外,通过观察大量样本数据,某些特征经过关联后,与label之间的相关性会得到提高。如:“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。换句话说,来自“China”的用户很可能会在“Chinese New Year”有大量的浏览、购买行为,而在“Thanksgiving”却不会有特别的消费行为。这种关联特征与label的正向相关性在实际问题中是普遍存在的,如“化妆品”与“女性”,“球类商品”与“男性”,“电影票”的商品与“电影”的品类偏好等。因此引入特征之间的组合是非常有意义的。
如何刻画特征之间的关联,最直接的方法是构造组合特征,特征之间的关联信息在浅层学习模型(LR、SVM)是做不到的,目前工业界主要有两种手段得到组合特征:
- 人工特征工程(数据分析 + 人工构造)
- 通过模型做组合特征的学习(深度学习方法、FM/FFM/DeepFM方法)
多项式模型是包含特征组合的最直观的模型,用
w
i
j
w_ij
wij表示特征
x
i
x_i
xi和
x
j
x_j
xj的组合,即
x
i
x_i
xi和
x
j
x_j
xj都非零时,组合特征
x
i
x
j
x_ix_j
xixj才有意义。以二阶组合特征为例,二阶多项式模型表达式如下:
y
(
x
)
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
∑
j
=
i
+
1
n
w
i
j
x
i
x
j
y(x)=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^nw_{ij}x_ix_j
y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑nwijxixj由上式可知,二阶组合特征的参数一共有
C
n
2
=
n
(
n
−
1
)
2
C_n^2 = \frac{n(n-1)}{2}
Cn2=2n(n−1)个,任意两个参数都是相互独立的。然而,实际应用场景中数据稀疏性是普遍存在的,二次项系数的训练是非常困难的。其原因在于回归模型的参数
w
w
w的学习结果是从训练样本中计算充分统计量(凡是符合指数族分布的模型都具有此性质),而在这里交叉项的每一个参数
w
i
j
w_ij
wij的学习过程需要大量的
x
i
x_i
xi和
x
j
x_j
xj同时非零的训练样本数据。而实际场景中样本的稀疏性导致能够满足“
x
i
x_i
xi和
x
j
x_j
xj同时非零”的样本数会更少,训练样本不充分,学到的参数
w
i
j
w_ij
wij就不是充分统计量的结果,
w
i
j
w_ij
wij不准确严重影响模型预测的效果和稳定性。
那么,如何解决二次项参数的训练问题呢?
FM 原理及推导
受矩阵分解(Matrix Factorization,MF)的启发,参考上一篇SVD系列算法浅析,在Model-based的协同过滤中,一个rating矩阵被分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示。如下图所示,将每个user表示成一个二维向量,同时把每个item表示成一个二维向量,两个向量的点积就是矩阵中user对item的评分。
类似的,所有二次项参数
w
i
j
w_ij
wij可以组成一个对称矩阵
W
W
W,那么矩阵可以分解为
W
=
V
T
V
W=V^TV
W=VTV,
V
V
V的第
j
j
j列就是第
j
j
j维特征的隐向量。换言之,每个参数表示为
w
i
j
=
⟨
v
i
,
v
j
⟩
w_{ij}=⟨v_i,v_j⟩
wij=⟨vi,vj⟩,这就是FM模型的核心思想。因此FM的二阶模型表达式为:
y
(
x
)
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
∑
j
=
i
+
1
n
⟨
v
i
,
v
j
⟩
x
i
x
j
(
2
)
y(x)=w_0+\sum _{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^n⟨vi,vj⟩x_ix_j \ \ \ \ (2)
y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj (2)其中,
v
i
v_i
vi是第
i
i
i维特征的隐向量,
⟨
⋅
,
⋅
⟩
⟨⋅,⋅⟩
⟨⋅,⋅⟩代表向量点积运算,计算公式为:
⟨
v
i
,
v
j
⟩
=
∑
f
=
1
k
v
i
,
f
⋅
v
j
,
f
⟨v_i,v_j⟩=\sum_{f=1}^kv_{i,f}·v_{j,f}
⟨vi,vj⟩=f=1∑kvi,f⋅vj,f
k
k
k是隐向量的维度,且
(
k
<
<
n
)
(k<<n)
(k<<n),包含
k
k
k个描述特征的因子。
模型分析如下:
- 线性模型 + 交叉项:前两项是线性回归模型的表达式,最后一项是二阶特征交叉项(组合特征项),表示模型将两个互异的特征分量之间的关联信息考虑进来。用交叉项表示组合特征,从而建立特征与结果之间的非线性关系。
- 交叉项系数 -> 隐向量内积:由于FM模型是在线性回归基础上加入特征交叉项,模型求解时不直接求特征交叉项的系数 w i j w_ij wij(因为对应的组合特征数据稀疏,参数学习不充分),故而采用隐向量的内积 ⟨ v i , v j ⟩ ⟨v_i,v_j⟩ ⟨vi,vj⟩表示 w i j w_{ij} wij。具体的求解过程是FM对每个特征分量 x i x_i xi引入隐向量 v i = ( v i , 1 , v i , 2 , ⋯ , v i , k ) v_i=(v_{i,1},v_{i,2},⋯,v_{i,k}) vi=(vi,1,vi,2,⋯,vi,k),利用 v i v j T v_iv^T_j vivjT内积对交叉项系数进行估计。因此二次项的参数数量减少为 k n kn kn个,远少于多项式模型的参数数量。
此外,参数因子化表示后,使得
x
h
x
i
x_hx_i
xhxi和
x
i
x
j
x_ix_j
xixj的参数不再相互独立,因此可以在样本系数相对合理的情况下估计FM模型交叉项的参数。具体来说:
⟨
v
h
,
v
i
⟩
=
∑
f
=
1
k
v
h
,
f
⋅
v
i
,
f
⟨
v
i
,
v
j
⟩
=
∑
f
=
1
k
v
i
,
f
⋅
v
j
,
f
⟨v_h,v_i⟩=\sum_{f=1}^k v_{h,f}·v_{i,f} \\ ⟨v_i,v_j⟩=\sum_{f=1}^k v_{i,f}·v_{j,f}
⟨vh,vi⟩=f=1∑kvh,f⋅vi,f⟨vi,vj⟩=f=1∑kvi,f⋅vj,f
⟨
v
h
,
v
i
⟩
⟨v_h,v_i⟩
⟨vh,vi⟩和
⟨
v
i
,
v
j
⟩
⟨v_i,v_j⟩
⟨vi,vj⟩之间有共同项
v
i
v_i
vi,也就是说,所有包含
x
i
x_i
xi的非零组合特征(存在某个
j
≠
i
j≠i
j=i,使得
x
i
x
j
≠
0
x_ix_j≠0
xixj=0)的样本都可以用来学习隐向量
v
i
v_i
vi,这在很大程度上避免了数据稀疏行造成参数估计不准确的影响。而在多项式模型中,
w
h
i
w_hi
whi和
w
i
j
w_ij
wij是相互独立的。
直观上看,FM模型的复杂度是
O
(
k
n
2
)
O(kn^2)
O(kn2),通过以下变换可以将复杂度优化到
O
(
k
n
)
O(kn)
O(kn),详细推导如下:
∑
i
=
1
n
∑
j
=
i
+
1
n
⟨
v
i
,
v
j
⟩
x
i
x
j
=
1
2
∑
i
=
1
n
∑
f
=
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
i
,
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
]
\sum_{i=1}^n\sum_{j=i+1}^n⟨v_i,v_j⟩x_ix_j =\frac{1}{2}\sum_{i=1}^n\sum_{f=1}^n⟨v_i,v_j⟩x_ix_j-\frac{1}{2}\sum_{i=1}^n⟨v_i,v_i⟩x_ix_i \\ =\frac{1}{2}(\sum_{i=1}^n\sum_{j=1}^n\sum_{f=1}^kv_{i,f}v_{j,f}x_ix_j-\sum_{i=1}^n\sum_{f=1}^kv_{i,f}v_{i,f}x_ix_i) \\ =\frac{1}{2}\sum_{f=1}^k[(\sum_{i=1}^nv_{i,f}x_i)·(\sum_{j=1}^nv_{j,f}x_j)-\sum_{i=1}^nv_{i,f}^2x_i^2] \\ =\frac{1}{2}\sum_{f=1}^k[(\sum_{i=1}^nv_{i,f}x_i)^2- \sum_{i=1}^nv_{i,f}^2x_i^2]
i=1∑nj=i+1∑n⟨vi,vj⟩xixj=21i=1∑nf=1∑n⟨vi,vj⟩xixj−21i=1∑n⟨vi,vi⟩xixi=21(i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,fvi,fxixi)=21f=1∑k[(i=1∑nvi,fxi)⋅(j=1∑nvj,fxj)−i=1∑nvi,f2xi2]=21f=1∑k[(i=1∑nvi,fxi)2−i=1∑nvi,f2xi2]张俊林老师在推荐系统召回四模型之:全能的FM模型给出了Step-by-Step的推导,在此附上我个人的理解,把隐向量
v
i
v_i
vi可以看做实数,便于理解矩阵的转换,因为向量点积的结果就是一个实数。这样第一步就很容易理解,由于对称矩阵的性质,将求上三角矩阵转换为全矩阵减去对角线上的元素。第二步很简单,向量点积的展开。第三步可理解为提取公因式,第四步就是一个简单的变量替换。
如果采用随机梯度下降SGD来求模型参数,那么各个参数的梯度如下:
∂
∂
θ
y
(
x
)
=
{
1
,
i
f
θ
i
s
w
0
(
常数项
)
x
i
,
i
f
θ
i
s
w
i
(
线性项
)
x
i
Σ
n
j
=
1
v
j
,
f
x
j
−
v
i
,
f
x
i
2
,
i
f
θ
i
s
v
i
,
f
(
交叉项
)
\frac{\partial}{\partial\theta}y\left(x\right)=\left\{\begin{array}{l} 1,\ \ if \ \theta\ is\ w_0\left(\textrm{常数项}\right)\\ x_i,\ if \ \theta\ is\ w_i\left(\textrm{线性项}\right)\\ x_i\underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j-v_{i,f}x_{i}^{2},\ if \ \theta\ is\ v_{i,f}\left(\textrm{交叉项}\right)\\ \end{array}\right.
∂θ∂y(x)=⎩⎪⎨⎪⎧1, if θ is w0(常数项)xi, if θ is wi(线性项)xij=1Σnvj,fxj−vi,fxi2, if θ is vi,f(交叉项)由于
Σ
n
j
=
1
v
j
,
f
x
j
\underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j
j=1Σnvj,fxj只和
f
f
f有关,在参数迭代过程中,只需要计算第一次所有
f
f
f的
Σ
n
j
=
1
v
j
,
f
x
j
\underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j
j=1Σnvj,fxj,就能够方便地得到所有
v
j
,
f
v_{j,f}
vj,f,显然计算所有
f
f
f的
Σ
n
j
=
1
v
j
,
f
x
j
\underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j
j=1Σnvj,fxj的复杂度是
O
(
k
n
)
O(kn)
O(kn);已知
Σ
n
j
=
1
v
j
,
f
x
j
\underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j
j=1Σnvj,fxj时,计算每个参数梯度的复杂度是
O
(
n
)
O(n)
O(n);得到梯度后,更新每个参数的复杂度是
O
(
1
)
O(1)
O(1);模型一共有
n
k
+
n
+
1
nk+n+1
nk+n+1个,因此FM参数训练的时间复杂度是
O
(
k
n
)
O(kn)
O(kn)。
公式(2)是一个通用的拟合方程,可以用不同的损失函数用于解决回归、二分类问题,比如采用MSE损失函数来求解回归问题,也可以用Hinge、Cross-Entropy损失来求解分类问题,当然进行二分类时,FM的输出需要经过Sigmoid变换,这于Logistic回归是一样的。
FM 模型优点
FM算法可以在线性时间内完成模型训练,以及对新样本做出预测,是一个非常高效的模型。总结来说,FM模型对稀疏数据有更好的学习能力,通过交互项可以学习特征之间的关联关系,并且保证了学习效率和预估能力。
FM降低了交叉项参数学习不充分的影响
通过将每一维特征用 k k k维隐向量表示,交叉项的参数 w i j w_{ij} wij用对应特征隐向量的内积表示,降低了因样本数据稀疏,导致交叉项参数学习不充分的影响。如下表:
共现交叉特征 | 样本数 | 备注 |
---|---|---|
<女性,汽车> | 500 | 同时出现<女性,汽车>的样本数 |
<女性,化妆品> | 1000 | 同时出现<女性,化妆品>的样本数 |
<男性,汽车> | 1500 | 同时出现<男性,汽车>的样本数 |
<男性,化妆品> | 0 | 样本中无此特征组合项 |
<女性,汽车>的含义是女性看汽车广告。可以看到,但特征对应的样本数远大于组合特征对应的样本数。训练时,但特征参数相比交叉项特征参数会学习地更充分。因此,可以说FM降低了因数据稀疏,导致交叉项参数学习不充分的影响。
FM提升了模型预估能力
依然看上面的示例,样本中没有没有<男性,化妆品>交叉特征,即没有男性看化妆品广告的数据。如果用多项式模型来建模,对应的交叉项参数 w 男 性 , 化 妆 品 w_{男性,化妆品} w男性,化妆品是学不出来的,因为数据中没有对应的共现交叉特征。由于FM学习的参数就是单特征的隐向量,那么男性看化妆品广告的预估结果可以得到。这样,即便训练集中没有出现男性看化妆品广告的样本,FM模型仍然可以用来预估,提升了预估的能力。
FM提升了参数学习效率
显而易见,模型训练复杂度由 O ( k n 2 ) O(kn^2) O(kn2)降到 O ( k n ) O(kn) O(kn),其中 n n n为训练样本数。对于训练样本和特征数而言,都是线性复杂度。此外,FM模型是在多项式模型的基础上对参数的计算做了调整,因此也有人称FM模型为多项式的广义线性模型。
FM 应用场景
FM可用于各类预测任务中,包括:
- 回归问题Regression
- 二分类问题Binary Classification,可以通过hinge loss或者logit loss来训练二元分类问题。
- 排序问题Ranking,对于排序学习问题(如pairwise),我们可以利用排序算法相关的loss函数来训练FM模型,利用FM模型来做排序学习。
FM vs 其他模型
FM vs MF
- FM是一种比较灵活的模型,通过合适的特征变换,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等。论文中FM是“”general predictor”,而SVD++、PITF、FPMC等都是“specialized models”。
- 相比MF中把rating评分写为 r u i ∼ β u + γ i + x u T y i r_{ui}∼β_u+γ_i+x^T_uy_i rui∼βu+γi+xuTyi,这其实是只有两类特征user和item的FM模型,即MF只是FM的特例。换言之,MF只能局限于这两类特征,而FM可以加任意多的特征,比如user的历史购买平均值、item的历史购买平均值等等。在扩展性上,FM远胜MF。
FM vs SVM
- 相比二阶多项式核的SVM来说,FM在样本稀疏情况下是有优势的。而且FM的训练和预测复杂度都是线性的,而二阶多项式核SVM需要计算核矩阵,是 O ( n 2 ) O(n^2) O(n2)级别的复杂度。
- 多项式SVM交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。
- FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
- FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量。
Reference
- https://zhuanlan.zhihu.com/p/58160982
- 机器学习算法系列(26):因子分解机(FM)与场感知分解机(FFM)
- https://zhuanlan.zhihu.com/p/81069538
- https://www.jianshu.com/p/78628d1cc621