1.常见的LTR模型
1.1 pointwise模型
-
该方法只考虑给定查询下,单个文档的绝对相关度,而不考虑其他文档和给定查询的相关度。把排序问题当作分类或者回归问题来处理。
-
输入:{(q_i, x_ik, label_ik)} 其中q_i表示第i个query,x_ik表示query对应的doc的第k个特征组合,label_ik表示人工标注的表示query与url之间的匹配程度的分值
-
损失函数:L={l(f(x_ik), label_ik}(k=1,2,3…n), 一般为交叉熵损失函数或者RMSE函数
常用的分类器:logistic回归,SVM
优点:能够对query与文档的相关性做出很强的反馈,经常用来提升准确率;
缺点:忽略了文档与文档之间的关系;
1.2 pairwise模型
-
给定查询下,两个文档之间的相对相关度。排序问题被转化成结果对的回归、分类或有序分类的问题
-
输入:{(q_i, x_ik, x_ij, +1), (q_i, x_Ik, x_im, -1) } +1表示第k个url与query的相关性程度高于第j个url
-
常用的模型:RANKSVM, GBRANK
-
优点:相对于pointwise模型,考虑了文档对之间的关系
-
缺点:虽然考虑了两个文档之间的关系,但是与实际多个文档之间的关系仍然存在差距,将query之间的不平衡性放大了
-
损失函数:
-
存在的问题:
(1)会将不同等级的doc同等看待,比如同一个query下,1,2两个位置颠倒与1,11两个位置颠倒的影响是不一样的;不同query下,1,2颠倒与2,3颠倒的影响也是不一样的。
(2) RankSVM对于不同query下的doc pair同等看待,不会加以区分。而不同query下的doc的数目是很不一样的。 -
IRSVM对上面两个问题进行改进:
(1)利用1/doc数目作为权重,为doc比较少的query提权;
(2)对同等档位的doc对,随机交换位置,利用所有减少的NDCG@1值的平均减少值,因为减少的值越多说明该doc对整体评价指标比较重要
(3)具体算法流程:
-
GBRANK模型(线上)
- 损失函数
-
更新方法
-
具体流程
1.3 listwise模型
-
给定查询下,直接预测整个文档序列,使其更加接近真实的文档序列。
-
输入:{(q_i, x_ik, label_ik), (q_i, x_ij, label_ij)…}
-
常用模型:
(1)基于评价指标的排序算法,直接利用评估指标作为损失函数,比如SoftRank,ApproximateRank,SmoothRank,SVM-NDCG,AdaRank,RankGP等-
损失函数:(2)设计衡量预测序列与真实序列之间差异的损失函数进行预测,比如ListNet,ListMLE,StructRank,BoltzRank等。
-
优点:得到的模型充分了考虑了query与url列表之间的关系;
-
缺点:模型的训练复杂度比较高;
-
2. 如何构建样本?
1)人工标注样本
2)利用点击日志构建样本,可能存在的问题:位置偏差,即用户普遍会点击出现在前面的结果
* 解决位置偏差的技巧:
* (1)当位置靠后的doc的点击数都比位置靠前的doc的点击数要高了,那么靠后的doc的相关性肯定要比靠前的doc的相关性大。
* (2)Joachims等人则提出了一系列去除bias的方法,例如 Click > Skip Above, Last Click > Skip Above, Click > Earlier Click, Click > Skip Previous, Click > No Click Next等。
* (3)我们说一个doc的点击数比另一个doc的点击数多,并不一定说明前者比后者更相关。 但如果两者的差距大到一定程度了,即使前者比后者位置靠前,但是两者的点击数相差5-10倍,这时候我们还是愿意相信前者更加相关。当然这个差距的大小需要根据每个场景具体的调整。
* (4)position bias 存在的原因是,永远无法保证在一次搜索行为中,用户能够看到所有的结果,往往只看到前几位的结果。这时候就到了 Click Model大显身手的时候了,一系列的 Click Model 根据用户的点击信息对用户真正看到的doc进行“筛选”,进而能更准确地看出用户到底看到了哪些doc,没有看到哪些doc,一旦这些信息知道了,那么我们就可以根据相对更准确的点击数/展示数(即展现CTR)来确定各个doc的相关性大小。 点击模型还可以用作排序模型的特征
* (5)一次搜索过程中用户最后点击的url,很大概率与query的匹配度较高。
3)人工标注小样本,去预测部分未标注样本,再将标注后的样本融入样本中,继续训练
4)获取样本存在的问题:
- (1)人工标注受限于标注的人的观点,不同的人有不同的看法,而且毕竟标注的人不是真实搜索该query的用户,无法得知其搜索时候的真实意图;另一方面人工标注的方法代价较高且非常耗时。
- (2)而从搜索日志中获取的方法则受限于用户点击行为的噪声,这在长尾query中更是如此,且有用户点击的query毕竟只是总体query的一个子集,无法获取全部的query下doc的label。
3. 如何构造特征工程?
1)query自身的特征
- 长度,查询词词频,查询词的tf-idf,query被搜索的次数
2)url自身的特征
- url的title,文档长度,文档权威性,文档的时效性,页面内容的丰富度,url被点击的次数,url被展现的次数,
3)query—url特征
-
query与url的title的重合程度,query下点击的url特征(是否是最后一次点击,是否是首次点击),query与url的title的语义相似程度,query与url的主题相似度
- 具体特征如下图所示:
- 具体特征如下图所示:
** 要注意的是,我们在组合形成新的feature vector的时候,不能使用在原始排序问题中处于相同相似度等级的两个feature vector,也不能使用处于不同query下的两个feature vector。 **
4.常用的评价指标
1)NDCG,全称: Normalized discounted cumulative gain。
-
该衡量指标通过这种归一化的折扣的方式来保证头部的排序的准确性。
-
DG(Discounted Gain)根据url的展现位置n对收益进行打折。
-
DCG(Cumulative Discounted Gain) 对前N的DG进行累加。
-
NDCG(normalize DCG)计算的是一个标准化后值,是实际排序的DCG值比上理想排序DCG值,范围是0~1。
-
具体计算方法:
用户对query和url的匹配关系进行打分(实际情况中,就是人工标注),假如人工打分为4档:0/1/2/3。例如有7条url,根据模型预测的排序结果,他们的人工标注打分依次是:2 3 2 3 1 1 1,那么这一组的理想排序是:3 3 2 2 1 1 1。 NDCG会先计算理想排序3 3 2 2 1 1 1的DCG值,计算方法如下: 1.从前向后计算每个位置上打分的贡献值Gain(j)=2^r(j)-1,得到7 7 3 3 1 1 1; 2.从前向后计算每个位置上的系数ratio(j)=1/log(1+j),得到1 0.63 0.5 0.43 0.39 0.36 0.33; 3.从前向后累加每个位置上打分贡献值与系数的乘积:Σ(2^r(j)-1)/log(1+j),得到7 11.41 12.91 … 4. 按照相同的方法再计算一遍实际排序2 3 2 3 1 1 1的DCG值,贡献值Gain变成了:3 7 3 7 1 1 1; 系数ratio还是:1 0.63 0.5 0.43 0.39 0.36 0.33;最终得到:3 7.41 8.91 ….. 5. 用实际排序的DCG值除以理想排序的DCG值,得到NDCG@N值:0.43 0.65 0.69 …… 比如说0.69就是top3的NDCG值。
2)MAP,全称为Mean Average Precision。
- 该衡量指标是反映系统在全部相关文档上性能的单值指标,衡量了每个主题的平均准确率。
- 该衡量指标是反映系统在全部相关文档上性能的单值指标,衡量了每个主题的平均准确率。
-
假设有两个查询,查询1有4个相关文档,查询2有5个相关文档。
- 某系统对查询1检索出4个相关文档,其rank结果分别为1,2,4,7(表示rank位置);对于查询2检索出3个相关文档,其rank结果分别为1,3,5(表示rank位置)。
- 对于查询1,AP平均正确率为: ((1/1)*1 + (2/2)*1 + (3/4)*1 + (4/7)*1)/(1+1+1+1)=0.83;
- 对于查询2,AP平均正确率为: ((1/1)*1 + (2/3)*1 + (3/5)*1)/(1+1+1)=0.75 (从公式中看,这里绿色部分应该是除以3,而不是除以5, 但是感觉除以5更能衡量相关文档的召回)则平均正确率均值为:(0.83+0.75)/2=0.79