Employing Personal Word Embeddings for Personalized Search总结
论文链接
Idea
自然语言中有许多二次单词,例如“Apple",不同知识背景和兴趣爱好的人对于这些单词会有不同的理解,所以对于不同的用户,这种歧义单词应该有不同的语义表达!
和之前常见的基于用户profile的个性化搜索所不同的是,这里直接在w2c的过程中就根据用户兴趣做了个性化,整个模型都是围绕这个思想展开。
模型整体结构
- 个性化嵌入层。包括每一个用户的嵌入矩阵(embedding matrices),用来获得单词级别的向量表达。
- 计算query和document的语境表达层。利用muti-head attention 和 self-attention层来融合语境信息,获得query和document的表达。
- 使用KNRM组件来计算query和document的相似性。
- 最后包含两个任务,一个是个性化文档排序(老生常谈),另一个是query reformulation,这一步的作用是更好的预测用户提出当前query的意图。从而端到端的训练个性化单词嵌入和排序模型。
考虑到人们会搜索一些从来没搜过的东西,当这些单词没有在某个用户的语料库里出现的时候,也要能很好的表达,于是作者还维护了一个全局的嵌入矩阵,该矩阵利用整体的搜索记录词汇表训练。
作者将构建的模型称作PEPS(Personal
Embedding based Personalized Search model))
同时还有一个问题:训练嵌入矩阵需要比较大的语料库,然而每个用户的数据都很少,如何比较好的初始化每个用户的嵌入矩阵呢?作者提供了两种方法:
1.使用全局的w2c model
2.利用兴趣相似的一批用户记录来训练嵌入矩阵
之后线上实时捕捉用户新产生的数据,来提取用户的新兴趣。使得对于每个用户来说,那些重要单词的表达只包含当前用户感兴趣的信息,从而更好地推断用户的意图。
模型详细内容
符号
u
1
,
u
2
,
.
.
.
,
u
i
u_1,u_2,...,u_i
u1,u2,...,ui表示各个用户,每个用户在
T
T
T时刻都有自己的历史记录
H
i
T
H_i^T
HiT,
H
i
T
H_i^T
HiT包含用户
u
i
u_i
ui在
T
T
T时刻以前提出的一系列queries
{
q
i
,
1
,
q
i
,
2
,
.
.
,
q
i
,
N
i
T
}
\{q_{i,1},q_{i,2},..,q_{i,N_i^T} \}
{qi,1,qi,2,..,qi,NiT}、在每一个query
q
i
,
j
q_{i,j}
qi,j下点击的文档集
D
i
,
j
+
D_{i,j}^+
Di,j+和未点击的文档集
D
i
,
j
−
D_{i,j}^-
Di,j−。
D
=
{
d
1
,
d
2
,
.
.
.
,
}
D=\{d_1,d_2,...,\}
D={d1,d2,...,}表示非个性化的搜索引擎对于一个query
q
q
q返回的候选文档集。
训练过程包括以下三个:
- 个性化单词嵌入的预训练阶段(Pre-training)
- 模型的有监督训练阶段
- 线上更新阶段(Update)
Pre-training
我们之前提到了两个方法来解决单个用户语料库不够同时还要保证嵌入矩阵包含用户兴趣的问题,现在详细说一下:
第一个是在利用整个搜索记录来训练一个gloable w2c模型,使用这个模型初始化每个用户的个性化嵌入模型以及全局模型。
第二种是考虑了用户兴趣,通过这个用户以及和他兴趣相似的K个用户的查询记录来把全局的w2c模型适应到为当前用户的个性化模型。兴趣相似的用户是通过协同过滤算法查找的。作者建立了用户相似矩阵
W
W
W,
u
i
和
u
j
u_i和u_j
ui和uj的相似度用
W
i
j
W_{ij}
Wij表示。
W
i
j
=
∑
d
∈
N
(
u
i
)
∩
N
(
u
j
)
1
l
o
g
(
1
+
∣
N
(
d
)
∣
)
∣
N
(
u
i
)
∣
∣
N
(
u
j
)
∣
W_{ij} = \frac{\sum_{d \in N(u_i)\cap N(u_j)} \frac{1}{log(1+|N(d)|)}}{\sqrt{|N(u_i)||N(u_j)|}}
Wij=∣N(ui)∣∣N(uj)∣∑d∈N(ui)∩N(uj)log(1+∣N(d)∣)1
其中,
N
(
u
)
N(u)
N(u)表示u点击过的文档集,
N
d
N_d
Nd表示点击文档
d
d
d的用户的集合。这样当点击文档d的人数少时,说明这个文档更小众,更能代表二人有共同兴趣,对
W
i
j
W_{ij}
Wij的贡献更大,反之更小。
个性化模型(Personalization Model)
这一部分的目的是微调个性化单词嵌入,使得每个个性单词向量都能包用户的真实兴趣。
经过了预训练的阶段后,对每个用户可以粗略的而非精细的获得个性化单词向量,因为W2C模型是一个无监督的模型,可以捕捉同现或语义关系,但是不能学习用户的兴趣。
这一过程利用的是用户的点击信息。
Figure1是整个模型的框架,包含四个部分:
- 个性化单词嵌入层,包括一个全局单词嵌入矩阵和每个用户都有的个性化单词嵌入矩阵。
- query和document从不同粒度获得的表达。
- 使用KNRM来计算query和document之间的匹配值,并且使用面向文档对的LambdaRank模型来训练排序模型。
- query reformulation子模型来促进个性化嵌入的学习,这一步的作用是更好的预测用户提出当前query的意图。
个性单词嵌入层
每个单词的表示都包含两部分,例如单词“Apple”对于用户 u i u_i ui的表示是“Apple+ u i u_i ui”。
在finetune之前,要为每个用户确定独特的词汇表。筛选原则如下:
- 不是停顿词的单词
- 在用户的搜索记录里出现次数超过 c c c次的
- 单词熵不低于设定阈值的。
单词熵计算如下:
W o r d E n t r o p y = ∑ q ∈ Q ( w ) C l i c k E n t r o p y ( q ) ∣ Q ( w ) ∣ C l i c k E n t r o p y ( q ) = ∑ d ∈ D ( q ) − P ( d ∣ q ) log 2 P ( d ∣ q ) WordEntropy = \frac{\sum_{q \in Q(w)}ClickEntropy(q)}{|Q(w)|}\\ ClickEntropy(q) = \sum\limits_{d\in D(q)}-P(d|q)\log_2P(d|q) WordEntropy=∣Q(w)∣∑q∈Q(w)ClickEntropy(q)ClickEntropy(q)=d∈D(q)∑−P(d∣q)log2P(d∣q)
Q ( w ) Q(w) Q(w)是所有包含单词 w w w的queries的集合。 D ( q ) D(q) D(q)是query q q q下点击的所有文档。 P ( d ∣ q ) = ∣ C l i c k s ( q , d ) ∣ ∣ C l i c k s ( q , ⋅ ) P(d|q) = \frac{|Clicks(q,d)|}{|Clicks(q,·)} P(d∣q)=∣Clicks(q,⋅)∣Clicks(q,d)∣
query和document的表示
query和document的组成有4部分:
-
个性化单词表示。通过单词嵌入矩阵,获得 P q ∈ R d i m × ∣ q ∣ P^q\in R^{dim\times|q|} Pq∈Rdim×∣q∣的query单词矩阵和 P d ∈ R d i m × ∣ d ∣ P^d\in R^{dim\times|d|} Pd∈Rdim×∣d∣的文档单词矩阵。
-
个性化语境表达。刚才获得的是单词level的query和document的表达,为了获得query level的表达来进一步阐述用户意图,要考虑进去上下文的交互。对于上一部分的输出添加了multi-head self-attention层,来获得两个矩阵 C P q ∈ R d i m × ∣ q ∣ a n d C P q ∈ R d i m × ∣ d ∣ CP^q\in R^{dim\times |q|} and CP^q\in R^{dim\times |d|} CPq∈Rdim×∣q∣andCPq∈Rdim×∣d∣。计算如下:
C P q = C o n c a t ( h e a d 1 , h e a d 2 , . . . , h e a d h ) W A h e a d i = s o f t m a x ( P q W i Q ( P q W k K ) T ( d k ) ) ( P q W i V ) CP^q = Concat(head_1,head_2,...,head_h)W^A\\ head_i = softmax(\frac{P^qW_i^Q(P^qW_k^K)^T}{\sqrt(d_k)})(P^qW_i^V) CPq=Concat(head1,head2,...,headh)WAheadi=softmax((dk)PqWiQ(PqWkK)T)(PqWiV)
d k , d q , d v d_k,d_q,d_v dk,dq,dv表示attention机制里key,query,value的维度。
同理可得 C P d CP^d CPd -
全局单词表示
G q ∈ R d i m × ∣ q ∣ G d ∈ R d i m × ∣ d ∣ G^q\in R^{dim\times|q|} G^d\in R^{dim\times |d|} Gq∈Rdim×∣q∣Gd∈Rdim×∣d∣是对query和document的两个嵌入矩阵 -
全局语境表示
对全局单词向量执行muti-head self-attention后获得了全局语境向量 C G q C G d CG^q \quad CG^d CGqCGd
通过这四个部分,可以获得query和document的不同粒度的表达。
query-document匹配和排序
在这里一部分利用KNRM来计算两者的相似得分
S
P
S^P
SP表示单词相似矩阵,
S
i
j
P
S^P_{ij}
SijP是query单词
w
i
q
w_i^q
wiq和document单词
w
j
d
w^d_j
wjd的迁入后的余弦相似度。之后用多个RBF核作用在
S
P
S^P
SP上来提取多等级query和document之间的软标签特征。
ϕ
(
S
P
)
=
∑
i
=
1
∣
q
∣
l
o
g
(
K
→
(
S
i
P
)
)
K
→
(
S
i
P
)
=
{
K
1
(
S
i
P
)
,
K
2
(
S
i
P
)
,
.
.
,
K
k
(
S
i
P
)
}
K
k
(
S
i
P
)
=
∑
j
exp
(
−
(
S
i
j
P
−
μ
k
)
2
2
σ
k
2
)
\phi(S^P)=\sum_{i=1}^{|q|}log(\overrightarrow{K}(S^P_i))\\ \overrightarrow{K}(S_i^P) = \{K_1(S_i^P),K_2(S_i^P),..,K_k(S_i^P)\}\\ K_k(S_i^P)=\sum\limits_j \exp(-\frac{(S^P_{ij}-\mu_k)^2}{2\sigma_k^2})
ϕ(SP)=i=1∑∣q∣log(K(SiP))K(SiP)={K1(SiP),K2(SiP),..,Kk(SiP)}Kk(SiP)=j∑exp(−2σk2(SijP−μk)2)
∣ q ∣ |q| ∣q∣是query的长度。 K K K是RBF核的数量。 μ k 、 σ k \mu_k 、 \sigma_k μk、σk是第k个核的均值和标准差。
之后使用MLP和tanh(·)做激活函数来把这些特征联合起来并计算匹配值
f
P
(
q
,
d
)
f^P(q,d)
fP(q,d)。
f
P
(
q
,
d
)
=
t
a
n
h
(
W
P
T
ϕ
(
S
P
)
+
b
P
)
f^P(q,d)=tanh(W_P^T\phi(S^P)+b^P)
fP(q,d)=tanh(WPTϕ(SP)+bP)
同理也可以把上述计算方法应用到其他的几个单词向量矩阵上。如此可以获得以下四个匹配值:
f
P
(
q
,
d
)
f
G
(
q
,
d
)
f
C
P
(
q
,
d
)
f
C
G
(
q
,
d
)
f^P(q,d) f^G(q,d) f^{CP}(q,d) f^{CG}(q,d)
fP(q,d)fG(q,d)fCP(q,d)fCG(q,d)。
还有另外两个score:计算query在reformulation模型里的隐层状态和用dense layer处理文档单词level矩阵后的表达之间的余弦匹配值获得的score
f
Q
R
(
q
,
d
)
f^{QR}(q,d)
fQR(q,d)、把一些基于点击的特征和有利于排序的相似性特征送入tanh(·)为激活函数的MLP中计算得来的相似得分,论文没有命名,我们姑且称之为
f
f
t
f^{ft}
fft
之后又用了一层MLP来把这六个score融合起来获得了每个document的个性化得分。
使用LambdaRank算法来训练排序模型。
- 构建文档对。被点击的作为正样本,被跳过的文档作为负样本。
- 每一个文档对都有一个 λ \lambda λ,表示的是当交换这两个文档的位置时,MAP这一指标的变化值。
- loss值计算如下:
l o s s = ( − p ^ ( i > j ) log ( p ( i > j ) ) − p ^ ( i < j ) log ( p ( i < j ) ) ) ∣ λ i j ∣ loss = (-\hat{p}_{(i>j)}\log(p_{(i>j)})-\hat{p}_{}(i<j)\log(p_{(i<j)}))|\lambda_{ij}| loss=(−p^(i>j)log(p(i>j))−p^(i<j)log(p(i<j)))∣λij∣
p ( i > j ) = σ ( s c o r e ( d i ) − s c o r e ( d j ) ) p_{(i>j)} = \sigma(score(d_i)-score(d_j)) p(i>j)=σ(score(di)−score(dj))
p ( i > j ) p_{(i>j)} p(i>j)表示预测的 d i d_i di相关性大于 d j d_j dj相关性的概率。 p ^ ( i > j ) \hat{p}_{(i>j)} p^(i>j)表示真实的 d i d_i di相关性大于 d j d_j dj相关性的概率(0 or 1)。
Query Reformulation
这一步的目的就是希望能通过对RNN编码后的query representation再次解码,能够解出下一个query,从而使得编码能够更好地表示当前用户的意图。
所以作者添加了一个query reformulation的任务,和ranking model一起训练。
学习目标是同一个session里的下一个query,因为这一个query被看做是比当前的query更能表达用户的意图。输入是query的个性化单词表示
P
q
P^q
Pq。使用GRU来编码。
h
t
=
G
R
U
(
P
t
q
,
h
t
−
1
)
h_t = GRU(P^q_t,h_{t-1})
ht=GRU(Ptq,ht−1)。最后一个隐层
h
∣
q
∣
h_|q|
h∣q∣被看做是用户真实意图的表示。
带有attention机制的GRU用来解码。
o
t
o_t
ot表示目标序列的每一个单词。
s
t
s_t
st表示当前一次能状态。
c
t
c_t
ct表示语境向量。
p
(
o
t
∣
{
o
1
,
.
.
.
,
o
t
−
1
,
h
∣
q
∣
}
=
s
o
f
t
m
a
x
(
W
[
s
t
,
c
t
]
+
b
)
s
t
=
G
R
U
(
s
t
−
1
,
o
t
−
1
,
c
t
)
c
t
=
∑
j
=
1
∣
q
∣
α
t
j
h
j
α
t
j
=
exp
(
a
(
s
t
−
1
,
h
j
)
)
∑
k
=
1
∣
q
∣
exp
(
a
(
s
t
−
1
,
h
k
)
)
p(o_t|\{o_1,...,o_{t-1},h_|q|\} = softmax(W[s_t,c_t]+b)\\ s_t = GRU(s_{t-1},o_{t-1},c_t)\\ c_t = \sum_{j=1}^{|q|}\alpha_{tj}h_j\\ \alpha_{tj} = \frac{\exp(a(s_{t-1},h_j))}{\sum_{k=1}^{|q|}\exp(a(s_{t-1},h_k))}
p(ot∣{o1,...,ot−1,h∣q∣}=softmax(W[st,ct]+b)st=GRU(st−1,ot−1,ct)ct=j=1∑∣q∣αtjhjαtj=∑k=1∣q∣exp(a(st−1,hk))exp(a(st−1,hj))
函数
a
(
⋅
)
a(·)
a(⋅)可以是一个点乘,或是可训练的MLP。目标序列的概率计算如下:
p
(
o
)
=
∏
t
=
1
T
p
(
o
t
∣
{
o
1
,
.
.
.
,
o
t
−
1
,
h
∣
q
∣
}
p(o) = \prod_{t=1}^Tp(o_t|\{o_1,...,o_{t-1},h_{|q|}\}
p(o)=t=1∏Tp(ot∣{o1,...,ot−1,h∣q∣}
损失函数是目标序列预测概率的负log值。
整个模型的的优化目标是负log概率和文档对loss的和。