独热(one-hot)编码的好处
独热编码是将特征离散化的一种方法,在因子分解机FM中非常推荐使用。
对于那些连续化特征,分桶就能实现离散化,但好处不是很明显。
而对于那些本身离散化的特征,即假设0表示北京,1表示南京,2表示上海,那么one-hot编码后则用[1,0,0]表示北京,[0,1,0]表示南京,[0,0,1]表示说上海,这样做最大的一个好处是三个地方之间的距离相同。
因子分解机
- 好处
很多特征之间是有联系的,有一个trick就是在线性模型中加入一些手工的特征组合来提高模型的精度,比如男性不一定喜欢球鞋,但是如果是某个圈子里的,就很可能非常喜欢了,这就是一个组合特征,通常是两个特征的叉乘来表示。
- 理论
因子分解机最大的好处就是能自动学习到所有特征的组合,并且在算法复杂度不是很高的情况下,下面是因子分解机的核心公式
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
\hat{y}(\mathbf{x}):=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}
y^(x):=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj
整体上可以将它看成由两部分组成,一个是普通的线性部分
w
0
+
∑
i
=
1
n
w
i
x
i
w_{0}+\sum_{i=1}^{n} w_{i} x_{i}
w0+i=1∑nwixi,另一个是组合特征部分
∑ i = 1 n ∑ j = i + 1 n ⟨ v i , v j ⟩ x i x j \sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j} i=1∑nj=i+1∑n⟨vi,vj⟩xixj.
这里的vi是一个1✖️k的向量,也就是每个xi都对应一个隐向量,用他们的
⟨
v
i
,
v
j
⟩
:
=
∑
f
=
1
k
v
i
,
f
⋅
v
j
,
f
\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle:=\sum_{f=1}^{k} v_{i, f} \cdot v_{j, f}
⟨vi,vj⟩:=f=1∑kvi,f⋅vj,f
点乘来表示组合特征的权重。上面这个k的大小是可以自己设置的。
- 效率
论文中证明过,上面那个核心公式化简后的计算复杂度为O(kn)
- 学习算法
论文中使用的是SGD
- 多分类
将二分类转成三分类,具体就是将每个vi变成3✖️k维, 普通贫困生,特困生,以及不是贫困生。
- 损失函数
FM输出的是(y0, y1, y2),首先通过softmax使得y0+y1+y2=1。
损失函数是交叉熵:
H
Y
(
Y
^
)
=
−
∑
p
Y
p
log
(
Y
^
p
)
=
−
∑
p
=
1
N
Y
p
log
(
Y
^
p
)
H_{Y}(\hat{Y})=-\sum_{p} Y_{p} \log \left(\hat{Y}_{p}\right)=-\sum_{p=1}^{N} Y_{p} \log \left(\hat{Y}_{p}\right)
HY(Y^)=−p∑Yplog(Y^p)=−p=1∑NYplog(Y^p)
假设有一个三分类问题,某个样例的正确答案是(1,0,0)。某模型经过Softmax回归之后的预测答案是(0.5,0,4,0.1),那么这个预测和正确答案直接的交叉熵是:
H
(
(
1
,
0
,
0
)
,
(
0.5
,
0.4
,
0.1
)
)
=
−
(
1
×
log
0.5
+
0
×
log
0.4
+
0
×
log
0.1
)
≈
0.3
\mathrm{H}((1,0,0),(0.5,0.4,0.1))=-(1 \times \log 0.5+0 \times \log 0.4+0 \times \log 0.1) \approx 0.3
H((1,0,0),(0.5,0.4,0.1))=−(1×log0.5+0×log0.4+0×log0.1)≈0.3
如果另外一个模型的预测是(0.8,0.1,0.1),那么这个预测值和真实值的交叉熵是:
H
(
(
1
,
0
,
0
)
,
(
0.8
,
0.1
,
0.1
)
)
=
−
(
1
×
log
0.8
+
0
×
log
0.1
+
0
×
log
0.1
)
≈
0.16
\mathrm{H}((1,0,0),(0.8,0.1,0.1))=-(1 \times \log 0.8+0 \times \log 0.1+0 \times \log 0.1) \approx 0.16
H((1,0,0),(0.8,0.1,0.1))=−(1×log0.8+0×log0.1+0×log0.1)≈0.16
从直观上可以很容易知道第二个答案要优于第二个。通过交叉熵计算得到的结果也是一致的(第二个交叉熵的值更小)。
compare with SVM(重点)
SVM的线性模型函数表示为:
y
^
(
x
)
=
w
0
+
∑
i
=
1
n
w
i
x
i
,
w
0
∈
R
,
w
∈
R
n
\hat{y}(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}, \quad w_{0} \in \mathbb{R}, \quad \mathbf{w} \in \mathbb{R}^{n}
y^(x)=w0+i=1∑nwixi,w0∈R,w∈Rn
二次多项式模型函数表示为:
y
^
(
x
)
=
w
0
+
2
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
w
i
,
i
(
2
)
x
i
2
+
2
∑
i
=
1
n
∑
j
=
i
+
1
n
w
i
,
j
(
2
)
x
i
x
j
\begin{aligned} \hat{y}(\mathbf{x})=w_{0}+\sqrt{2} \sum_{i=1}^{n} w_{i} x_{i} &+\sum_{i=1}^{n} w_{i, i}^{(2)} x_{i}^{2} +\sqrt{2} \sum_{i=1}^{n} \sum_{j=i+1}^{n} w_{i, j}^{(2)} x_{i} x_{j} \end{aligned}
y^(x)=w0+2i=1∑nwixi+i=1∑nwi,i(2)xi2+2i=1∑nj=i+1∑nwi,j(2)xixj
SVM和FM的主要区别在于,SVM的二元特征交叉参数是独立的,如wij,而FM的二元特征交叉参数是两个k维的向量vi、vj,这样子的话,<vi,vj>和<vi,vk>就不是独立的,而是相互影响的。
为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?线性svm只有一维特征,不能挖掘深层次的组合特征在实际预测中并没有很好的表现;而多项式svm正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。
此外,FM和SVM的区别还体现在:
1)FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行;2)FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量。
Field-aware 因子分解机
场域因子分解机在因子分解机的基础上引入了域的概念,其核心公式如下:
y
^
F
F
M
(
x
)
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
⟨
V
i
,
f
j
,
V
j
,
f
i
⟩
x
i
x
j
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
w
^
i
j
x
i
x
j
\begin{aligned} \hat{y}_{F F M}(x) &=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n-1} \sum_{j=i+1}^{n}\left\langle V_{i, f_{j}}, V_{j, f_{i}}\right\rangle x_{i} x_{j} \\ &=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} \hat{w}_{i j} x_{i} x_{j} \end{aligned}
y^FFM(x)=w0+i=1∑nwixi+i=1∑n−1j=i+1∑n⟨Vi,fj,Vj,fi⟩xixj=w0+i=1∑nwixi+i=1∑n−1j=i+1∑nw^ijxixj
上式子的时间复杂度是O(nnk)
在FFM中,每个变量xi和每个域fj对应一个隐向量 V i , f j V_{i, f_{j}} Vi,fj, 因此,隐向量不仅与变量有关,也与域有关,此时隐向量就是连接变量和域的桥梁。
引入了field的概念,核心目标在于,很多时候没有必要衡量任意两个小特征的关系,而只需要衡量小特征和每个field之间的关系,这样能一定程度降低稀疏性,提升隐向量的实际含义和泛化能力,隐向量的个数确实大大缩小,但是field的个数却也有关,因此不好说谁的复杂度高了,和实际问题有关,可以说的是,其实在FFM作者的实验中,FFM的提升相比FM并不多。