概述
ctr预估任务中,对输入特征进行建模,通过权重weight拟合特征和样本的关系,但实际任务中,特征之间的重要度也是不同的,
某些特征天然地与label具有较强关联性,因此,在模型中增加对特征本身重要度的描述,有利于模型更好的描述样本。
FiBiNet通过SENet的方式来解决上述问题;同时,从FM到FFM、DeepFM等模型,交叉特征的重要程度不言而喻,通常通过点积或hadamard积的方式获取特征交互,
这样获取特征交互的方式是否有效或者说是否最佳?这篇论文通过Bilinear-Interaction提出了交互特征提取的新方式。
整体架构
如下图所示:
除常规的embedding layer、hidden layer,本文将详细介绍SENet layer和Bilinear-Interaction layer。
embedding layer
输入数据为高维稀疏特征,经过embedding生成低维embedding E = [ e 1 , e 2 , ⋯ , e f ] E=[e_1, e_2, \cdots , e_f] E=[e1,e2,⋯,ef],其中f为field的个数
SENet layer
SE block最早出现在cv相关的论文中,来学习每个特征的重要性,之前的一篇博客********中有介绍,如下图所示:
Squeeze
将每个embedding做average pooling,计算公式如下:
z
i
=
F
s
q
(
e
i
)
=
1
k
∑
t
=
1
k
e
i
(
t
)
(1)
z_i = F_{sq}(e_i) = \frac{1}{k} \sum_{t=1}^k{e_i^{(t)}} \tag{1}
zi=Fsq(ei)=k1t=1∑kei(t)(1)
Excitation
通过两层fully connected layers来学习每个field的权重,表示如下:
A
=
F
e
x
(
Z
)
=
σ
2
(
W
2
σ
1
(
W
1
Z
)
)
(2)
A = F_{ex}(Z)= \sigma_2(W_2 \sigma_1(W_1 Z)) \tag{2}
A=Fex(Z)=σ2(W2σ1(W1Z))(2)
其中,
W
1
W_1
W1 是
f
×
r
f \times r
f×r 维权重矩阵,
W
2
W_2
W2 是
r
×
f
r \times f
r×f 维权重矩阵,其中
r
<
f
r<f
r<f 。
Reweight
基于field粒度的乘积运算动态学习每个特征的重要度,实现如下:
V
=
F
R
e
W
e
i
g
h
t
(
A
,
E
)
=
[
a
1
⋅
e
1
,
⋯
,
a
f
⋅
e
f
]
=
[
v
1
,
⋯
,
v
f
]
(3)
V = F_{ReWeight}(A, E) = [a_1 \cdot e_1, \cdots , a_f \cdot e_f] = [v_1, \cdots, v_f] \tag{3}
V=FReWeight(A,E)=[a1⋅e1,⋯,af⋅ef]=[v1,⋯,vf](3)
Bilinear-Interaction layer
不同于FM或DeepFM模型中使用点积或hadamard积来获取交互特征,本文提出了Bilinear-Interaction方式,具体情况入下图c中所示,
v
i
v_i
vi 首先会乘一个权重矩阵
W
W
W 之后再和
v
j
v_j
vj 计算hadamard积。
根据权重矩阵
W
W
W 的不同分配方式,会有三种情况:
Field-All Type
所有的field共用一个权重矩阵
W
W
W,具体如下:
p
i
j
=
v
i
⋅
W
⊙
v
j
(4)
p_{ij} = v_i \cdot W \odot v_j \tag{4}
pij=vi⋅W⊙vj(4)
上述方式,参数量为
m
m
m ,
m
m
m 为权重矩阵的参数量,下同。
Field-Each Type
每个field对应一个权重矩阵
W
W
W,具体如下:
p
i
j
=
v
i
⋅
W
i
⊙
v
j
(5)
p_{ij} = v_i \cdot W_i \odot v_j \tag{5}
pij=vi⋅Wi⊙vj(5)
上述方式,参数量为
f
×
m
f \times m
f×m,
f
f
f 为field个数,下同。
Field-Interaction Type
每个交叉特征对应一个权重矩阵
W
W
W,具体如下:
p
i
j
=
v
i
⋅
W
i
j
⊙
v
j
(6)
p_{ij} = v_i \cdot W_{ij} \odot v_j \tag{6}
pij=vi⋅Wij⊙vj(6)
上述方式,参数量为
f
(
f
−
1
)
2
×
m
\frac{f(f-1)}{2} \times m
2f(f−1)×m。
经过SENet和Bilinear-Interaction之后,原本的embedding计算得到向量 q = [ q 1 , ⋯ q i ⋯ q n ] q = [q_1, \cdots q_i \cdots q_n] q=[q1,⋯qi⋯qn]。
Other layer
后面是一些常规操作,首先将embedding经过Bilinear-Interaction得到的
p
p
p 和embedding经过SENet再经过Bilinear-Interaction得到的
q
q
q 进行concat:
c
=
F
c
o
n
c
a
t
(
p
,
q
)
=
[
p
1
,
⋯
p
n
,
q
1
,
⋯
,
q
n
]
=
[
c
1
,
⋯
,
c
2
n
]
(7)
c = F_{concat}(p,q) = [p_1, \cdots p_n, q_1, \cdots, q_n] = [c_1, \cdots, c_{2n}] \tag{7}
c=Fconcat(p,q)=[p1,⋯pn,q1,⋯,qn]=[c1,⋯,c2n](7)
之后经过多层hidden layer:
a
(
l
)
=
σ
(
W
(
l
)
a
(
l
−
1
)
+
b
(
l
)
)
(8)
a^{(l)} = \sigma(W^{(l)} a^{(l-1)} + b^{(l)}) \tag{8}
a(l)=σ(W(l)a(l−1)+b(l))(8)
hidden layer输出的结果经过sigmoid输出:
y
^
=
σ
(
w
0
+
∑
i
=
0
m
w
i
x
i
+
y
d
)
(9)
\hat{y} = \sigma(w_0 + \sum_{i=0}^m{w_i x_i} + y_d) \tag{9}
y^=σ(w0+i=0∑mwixi+yd)(9)
损失函数定义为:
l
o
s
s
=
−
1
N
∑
i
=
1
N
(
y
i
l
o
g
(
y
^
i
)
+
(
1
−
y
i
)
∗
l
o
g
(
1
−
y
^
i
)
)
(10)
loss = -\frac{1}{N} \sum_{i=1}^N(y_i log(\hat{y}_i) + (1-y_i) * log(1-\hat{y}_i)) \tag{10}
loss=−N1i=1∑N(yilog(y^i)+(1−yi)∗log(1−y^i))(10)