Personalizing Search Results Using Hierarchical RNN with Query-aware Attention总结
论文链接
论文动机
在这篇论文之前关于个性化搜索的研究里,很少有研究考虑了历史queries和session的顺序信息。queries提出的顺序对于推断用户意图来说十分重要的,显然近期的session可以比陈旧的session提供更多的信息。所以本文为了利用这种序列信息,使用了层级RNN(HRNN)来挖掘这一信息,并自动的根据历史信息生成用户的描述文件。同时作者还引入了attention机制来根据当前的queries对历史信息赋予不同的权重,来动态的生成用户的描述文件。
训练过程简述
- 用带有attention机制的HRNN处理用户的历史信息,输入是queries和相应的文档向量,输出是短期描述向量和长期描述向量。分别计算长期向量和短期向量与候选文档的相似值。
- 同时也将其他的特征(例如query的点击熵,候选文档的原始排序,文档的点击数据等)通过MLP(Multilayer perceptron)编码。
- 将这三部分相加得到文档的re-ranking score。
- 使用LambdaRank模型这一基础的ranking算法来训练整个模型。
模型介绍
明确一下变量含义:
- u u u 表示用户
- L u L_u Lu 表示用户的查询记录(不包含当前session), L u = { S 1 , S 2 , . . . , S M − 1 } L_u = \{S_1,S_2,...,S_{M-1}\} Lu={S1,S2,...,SM−1}, S i S_i Si 表示一个历史session
-
S
M
S_M
SM 表示当前Session,每个session都包含一系列的queries,每个query都有一些列搜索引擎返回的文档
S M = { { q M , 1 , d M , 1 , 1 , d M , 1 , 2 , . . } , . . . , { q M , n M , d M , n M , 1 , d M , n M , 2 , . . } } S_M = \{\{q_{M,1},d_{M,1,1},d_{M,1,2},..\}, ...,\{q_{M,n_M},d_{M,n_M,1},d_{M,n_M,2},..\} \} SM={{qM,1,dM,1,1,dM,1,2,..},...,{qM,nM,dM,nM,1,dM,nM,2,..}},当前session里用户正在提出query q M , n M q_{M,n_M} qM,nM,并且返回 D D D - D D D表示当前query返回的文档列表。 D = { d 1 , d 2 , . . . } D= \{d_1,d_2,...\} D={d1,d2,...}. d i d_i di表示 d M , n M , i d_{M,n_M,i} dM,nM,i。
计算目标:
对于每一个候选文档,都计算他的相关性得分,这个得分基于三部分:
q
M
,
n
M
,
L
u
,
S
M
q_{M,n_M},L_u, S_M
qM,nM,Lu,SM
s
c
o
r
e
(
d
i
)
=
s
c
o
r
e
(
d
i
∣
q
M
,
n
M
,
S
M
,
S
M
−
1
,
.
.
.
,
S
1
)
=
s
c
o
r
e
(
d
i
∣
q
M
,
n
M
)
+
s
c
o
r
e
(
d
i
∣
L
u
)
+
s
c
o
r
e
(
d
i
∣
S
M
)
score(d_i) = score(d_i\mid q_{M,n_M}, S_M,S_{M-1},...,S_1) \\ = score(d_i\mid q_{M,n_M}) + score(d_i\mid L_u) + score(d_i\mid S_M)
score(di)=score(di∣qM,nM,SM,SM−1,...,S1)=score(di∣qM,nM)+score(di∣Lu)+score(di∣SM)
s
c
o
r
e
(
d
i
∣
q
M
,
n
M
)
score(d_i\mid q_{M,n_M})
score(di∣qM,nM)表示文档
d
i
d_i
di和query
q
M
,
n
M
q_{M,n_M}
qM,nM之间的相关性。
s
c
o
r
e
(
d
i
∣
L
u
)
score(d_i\mid L_u)
score(di∣Lu)表示文档
d
i
d_i
di和用户长期兴趣之间的相关性。
s
c
o
r
e
(
d
i
∣
S
M
)
score(d_i\mid S_M)
score(di∣SM)表示文档
d
i
d_i
di和用户短期兴趣之间的相关性。
下面从三个方面介绍模型
- 利用序列加强的用户兴趣
- 建模动态的用户描述文件
- 重排序
利用序列加强的用户兴趣
短期兴趣建模
这个图是模型的整体框架,用最底层的RNN来生成用户的短期兴趣。
需要的是当前session的部分数据:
S
m
′
=
{
{
q
m
,
1
,
D
m
,
1
}
,
.
.
.
,
{
q
m
,
n
m
,
D
m
,
n
m
}
}
S_m^{'} = \{\{q_{m,1},D_{m,1}\},...,\{q_{m,n_m},D_{m,n_m}\} \}
Sm′={{qm,1,Dm,1},...,{qm,nm,Dm,nm}}。
D
m
,
i
D_{m,i}
Dm,i表示对于当前query的用户满意文档。
把
q
m
,
i
q_{m,i}
qm,i的向量和
D
m
,
i
D_{m,i}
Dm,i里文档向量的平均向量
d
m
,
i
d_{m,i}
dm,i(如果没有满意文档设为零向量)拼接在一起作为RNN的输入。
在本模型里,每一个query和document的表达向量是单词向量的tf-idf加权平均。
session-level RNN 的隐藏神经元计算公式:
h
m
,
n
1
=
f
(
h
m
,
n
−
1
1
,
q
m
,
n
,
d
m
,
n
)
h^1_{m,n} = f(h^1_{m,n-1},q_{m,n},d_{m,n})
hm,n1=f(hm,n−11,qm,n,dm,n)
h
m
,
0
1
h^1_{m,0}
hm,01用零向量初始化,上标1,2表示RNN层数。
f
(
⋅
)
f(·)
f(⋅)表示RNN cell,可以用LSTM,GRU等。本模型里所有的RNN cell都是GRU。
r
m
,
n
1
=
σ
(
W
r
1
[
q
m
,
n
;
d
m
,
n
]
+
V
r
1
h
m
,
n
−
1
1
)
z
m
,
n
1
=
σ
(
W
r
1
[
q
m
,
n
;
d
m
,
n
]
+
V
r
1
h
m
,
n
−
1
1
)
c
m
,
n
1
=
t
a
n
h
(
W
1
[
q
m
,
n
;
d
m
,
n
]
+
V
1
(
r
m
,
n
1
⋅
h
m
,
n
−
1
1
)
)
h
m
,
n
1
=
(
1
−
z
m
,
n
1
)
⋅
h
m
,
n
−
1
1
+
z
m
,
n
1
⋅
c
m
,
n
1
r^1_{m,n}=\sigma(W_r^1[q_{m,n};d_{m,n}]+V_r^1h^1_{m,n-1})\\ z^1_{m,n}=\sigma(W_r^1[q_{m,n};d_{m,n}]+V_r^1h^1_{m,n-1})\\ c^1_{m,n} = tanh(W^1[q_{m,n};d_{m,n}]+V^1(r^1_{m,n}·h^1_{m,n-1}))\\ h^1_{m,n} = (1-z^1_{m,n})·h^1_{m,n-1}+z^1_{m,n}·c^1_{m,n}
rm,n1=σ(Wr1[qm,n;dm,n]+Vr1hm,n−11)zm,n1=σ(Wr1[qm,n;dm,n]+Vr1hm,n−11)cm,n1=tanh(W1[qm,n;dm,n]+V1(rm,n1⋅hm,n−11))hm,n1=(1−zm,n1)⋅hm,n−11+zm,n1⋅cm,n1
r
m
,
n
1
r^1_{m,n}
rm,n1是遗忘门,表示上一个状态的信息要丢弃多少,
z
m
,
n
1
z^1_{m,n}
zm,n1是更新门,表示上一个状态的信息要保留多少。所有的
W
,
V
W,V
W,V在所有session里都是共享参数。
最后一个隐层输出
h
m
,
n
m
1
h^1_{m,n_m}
hm,nm1看做是整个session的表示,也就是短期兴趣向量。为简化后文写作
h
m
1
h^1_m
hm1
长期兴趣建模
第二层RNN以第一层RNN的输出
{
h
1
1
,
.
.
.
,
h
M
−
1
1
}
\{h^1_1,...,h^1_{M-1}\}
{h11,...,hM−11}作为输入,计算
{
h
1
2
,
.
.
.
,
h
M
−
1
2
}
\{h^2_1,...,h^2_{M-1}\}
{h12,...,hM−12}:
h
m
2
=
f
(
h
m
−
1
2
,
h
m
1
)
h^2_m = f(h^2_{m-1},h^1_m)
hm2=f(hm−12,hm1)
h
0
2
h^2_0
h02用零向量初始化
f
(
⋅
)
f(·)
f(⋅)依然是GRU
不过长期兴趣向量不是直接用最后一个隐层的状态
h
M
−
1
2
h^2_{M-1}
hM−12来表示了,因为历史数据对于当前query的重要程度是不同的,所以引入了attention机制为历史session加权。
建立动态用户描述文件
为每个二层隐层
{
h
1
2
,
.
.
.
,
h
M
−
1
2
}
\{h^2_1,...,h^2_{M-1}\}
{h12,...,hM−12}计算weights
{
α
1
,
α
2
,
.
.
.
,
α
M
−
1
}
\{\alpha_1,\alpha_2,...,\alpha_{M-1}\}
{α1,α2,...,αM−1}
e
i
=
ϕ
(
q
M
,
n
M
,
h
i
2
)
α
i
=
exp
(
e
i
)
∑
j
=
1
M
−
1
exp
(
e
j
)
e_i = \phi(q_{M,n_M},h^2_i)\\ \alpha_i = \frac{\exp(e_i) }{\sum_{j=1}^{M-1}\exp(ej)}
ei=ϕ(qM,nM,hi2)αi=∑j=1M−1exp(ej)exp(ei)
ϕ
(
⋅
)
\phi(·)
ϕ(⋅)是一个多层感知器(MLP),
t
a
n
h
(
⋅
)
tanh(·)
tanh(⋅)做激活器。长期兴趣向量
h
M
−
1
2
,
q
h^{2,q}_{M-1}
hM−12,q计算如下:
h
M
−
1
2
,
q
=
∑
M
−
1
i
=
1
α
i
h
i
2
h^{2,q}_{M-1}=\sum^{i=1}_{M-1}\alpha_ih^2_i
hM−12,q=M−1∑i=1αihi2
重排序(Re-ranking)
s
c
o
r
e
(
d
i
∣
L
u
)
=
s
i
m
(
(
h
M
−
1
2
,
q
)
T
W
L
,
d
i
)
s
c
o
r
e
(
d
i
∣
S
M
)
=
s
i
m
(
(
h
M
,
n
M
1
)
T
W
S
,
d
i
)
score(d_i\mid L_u) = sim((h^{2,q}_{M-1})^TW_L,d_i)\\ score(d_i\mid S_M) = sim((h^1_{M,n_M})^TW_S,d_i)
score(di∣Lu)=sim((hM−12,q)TWL,di)score(di∣SM)=sim((hM,nM1)TWS,di)
W
L
W
S
W_L W_S
WLWS是两个相似矩阵,将兴趣向量映射到和文档相同的语义空间,在训练的时候优化。
s
i
m
(
X
,
Y
)
=
X
T
Y
∥
X
∥
⋅
∥
Y
∥
sim(X,Y) = \frac{X^TY}{\|X\|·\|Y\|}
sim(X,Y)=∥X∥⋅∥Y∥XTY
除了这两个score作者 还将query-document 相关特征、点击特征作为额外特征。因为原始的query-document特征无法直接获得,所以使用了原始的文档位置作为特征。点击特征也包括某个文档的额历史点击数量以及输入query的点击熵等。将这些额外特征作为输入传入MLP中,tanh作为激活函数获得第三部分的score。将这些score加在一起作为最终的相似得分。
使用LambdaRank这个基础的排序算法来对结果做重排序。
从查询记录里生成训练样本对,用户满意的文档当作相关文档,反之为不相关文档。以
d
i
d_i
di(相关文档),
d
j
d_j
dj(不相关文档)为例,loss就是期望分布和预测分布的交叉熵 和 度量变化程度
Δ
\Delta
Δ的乘积:
l
o
s
s
=
(
−
p
i
j
log
(
p
i
j
′
)
−
p
j
i
log
(
p
j
i
′
)
)
∣
Δ
∣
loss = (-p_{ij}\log(p_{ij}^{'})-p_{ji}\log(p_{ji}^{'}))|\Delta|
loss=(−pijlog(pij′)−pjilog(pji′))∣Δ∣
这里
Δ
\Delta
Δ用MAP计算,因为MAP能够激励把更相关的文档放在前面。
p
i
j
′
p_{ij}^{'}
pij′代表预测的
d
i
d_i
di比
d
j
d_j
dj更相关的概率,
p
i
j
p_{ij}
pij代表真实的
d
i
d_i
di比
d
j
d_j
dj更相关的概率。
p
i
j
′
p_{ij}^{'}
pij′计算如下:
p
i
j
′
=
1
1
+
exp
(
−
(
s
c
o
r
e
(
d
i
)
−
s
c
o
r
e
(
d
j
)
)
)
p_{ij}^{'} = \frac{1}{1+\exp(-(score(d_i)-score(d_j)))}
pij′=1+exp(−(score(di)−score(dj)))1
结果评估度量
MAP,MRR,Avg.Click是比较常见的也很好理解,这里想重点说一下
#
B
e
t
t
e
r
\#Better
#Better这个度量。
因为一个用户是否点击某个文档不止和文档的相关性有关,还和他的位置相关,这种位置上的偏差可能会对主流指标造成影响。比如位置较低的文档被查看的概率就很低,即使他们可能相关,但是也不会被点击。这种文档就被主流指标错误的看做负样本(无关样本),从而如果提升这种文档的rank,主流指标是会降低的,从而对结果造成影响。所以
#
B
e
t
t
e
r
\#Better
#Better这个度量的计算对象是正负样本对,把被用户点击的文档看做是比被跳过的文档更好(更相关)的。(也就是不考虑位置太低的文档,只考虑真正相关/无关的文档)。本来位置错误的文档对经过重排序后位置正确了,称这个样本对为mproved pair,
#
B
e
t
t
e
r
\#Better
#Better就加一。同时也引入
P
−
I
m
p
r
o
v
e
P-Improve
P−Improve表示improved pairs的百分比。
后记
欢迎评论指正=v=