PSGAN: A Minimax Game for Personalized Search with Limited and Noisy Click Data总结
首先提出问题:
深度学习由于良好的自动从数据中提取特征的能力而广泛应用在个性化搜索中。然而历史记录里一些噪音信息,比如和当前query相关性不高的数据对于当前query来说是无用的,因此有了一个挑战:在具有相关数据和无关数据的条件下,如何找到合适的(个性化)分类边界,也就是如何判别某个document和当前的query以及用户是否相关。
然后放出解决方法:
作者提出了一个PSGAN======>针对个性化搜索的GAN。
它通过对抗训练,使得模型更加关注那些难以分辨的训练数据。
分辨器的目标是:更好的接近满足用户意向的documents的分布。(找到更好的分辨边界)
生成器的目标是:生成更好的负样本(混淆分辨器)
简单说一下PSGAN的结构:分辨器评估文章的相关性,生成器学习相关文档的分布。
那么如何构建生成器呢?文章提供了两种思路:
基于文档选择的生成器 or 基于生成query的生成器。
更详细的说明:
基于文档的是:在负样本空间(documents)里采样作为生成的文档。
基于生成query的是:先根据用户的意向(user intents)和当前query生成相关的一系列queries,然后根据生成的queries计算documents的相关性,希望能通过增强信息来更好的估计文档的相关性。
实验表明后者更好
深度学习模型的好处是
可以自动的从训练集中学习 文章的表示、用户描述文件以及其他相关的特征,而不用手工设计。也可以覆盖大范围的特征。
所以:训练集很重要!
但是他们有很多参数,并且需要大量的数据才可以。然而个性化搜索十分依赖用户的个人信息,然而用户的历史记录数据量有限,每个搜索只点几下,而且历史记录是有噪音的,用户可能点击无关的(自己不感兴趣的)文章,而且不同的偏好重要程度也不一样,
因此,作者的目标:设计一个能选择更细粒度的偏好作为训练集的方法。
做GAN的一个挑战:文字数据是离散的,所以无法随意生成一个负样本。解决方法是:跟着IRGAN学,我们从负样本空间采样(未点击过的或者没有标签的数据集),作为生成的样本。
注意,这里给负样本空间下了一个定义:未点击过的或者没有标签的数据集
接下来就是具体的模型描述
先把一些符号含义明确一下:
U=Lu?∪{SM?},Lu?={S1?,...,Si?,...,SM?1?}
M是用户
u的session数量。每一个Session
Si?都包含了一系列queries, 每一个queries都包含一个string和一个搜索引擎返回的文档列表。
如果单说
d时,隐含意思是用户
u提出的
q的结果里面的一个文档
d。
ptrue?(d∣q,U,r)表示对于用户
u,query
q,文档的相关性的真实分布。
discriminator:
f??(d,q,U)。努力学习真实的样本相关性分布,来分辨对于
q,
U来说相关的文档和无关的文档。
generator:
pθ?(d∣q,U,r)。通过生成器
gθ?努力学习一个接近
ptrue?(d∣q,U,r)的分布
pθ?(d∣q,U,r),基于该分布来生成负样本。
优化目标:
JG?,D?=θmin??max?q∈Q∑?(Ed?ptrue?(d∣q,U)?logD??(d∣q,U)+Ed?pθ?(d∣q,U)?log(1?D??(d∣q,U)))
pθ?(d∣q,U)就是G,
D??表示分类器,输出相关可能性:
D??(d∣q,U)=σ(f??(d,q,U))=1+expf??(d,q,U)expf??(d,q,U)?
分类器的优化:
??=arg?max?q∈Q∑?(Ed?ptrue?(d∣q,U)?logD??(d)+Ed?pθ?(d∣q,U)?log(1?D??(d)))
论文中把训练集变成了正负样本对的形式,这样把公式转变成:
??=arg?max?q∈Q∑?(Ed+?,dθ??logD??(d)+log(1?D??(d)))
d+?从
ptrue?(d∣q,U,r)中采样,
d?? 从
pθ?(d∣q,U,r)中采样
进一步简化为
??=arg?max?q∈Q∑?(Ed+?,dθ??logD??(d)?logD??(d))
更进一步:
基于生成概率添加一个权重
rθ?(d+?,d??),表示当前这个文档对的重要程度
rθ?(d+?,d??)=pθ?(dθ?∣q,U,r)?pθ?(d+?∣q,U,r)
当
pθ?(dθ?∣q,U,r)较大而
pθ?(d+?∣q,U,r)较小时,说明
dθ?难以分辨,对于这种困难样本对,应该重点关注,因此对应的权重大。
生成器的优化:
文中只给出了梯度计算公式:
?θ?JG(q)?∣D′∣1?d∈D′∑??θ?logpθ?(d∣q,U)log(1+exp(f??(d)))
(
D′ 表示生成的样本,也就是从负样本集里选出来的相关性较高的样本)
通过查阅IRGAN相关论文和博客,整理出改梯度公式的推导过程如下:
原始的优化目标如下:
θ?=arg?min?q∈Q∑?(Ed?ptrue?(d∣q,U)?logD??(d)+Ed?pθ?(d∣q,U)?log(1?D??(d)))
==>θ?=arg?min?q∈Q∑?(Ed?pθ?(d∣q,U)?log(1?D??(d)))
==>θ?=arg?max?q∈Q∑?(Ed?pθ?(d∣q,U)?log(1+exp(f??(d)))
(注意这里比较特殊的是优化目标是最大值)
==>?θ?JG(q)=?θ?Ed?pθ?(d∣q,U)?log(1+exp(f??(d)))
==>?θ?JG(q)=M1?i=1∑m??θ?pθ?(di?∣q,U)log(1+exp(f??(d)))
==>?θ?JG(q)=M1?i=1∑M?pθ?(di?∣q,U)?θ?log(pθ?(di?∣q,U))log(1+exp(f??(d)))
==>?θ?JG(q)=Ed?pθ?(d∣q,U)??θ?log(pθ?(di?∣q,U))log(1+exp(f??(d)))
==>?θ?JG(q)=K1?i=1∑K??θ?log(pθ?(di?∣q,U))log(1+exp(f??(d)))
其中M表示所有负样本的数量,K表示按照
pθ?(di?∣q,U))采样出的生成样本的数量,以采样数据来近似期望。
上面讲了生成器和分类器的优化公式,接下来我们详细讲一下两种生成器:
基于文档的生成器:
停留时间超过30s的点击以及一个session里最后一次click,当作满意的点击(文档),把正样本上方被跳过的那些文档以及下一个没被点击的文档当作无关文档。
对于这个模型,生成器和分类器的模型结构一致。
我们先看看分类器的结构:
对于当前的用户
U和query
q,
f??(d)=score??(d∣q,SM?,SM?1?,...,S1?)
可以把
f??(d)分为三个部分:一部分计算d和q的相关性,一部分计算d和当前用户短期描述文件的相关性,一部分计算d和当前用户长期描述文件的相关性:
f??(d)=Ff?(score??(ddimq),score??(ddimLu?),score??(ddimSM?)
Lu?表示长期描述,
SM?表示短期描述,
Ff?是一层把三个score连接在一起的神经网络。
下面是作者在HRNN基础上设计的HRNN+网络结构,作为分类器和基于文档的生成器的网络结构:
下面介绍HRNN+网络结构:
对于
score??(d∣q):
根据SLTB提取文档的原始排序,点击熵和其他典型的特征作为相关特征
rq,d?:
score??(ddimq)=tanh(Fq?(rq,d?))
对于
score??(d∣SM?):
RNN的第
i步的输入
xi?是每一个query及其相关\无关文档的向量表示:
xi?=[qi?,vdi+??,vdi???]
qi?是query的字符串的向量表示,
vdi+??是
qi?所有相关文档的平均向量,
vdi???是所有无关文档的平均向量。
对于
SM?中有
n个query的用户来说,用户的短期描述形式就是RNN的最后一步输出:
hM1?=RNN(hM,n?11?,xn?)(上标1表示第一层RNN,也就是上图中最下面的一层RNN)
那么:
score??(d∣SM?)=tanh(Fs?(hM1?,d))
对于
score??(d∣Lu?):
把第一层RNN的历史输出作为第二层RNN的输入:
hi2?=RNN(hi?12?,hi1?)
同时使用attention机制对于历史输出附权重:
αi?=softmax(ei?)=∑i=1i=M?1?exp(ei?)exp(ei?)?
ei?=uiT?ud?,其中,
ui?=tanh(Fd?(q,hi2?)),代表
q和Session
Si?的匹配程度,个人理解
ud?表示的是q和当前Session的匹配程度,这样
ei?可以表示
q和
Si?和当前上下文的匹配程度,进而
αi?可以表示
Si?的权重。
进而该用户的长期描述可以表示为:
hM?12?=∑i=1M?1?αi?hi2?
score??(d∣Lu?)=tanh(Fl?(hM?12?,d))
上面介绍的
f??直接作为分类器的公式,不过HRNN+和PSGAN的分类器区别是,对于HRNN+,
f??的正负样本就是历史数据,是固定的,测试时输出每个文档的相关性,并基于这个生成排序序列。而基于文档的模型里
f??需要反复训练,每次的训练数据都会被生成器更新(主要更新负样本)
接下来深入聊聊生成器:
他的目标是从候选文档集里选择一个看起来是相关文档的负样本。生成器公式可以如下表示:
gθ?(d,q,U)=Fg?(scoreθ?(d∣q),scoreθ?(d∣SM?),scoreθ?(d∣Lu?))
那么我们用生成器来逼近真实样本分布的分布概率
pθ?如下:
pθ?=∑d∈D′?exp(gθ?(d,q,U))exp(gθ?(d,q,U))?
可以根据这个分布采样作为负样本,带入前面提到的PSGAN优化公式里
基于生成查询的模型:
分类器还是上述的分类器,我们只聊生成器
由于当前的query可能会和用户的意图有偏差,因此为了更好的估计用户的意图,提出了这个模型,可以根据用户的历史记录来生成一些看起来和用户意图一致的queries,进而评估文档的相关性。作者的想法是根据分类器的反馈来使得生成器拟合相关queries的分布。
定义
gθ?(q′∣q,U)为生成器的公式。query的生成概率如下:
pθ?(q′∣q,U)=softmax(gθ?(q′∣q,U))
对于每一个生成的query,也可以计算文档的相关性的概率分布:
pθ?(d∣q′)=softmax(f??(d,q′,U))≡p??(d∣q′)
pθ?(d∣q)=q′∑?pθ?(d∣q′)pθ?(q′∣q,U)=q′∑?p??(d∣q′)pθ?(q′∣q,U)
这样生成器的梯度公式变成如下:
?θ?JG(q)=K1?i=1∑K??θ?log(pθ?(q′∣q,U)p??(d∣q′)log(1+exp(f??(d)))
由于
log(1+exp(f??(d)))和
p??(d∣q′)都可以看成是分类器的反馈,所以对于生成器的优化可以看做是使得生成器越来越一致于用户意图
接下来详细说说生成器的结构:
使用了seq2seq模型
这里也是同时考虑了长期历史和短期历史(当前session),使用两个子结构来编码长期描述和短期描述。
对于长期描述:
假设
Lu?里有m个query,RNN的输入就是
{q1?,q2?,...,qm?}每当有一个新的
qi?输入的时候,都有
hi?=RNN(hi?1?,qi?)
对于当前session的描述:
设当前session里有
n个query使用了层级RNN,先对每一个query的terms使用双向RNN处理来编码query,对于第一层的RNN输出作为第二层RNN的输入来编码当前session描述:
对第一层:
htw?
?=RNN(ht?1w?
?,wt?),
htw?
?=RNN(ht+1w?
?,wt?),
ht1?=[htw?
?,htw?
?]
对第二层:
hi2?=RNN(hi?12?,hi1?)
对于解码器:
使用短期描述的最后一个输出初始化状态:
s0?=tanh(Fh?(hn2?)),可以把
s0?理解为初始语境(query一个单词都没输入时的状态,每输入一个单词s状态更新一次)。
判断
q′的第
t个单词的生成概率,是通过比较单词的编码与长期描述和短期描述的隐藏状态直接的相似性来确定的:
αt,iL?=softmax(uiT?um?),ui?=ut,iL?=tanh(Fm?(st?1?,hi?))
个人理解
um?这一项的意义是把整体的长期描述的状态引入,使得
(uiT?um?)可以更好的表示
st?1?,
hi?(第i个query的隐藏状态)和整体long-term 编码之间的相似度。
htL?=i∑?αt,iL?hi?
αt,iSH?=softmax((ut,iSH?)Tun?),ut,iSH?=tanh(Fn?(st?1?,hi2?))
htSH?=i∑?αt,iSH?hi2?
这样就可以生成一个上下文向量,来作为解码器选择下一项(单词)的依据之一:
ct?=[htL?,htSH?]
于是可以计算单词生成概率:(其中,
wi?表示第
i个单词向量)
P(wt?∣w1?,w2?,...,wt?1?,ct?)=softmax(Fo?(RNN(st?1?,[ct?,wt?])))
生成的query
q′可以如下表示:
q;=[w1?,w2?,...,wk?]
gθ?(q′,q,U)=i=1∏n?P(wi?∣w1?,w2?,...,wi?1?)
把上面的生成器表示形式带入之前提到的公式里就可以计算出
pθ?(d∣q)
现在还有一个问题:
wi?从哪儿来呢?
如果直接生成一个query的话无法保证query在用户的历史记录里出现过,如果没出现过就更不会有点击记录,也就没办法计算
p??(d∣q′)
所以作者只在搜索记录里出现过的query形成的candidates list里挑选合适的query来生成。
如何生成candidates list呢?给所有的query排个序吧,选前10个
R(qj?∣q)=e(q,qj?)+s(q,qj?)+f(q,qj?)+r(q,qj?)
- 当
qj?是
q的扩充的时候,
e(q,qj?)=len(q)len(qj?)?len(q)?,否则
e(q,qj?)=0,这样当
qj?包含的扩充单词越多时,相比于
q越具体
-
s(q,qj?)=sim(q,qj?)是
q和
qj?之间的相似性
-
f(q,qj?)=nq?nq,qj???,
nq,qj??是两个query在同一时间同一session同时出现的次数。
nq?表示的是query
q出现在query log里的所有的次数。
-
r(q,qj?)=cq?cq,qj???,
cq,qj??是在query
q和query
qj?下都被点击过的URL的数量,
cq?是query
q下点击的URL的数量。
确定了query candidates list后,就可以计算
gθ?(q′∣q,I)==>pθ?(q′∣q,U)==>pθ?(d∣q,U)
允许生成器选择当前输入的query
q作为
q′,所以candidates list里也要有
q。
以上就是PSGAN的结构内容,下面我们聊聊作者文中用来评价模型的几个指标:
- MAP(Mean Average Precision): 每个query的平均准确率的平均值。一个query的平均准确率:假设对于一个query q,个性化搜索方法返回的文章里满意文章的等级分别是1,3,5,7,平均准确率是:(1/1 + 2/3 + 3/5 + 4/7)/4=0.71。MAP就是所有query的平均准确率的平均值。(越大越好)
- MRR(Mean Reciprocal Rank)): 是把标准答案在被评价系统给出结果中的排序取倒数作为它的准确度,再对所有的问题取平均。(黑体为返回结果中最匹配的一项)
可计算这个系统的MRR值为:(1/3 + 1/2 + 1)/3 = 11/18=0.61。(越大越好)
- Avg.Click:满意点击文档的平均等级位置。当Avg.Click越小,说明满意结果排序越高。(越小越好)
- #Better:由于搜索引擎返回的初始排序对于用户选择有一定的影响,所以把满意点击上方被跳过的文档以及满意点击的下一个文档当作不相关的文档是十分可靠的。所以可以构建两种文档对:满意文档+被跳过的文档/满意文档+未点击的下一个文档。对于第一种文档对,重排序只会产生更好的结果(满意文档排到了被跳过的前面),或者结果不变,不会产生更差的结果,所以#Better表示:重排序后产生更好结果的这类文档对的数量。(越大越好)
- #Worse:对于第二种文档对,重排序只会产生更差的结果,所以#Worse表示的是:重排序后产生更差结果的这类文档对的数量。(越小越好)
最后我们简单说一下作者的几个实验方向:
- 直接对所有数据训练,然后比较结果。
- 把数据集分为点击熵<1 和点击熵>1两类,分别实验对比结果。
- 把数据集分为查询过的queries和没查询过的queries。
有不足的地方欢迎评论指正=v=