早就想总结一下这篇2010年的论文《Factorization Machines》,与其说这篇论文提出了一种新的模型不如说这篇论文提出了一种新的建模思想,适用于所有形式类似于 Y = T ( W 1 ∗ X + W i j ∗ X i ∗ X j + W i j k ∗ X i ∗ X j ∗ X K + . . . . ) Y=T(W_1*X+W_{ij}*X_i*X_j+W_{ijk}*X_i*X_j*X_K+....) Y=T(W1∗X+Wij∗Xi∗Xj+Wijk∗Xi∗Xj∗XK+....)的机器学习模型(X是特征, X i ∗ X j X_i*X_j Xi∗Xj值的是二阶的特征交互, W i ∗ X j ∗ X K W_i*X_j*X_K Wi∗Xj∗XK指的是三阶的特征交互,后面的省略号表示这里的特征交互可能会涉及到多阶,W是系数,T是激活函数(可以是线性或者非线性),如果Y的取值是离散值那么就是分类问题,如果Y的取值是连续值那么就是回归问题)。
这篇论文的最大贡献在于解决了样本特征的稀疏性问题,特别是对于二阶以上交互特征的系数来说,很可能在预测集中的有些非0交互在训练集中从来都没有出现过,这样就会对最终模型精度产生较大的影响。为了更好的解决这一问题,这里采用了一种因式分解的方式,也称之为Factorization machines。和原来的方式不同,以二阶交互特征为例,原来直接是用一个实数 W i j W_{ij} Wij来表征特性 X i X_i Xi和 X j X_j Xj的交互权重,在Factorization machines中,这个交互权重是由两个向量相乘做内积得到的,而这两个向量分别表示了特征 X i X_i Xi和特征 X j X_j Xj的本质属性,同样的思路,每一维属性对会拥有表征其本质信息的向量。显而易见,通过这样的方式,原来由一个实数 W i j W_{ij} Wij所表征的信息现在扩展到了两个向量,这样的好处就是即使在预测集中遇到了两个从未在训练集中出现的特征交互,但是这两个特征所对应的向量通过训练集中其他的交互得到了充分的学习,因此该问题带来的影响会被大大地消除。
还是以二阶交互特征为例,从数学角度来看,特征交互矩阵 W = V . V T W=V.V^T W=V.VT,这里的矩阵 V V V中每一列都是每一维特征所对应的属性向量。在这里有一个明显的问题就是,是不是每一个句子 W W W都可以写成是两个矩阵相乘的结果呢?这里就用到了一个数学方面的定理,只要矩阵 V V V中每个向量的维度k足够大的时候这样,那么总能够找到这样的矩阵V。
那么包含了二阶特征交互的回归模型形式为:
y
=
w
0
+
∑
i
=
1
n
w
i
.
x
i
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
y=w_0+\sum_{i=1}^{n}w_i.x_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n<v_i,v_j>x_ix_j
y=w0+∑i=1nwi.xi+∑i=1n−1∑j=i+1n<vi,vj>xixj,这里的
<
v
i
,
v
j
>
<v_i,v_j>
<vi,vj>表示的是内积操作。
推广到s阶的交叉项就是(设s阶属性向量维度为
k
l
k_l
kl):
∏
i
=
1
s
x
i
∑
f
=
1
k
l
∏
i
=
1
s
v
i
,
f
\prod_{i=1}^sx_i\sum_{f=1}^{k_l}\prod_{i=1}^{s}v_{i,f}
∏i=1sxi∑f=1kl∏i=1svi,f
同样在求解的时候,采用随机梯度下降算法进行优化。整体来看FM算法并不复杂,而且是一个比较“老”的算法了,但是它其中蕴含的核心思想确十分有借鉴价值,那就是它的“因式分解”思想。在机器学习领域,如果遇到了样本稀疏的问题,我们可以尝试着对这些样本属性进行分解,把一个大部分分解为一系列小的基本单元,在上述场景中就是把特征之间的交互权重看成是大的部分,交互的权重就被分解为两个属性所对应向量的乘积,属性向量就作为了基本单元。