今天讲的博客参考了2019年的AAAI的一篇paper《Deep Interest Evolution Network for Click-Through Rate Prediction》,这又是阿里妈妈盖坤组新的一篇paper,同时也是之前公布的深度置信网络《Deep Interest Network》的进阶版。
整体来说这篇paper最大的亮点还是体现在对于用户历史行为序列的建模上,之前的深度置信网络是对这些用户行为进行加权求和,而这里的深度兴趣演化网络则利用了GRU网络结构。这篇文章的提出主要是解决广告推荐方向的2个问题:1 是用户的兴趣会随着时间的推移而产生变化;2 使用用户的行为数据特征来描述用户latent兴趣存在误差。基于此,作者提出了一下的网络结构:
整体来说模型中有2块结构是比较重要的:Interest Extractor Layer和Interest Evolving Layer,这两种结构都是以GRU模型为基础改造的。GRU的基本形式如下所示:
u
t
=
σ
(
W
u
x
t
+
U
u
h
t
−
1
+
b
u
)
u_t=\sigma(W_ux_t+U_uh_{t-1}+b_u)
ut=σ(Wuxt+Uuht−1+bu)
r
t
=
σ
(
W
r
x
t
+
U
r
h
t
−
1
+
b
r
)
r_t=\sigma(W_rx_t+U_rh_{t-1}+b_r)
rt=σ(Wrxt+Urht−1+br)
p
t
=
t
a
n
h
(
W
p
x
t
+
r
t
⨀
U
h
h
t
−
1
+
b
h
)
p_t=tanh(W_px_t+r_t \bigodot U_h h_{t-1}+b_h)
pt=tanh(Wpxt+rt⨀Uhht−1+bh)
h
t
=
(
1
−
u
t
)
⨀
h
t
−
1
+
u
t
⨀
p
t
h_t=(1-u_t) \bigodot h_{t-1}+u_t \bigodot p_t
ht=(1−ut)⨀ht−1+ut⨀pt
其中Interest Extractor Layer用来解决用户latent兴趣的提取问题,Interest Evolving Layer用来解决用户兴趣的演化问题。在介绍这两种结构的细节之前,我们首先来说一下这个任务的具体形式,模型的输入由4个维度的信息组成:1 User Profile(年龄,性别等);2 User behavior (一段时间内用户点击过的商品id等);3 Item信息(商品id,所属shop id等);4 Context信息(购买设备,购买时间等)。不难看出,其中的User behavior对于每一条需要预测的样本来说是一个序列特征,这部分是本篇paper处理的重点。
Interest Extractor Layer
在该结构中,作者提出了一种 auxiliary 损失函数来辅助生成用户的latent的兴趣向量。直白来说,就是将用户过去一段时间内(一般是2周)的User behavior对应的序列输入到GRU模型中,然后把最后一时刻
T
T
T 对应的GRU输出的hidden state向量作为用户整个目前状态下的兴趣表征,这样最终模型训练出来的参数更多倾向于以最后几个时刻的点击行为来作为用户的兴趣特征;同时,GRU产生的一系列
h
t
h_t
ht只能捕捉到相邻行为序列之间的依赖关系,并不是直接的用户兴趣。为了克服这些缺点,作者将GRU每一时刻的
h
t
h_t
ht都进行商品的点击率的预测,正样本就是该时刻的点击商品,负样本就是随机从该时刻用户看了但是却没有点击的商品中随机抽样获得的。这部分的损失也被称之为auxiliary损失:
L
a
u
x
=
−
1
N
(
∑
i
=
1
N
∑
t
l
o
g
σ
(
h
t
,
p
t
i
(
t
+
1
)
)
+
l
o
g
(
1
−
σ
(
h
t
,
n
b
i
(
t
+
1
)
)
)
)
L_{aux}=-\frac{1}{N}(\sum_{i=1}^N\sum_t log \sigma(h_t,p_t^i(t+1))+log(1-\sigma(h_t,n^{i}_b(t+1))))
Laux=−N1(∑i=1N∑tlogσ(ht,pti(t+1))+log(1−σ(ht,nbi(t+1))))
其中
p
t
i
(
t
+
1
)
p_t^i(t+1)
pti(t+1)是用户
t
+
1
t+1
t+1时刻点击的商品的embedding向量形式即Positive sample,
n
b
i
(
t
+
1
)
n^{i}_b(t+1)
nbi(t+1)是用户
t
+
1
t+1
t+1时刻看过但是没有点击的商品的embedding向量形式即Negative sample。这样GRU生成的hidden state序列
h
1
,
h
2
,
.
.
.
.
h
n
h_1,h_2,....h_n
h1,h2,....hn就能够真正反映用户的兴趣信息。
Interest Evolving Layer
在Interest Extractor Layer生成了hidden state序列
h
1
,
h
2
,
.
.
.
.
h
n
h_1,h_2,....h_n
h1,h2,....hn之后(这些序列也代表了用户的兴趣序列),需要另一个GRU来对这些hidden state序列进行建模,在建模之前考虑到一个用户在每一时刻的兴趣都包含了多个方面的内容,那么在对当前商品进行预测的时候,需要提取出这些行为序列中和当前带预测商品一致的那部分信息来,这里使用了attention机制:
α
t
=
e
x
p
(
h
t
W
e
t
)
∑
j
=
1
t
e
x
p
(
h
j
W
e
t
)
\alpha_t=\frac{exp(h_tWe_t)}{\sum_{j=1}^texp(h_jWe_t)}
αt=∑j=1texp(hjWet)exp(htWet),其中
h
t
h_t
ht是上一个GRU输出的用户兴趣向量,
e
t
e_t
et是待预测商品embedding形式向量。
具体如何将这些通过attention生成的权值参数反映到用户点击广告行为特征序列embedding中,作者提出了下面三种方案:
1 GRU with attentional input
简单的把用户点击广告行为特征embedding在输入到GRU之前乘上这些权重
α
\alpha
α,但是这样效果并不好,因为即使
α
\alpha
α缩减成0,还是会引起GRU hidden state状态的变化。
2 Attention based GRU
就是把基本GRU公式中
h
t
h_t
ht的生成公式改成如下形式:
h
t
=
(
1
−
α
t
)
∗
h
t
−
1
+
α
t
∗
p
t
h_t=(1-\alpha_t)*h_{t-1}+\alpha_t*p_t
ht=(1−αt)∗ht−1+αt∗pt,说白了就是把传统GRU中的update门替换成attention生成的
α
\alpha
α。这样其实效果相对于第一种稍有提高,但是这种放缩针对于
h
t
h_t
ht中每一维度的幅度都是一致的,显然这也是不太合理的。
3 GRU with attentional update gate
就是第二种策略的改进版本,说白了就是对update gate生成的参数乘上
α
\alpha
α,公式如下所示:
u
t
=
α
∗
u
t
u_t=\alpha*u_t
ut=α∗ut
h
t
=
(
1
−
u
t
)
⨀
h
t
−
1
+
u
t
∗
p
t
h_t=(1-u_t) \bigodot h_{t-1}+u_t * p_t
ht=(1−ut)⨀ht−1+ut∗pt。
这种方式取得了很好的效果。
最终模型的整体损失函数形式如下:
L
=
L
t
a
r
g
e
t
+
α
∗
L
a
u
x
L=L_{target}+\alpha*L_{aux}
L=Ltarget+α∗Laux。
经过作者通过AUC指标和A/B测试两个维度证明提出模型的优势。