排序之损失函数List-wise loss(系列3)

news2024/11/15 21:29:22

排序系列篇:

  • 排序之指标集锦(系列1)
  • 原创 排序之损失函数pair-wise loss(系列2)
  • 排序之损失函数List-wise loss(系列3)

最早的关于list-wise的文章发表在Learning to Rank: From Pairwise Approach to Listwise Approach中,后面陆陆续续出了各种变形,但是也是万变不离其宗,本文梳理重在原理。

论文链接listNet,参考的实现代码:实现代码

1. 为什么要List-wise loss

pairwise优缺点
优点:

  • 一些已经被验证的较好的分类模型可以直接拿来用。
  • 在一些特定场景下,其pairwise features 很容易就可以获得。

缺点:

  • 其学习的目标是最小化文档对的分类错误,而不是最小化文档排序的错误。学习目标和实际目标(MAE,NDCG)有所违背。
  • 训练过程可能是极其耗时的,因为生成的文档对样本数量可能会非常多。

那么本篇论文是如何解决这些问题呢?
在pointwise 中,我们将每一个<query, document> 作为一个训练样本来训练一个分类模型。这种方法没有考虑文档之间的顺序关系;而在pariwise 方法中考虑了同一个query 下的任意两个文档的相关性,但同样有上面已经讲过的缺点;在listwise 中,我们将一个<query,documents> 作为一个样本来训练,其中documents 为与这个query 相关的文件列表
论文中还提出了概率分布的方法来计算listwise 的损失函数。并提出了permutation probability 和top one probability 两种方法。下面会详述这两种方法。

2. 方法介绍

2.1. loss输入格式

假设我们有m 个 querys:
Q = ( q ( 1 ) , q ( 2 ) , q ( 3 ) , . . . , q ( m ) ) Q=(q^{(1)}, q^{(2)}, q^{(3)},...,q^{(m)}) Q=(q(1),q(2),q(3),...,q(m))
每个query 下面有n 个可能与之相关的文档(对于不同的query ,其n 可能不同)
d ( i ) = ( d 1 ( i ) , d 2 ( i ) , . . . , d n ( i ) ) d^{(i)} = (d^{(i)}_1, d^{(i)}_2, ..., d^{(i)}_n) d(i)=(d1(i),d2(i),...,dn(i))
对于每个query 下的所有文档,我们可以根据具体的应用场景得到每个文档与query 的真实相关度得分。
y ( i ) = ( y 1 ( i ) , y 2 ( i ) , . . . . , y n ( i ) ) y^{(i)} = (y^{(i)}_1, y^{(i)}_2, ...., y^{(i)}_n) y(i)=(y1(i),y2(i),....,yn(i))
我们可以从每一个文档对 ( q ( i ) , d j ( i ) ) (q^{(i)}, d^{(i)}_{j}) (q(i),dj(i))得到该文档的打分, q ( i ) q^{(i)} q(i)与文档集合 d ( i ) d^{(i)} d(i)中的每个文档打分,可以得到该query 下的所有文档的特征向量:
x ( i ) = ( x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ) x^{(i)} = (x^{(i)}_1, x^{(i)}_2, ..., x^{(i)}_n) x(i)=(x1(i),x2(i),...,xn(i))
并且在已知每个文档真实相关度得分的条件下:
y ( i ) = ( y 1 ( i ) , y 2 ( i ) , . . . , y n ( i ) ) y^{(i)} = (y^{(i)}_1, y^{(i)}_2, ..., y^{(i)}_n) y(i)=(y1(i),y2(i),...,yn(i))
我们可以构建训练样本:
T = { ( x ( i ) , y ( i ) ) } T=\begin{Bmatrix} (x^{(i)}, y^{(i)}) \end{Bmatrix} T={(x(i),y(i))}

要特别注意的是:这里面一个训练样本是 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i)),而这里的 x ( i ) x^{(i)} x(i)是一个与query 相关的文档列表,这也是区别于pointwise 和pairwise 的一个重要特征。

关于 y ( i ) y^{(i)} y(i)paper里面的相关描述:
在这里插入图片描述

2.2. loss计算

那么有训练样本了,如何计算loss 呢?
假设我们已经有了排序函数 f ff,我们可以计算特征向量 x ( i ) x^{(i)} x(i)的得分情况:
z ( i ) = ( f ( x 1 ( i ) ) , f ( x 2 ( i ) ) , . . . , f ( x n ( i ) ) ) z^{(i)} = (f(x_1^{(i)}), f(x_2^{(i)}), ..., f(x_n^{(i)})) z(i)=(f(x1(i)),f(x2(i)),...,f(xn(i)))
显然我们学习的目标就是,最小化真实得分和预测得分的误差:
∑ i = 1 m L ( y ( i ) , z ( i ) ) \sum_{i=1}^{m} L(y^{(i)}, z^{(i)}) i=1mL(y(i),z(i))
L 为 listwise 的损失函数。

2.2.1. 概率模型

假设对于某一个query 而言,与之可能相关的文档有 { 1 , 2 , 3 , . . . , n } \{1, 2, 3, ..., n\} {1,2,3,...,n},假设某一种排序的结果为 π \pi π
π = < π ( 1 ) , π ( 2 ) , . . , π ( n ) > \pi=<\pi(1), \pi(2), .., \pi(n)> π=<π(1),π(2),..,π(n)>

对于n 个文档,有n! 种排列情况。这所有的排序情况记为 Ω n \Omega_n Ωn。假设已有排序函数,那么对于每个文档,我们都可以计算出相关性得分 s = ( s 1 , s 2 , . . . , s n ) s = (s_1, s_2, ..., s_n) s=(s1,s2,...,sn)。 显然对于每一种排序情况,都是有可能发生的,但是每一种排列都有其最大似然值。

我们可以这样定义某一种排列 π \pi π的概率(最大似然值):
P s ( π ) = ∏ j = 1 n ϕ ( s π ( j ) ) ∑ k = j n ϕ ( s π ( k ) ) P_s(\pi) = \prod_{j=1}^{n} \frac{\phi (s_{\pi(j)})}{\sum_{k=j}^{n}\phi(s_{\pi(k)})} Ps(π)=j=1nk=jnϕ(sπ(k))ϕ(sπ(j))
其中 ϕ \phi ϕ表示对分数的归一化处理。

例如有三个文档 π = < 1 , 2 , 3 > \pi = <1,2,3> π=<1,2,3> ,其排序函数计算每个文档得分为 s = ( s 1 , s 2 , s 3 ) s=(s_1, s_2, s_3) s=(s1,s2,s3),则该种排序概率为:
P s ( π ) = ϕ ( s 1 ) ϕ ( s 1 ) + ϕ ( s 2 ) + ϕ ( s 3 ) ⋅ ϕ ( s 2 ) ϕ ( s 2 ) + ϕ ( s 3 ) ⋅ ϕ ( s 3 ) ϕ ( s 3 ) P_s(\pi) =\frac{\phi(s_1)}{\phi(s_1)+\phi(s_2)+\phi(s_3)} \cdot \frac{\phi(s_2)}{\phi(s_2)+\phi(s_3)} \cdot \frac{\phi(s_3)}{\phi(s_3)} Ps(π)=ϕ(s1)+ϕ(s2)+ϕ(s3)ϕ(s1)ϕ(s2)+ϕ(s3)ϕ(s2)ϕ(s3)ϕ(s3)
对于另外一种排序,例如 π ′ = < 3 , 2 , 1 > {\pi}' = <3,2,1> π=<3,2,1> ,则这种排列概率为:

P s ( π ) = ϕ ( s 3 ) ϕ ( s 3 ) + ϕ ( s 2 ) + ϕ ( s 1 ) ⋅ ϕ ( s 2 ) ϕ ( s 2 ) + ϕ ( s 3 ) ⋅ ϕ ( s 1 ) ϕ ( s 1 ) P_s(\pi) =\frac{\phi(s_3)}{\phi(s_3)+\phi(s_2)+\phi(s_1)} \cdot \frac{\phi(s_2)}{\phi(s_2)+\phi(s_3)} \cdot \frac{\phi(s_1)}{\phi(s_1)} Ps(π)=ϕ(s3)+ϕ(s2)+ϕ(s1)ϕ(s3)ϕ(s2)+ϕ(s3)ϕ(s2)ϕ(s1)ϕ(s1)

很明显,< 3,2,1 >这个排序的打分最低,< 1,2,3 >这个排序的打分最高。

2.2.2. Top K Probability

上面那种计算排列概率的方式,其计算复杂度达到 n ! n! n!,太耗时间,由此论文中提出了一种更有效率的方法 top one。我们在这里推广到top k来分析总结。

上面计算某一种排序方式概率:
P s ( π ) = ∏ j = 1 n ϕ ( s π ( j ) ) ∑ k = j n ϕ ( s π ( k ) ) P_s(\pi) = \prod_{j=1}^{n} \frac{\phi (s_{\pi(j)})}{\sum_{k=j}^{n}\phi(s_{\pi(k)})} Ps(π)=j=1nk=jnϕ(sπ(k))ϕ(sπ(j))
排在第一位的有 n n n 种情况,排在第二位的有 n − 1 n−1 n1 种情况,后面依次类推。相当与利用 top n n n来计算。
那么 top K ( K < n ) K(K<n) K(K<n)计算:
P s ( π ) = ∏ j = 1 K ϕ ( s π ( j ) ) ∑ k = j n ϕ ( s π ( k ) ) P_s(\pi) = \prod_{j=1}^{K} \frac{\phi (s_{\pi(j)})}{\sum_{k=j}^{n}\phi(s_{\pi(k)})} Ps(π)=j=1Kk=jnϕ(sπ(k))ϕ(sπ(j))
同理,这里的计算复杂度为 n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ ( n − k + 1 ) n∗(n−1)∗(n−2)∗...∗(n−k+1) n(n1)(n2)...(nk+1),即为 N ! / ( N − k ) ! N!/(N-k)! N!/(Nk)!种不同排列,大大减少了计算复杂度。
如果 K = 1 K=1 K=1,就蜕变成论文中top 1 的情况,此时有 n 种不同排列情况:
P s ( π ) = ϕ ( s π ( j ) ) ∑ k = j n ϕ ( s π ( k ) ) P_s(\pi) = \frac{\phi (s_{\pi(j)})}{\sum_{k=j}^{n}\phi(s_{\pi(k)})} Ps(π)=k=jnϕ(sπ(k))ϕ(sπ(j))

对于 N ! / ( N − k ) ! N!/(N-k)! N!/(Nk)!种不同的排列情况,就有 N!/(N−k)! 个排列预测概率,就形成了一种概率分布,再由真实的相关性得分计算相应的排列概率,得到真实的排列概率分布。由此可以利用 cross−entropy 来计算两种分布的距离作为损失函数:
L ( y ( i ) , z ( i ) ) = − ∑ j = 1 n { P y ( i ) ( j ) ∗ l o g ( P z ( i ) ( j ) ) } L(y^{(i)}, z^{(i)}) = - \sum_{j=1}^{n} \{P_{y^{(i)}}(j) *log(P_{z^{(i)}}(j))\} L(y(i),z(i))=j=1n{Py(i)(j)log(Pz(i)(j))}

例如一个查询下有三个文档 < A , B , C > <A,B,C> <A,B,C>

上图中 g 为有真实打分计算出的各种排列的概率分布, f、h 为另外两种排列概率分布,我们就是需要比较那种排列概率分布与真实的排列概率分布更为接近,就用该分布的预测相关性得分作为最终得分。

2.2.3. ListNet

这里给出ListNet最终的形式
在论文中,Listnet只是将上面的 t o p K topK topK 中的 ϕ \phi ϕ函数变成 exp 函数:
P s ( π ) = exp ⁡ ( s π ( j ) ) ∑ k = j n exp ⁡ ( s π ( k ) ) P_s(\pi) = \frac{\exp (s_{\pi(j)})}{\sum_{k=j}^{n}\exp(s_{\pi(k)})} Ps(π)=k=jnexp(sπ(k))exp(sπ(j))

这样不就是计算预测出的得分的softmax 了吗?实际上的确如此,在实现代码中就是这样做的,当时我直接看代码还一脸懵逼,这不就是对文档预测出来的得分做了个softmax 操作吗?跟top−one 有什么关系,仔细看论文才知道怎么回事。

top−1 时,只有n 种排列情况,这大大减少了计算量。如果top K ( K > 1 ) K (K>1) K(K>1),则需要计算的排列情况就会变多。

假设排序函数 f 的参数为w ,则 top-one 的排列概率分布为:
P z ( i ) ( f w ) ( x j ( i ) ) = exp ⁡ ( f w ( x j ( i ) ) ) ∑ k = j n exp ⁡ ( f w ( x k ( i ) ) ) P_{z^{(i)}(f_w)}(x_j^{(i)}) = \frac{\exp (f_w(x_j^{(i)}))}{\sum_{k=j}^{n}\exp(f_w(x_k^{(i)}))} Pz(i)(fw)(xj(i))=k=jnexp(fw(xk(i)))exp(fw(xj(i)))

这里还是需要注意:是将某一个查询下的所有可能与之相关的文档列表,作为一个样本来训练。

最终的损失函数:
L ( y ( i ) , z ( i ) ( f w ) ) = − ∑ j = 1 n { P y ( i ) ( x j ( i ) ) ∗ l o g ( P z ( i ) ( f w ) ( x j ( i ) ) ) } L(y^{(i)}, z^{(i)}(f_w)) = - \sum_{j=1}^{n} \{P_{y^{(i)}}(x_j^{(i)}) *log(P_{z^{(i)}(f_w)}(x_j^{(i)}))\} L(y(i),z(i)(fw))=j=1n{Py(i)(xj(i))log(Pz(i)(fw)(xj(i)))}

小编总结:
简单来说, Listwise的loss其实从本质上可以归纳如下:
step1: 对所有包含正样本和负样本的集合进行softmax; step2: 在用交叉熵对所有样本求和计算loss
但是从原理上来说,其实这只是一个为了计算速度的折中。另外交叉熵中的groundtruth,也就是上面的 y j ( i ) y^{(i)}_j yj(i)打分,这样groundtruth打分越高的,如果预测误差大导致的loss越大,从而对实际为高分但是预测为低分的关注度更高,从而提高top的打分。

实现细节

在看源码的时候发现了一个细节,paper里面说的是交叉熵,但是在代码实现中我发现用的是交叉熵,也就是红色里面是KL散度,而绿色才是交叉熵。
在这里插入图片描述

总结

在pairwise 中,只考虑了两个文档对的相对先后顺序,却没有考虑文档出现在搜索列表中的位置,排在搜索站果前列的文档更为重要,如果前列文档出现判断错误,代价明显高于排在后面的文档。针对这个问题的改进思路是引入代价敏感因素,即每个文档对根据其在列表中的顺序具有不同的权重,越是排在前列的权重越大,即在搜索列表前列,如果排错顺序的话其付出的代价更高(评价指标NDCG); 而listwise 讲一个查询下的所有文档作为一个样本,因为要组合出不同的排列,得到其排列概率分布,来最小化与真实概率分布的误差,这里面就考虑了文档之间的各种顺序关系。很好的避免了这种情况。
从概率模型的角度定义损失函数。
在实做时,其实将一个query 下的的所有可能与之相关的n个doc作为一个训练样本(这时可以理解batch_size=n) ,一定要注意:在计算top_1 probability 时,是在一个query 内的所有文档做softmax ,而不是在当前正在训练的所有的样本内做。这是区别pointwise、pairwise 的重要不同之处。

参考链接:
论文分享— >Learning to Rank: From Pairwise Approach to Listwise Approach

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot入门 - SpringBoot HelloWorld

我们了解了SpringBoot和SpringFramework的关系之后&#xff0c;我们可以开始创建一个Hello World级别的项目了。创建 SpringBoot Web 应用为快速进行开发&#xff0c;推荐你使用IDEA这类开发工具&#xff0c;它将大大提升你学习和开发的效率。选择 Spring InitializeSpring提供…

开源的 OA 办公系统 — 勾股 OA 4.3.01 发布

勾股 OA 办公系统是一款简单实用的开源的企业办公系统。系统集成了系统设置、人事管理、行政管理、消息管理、企业公告、知识库、审批流程设置、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等功能模块。系统简约&#xff0c;易于功能扩展&#xff0…

【vue】图标选择(elementUI和svg结合)

目标&#xff1a;在做菜单权限的时候需要选择图标&#xff0c;如果既想要用elementUI自带的图标&#xff0c;还想要自定义的图标&#xff0c;这时就需要二者结合一下如果用的是vue-admin-template&#xff0c;那svg组件和引入elementUI是不需要操作的&#xff0c;直接使用即可。…

pytest学习和使用17-Pytest如何重复执行用例?(pytest-repeat)

17-Pytest如何重复执行用例&#xff1f;&#xff08;pytest-repeat&#xff09;1 使用场景2 pytest-repeat插件2.1 环境要求2.2 插件安装3 pytest-repeat使用3.1 重复测试直到失败3.2 用例标记执行重复多次3.3 命令行参数--repeat-scope详解3.3.1 class示例3.3.2 module示例1 使…

如何在软件测试面试中脱颖而出?(附教程)天花板都这样回答

面试软件测试工程师岗位&#xff0c;是否真的如网上所说&#xff0c;需要不停刷面试题?面试题可能掌握的技巧实际是一样的&#xff0c;只是题目形式不一样&#xff0c;那么应该如何在面试中脱颖而出呢?今天我们就来聊一聊。 我录制了一整套完整的软件测试面试的话术教程&…

拿下32k成功入职阿里软件测试面试常见问题及回答技巧

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容…

测试结束参考标准

在软件消亡之前&#xff0c;如果没有测试的结束点&#xff0c;那么软件测试就永无休止&#xff0c;永远不可能结束。软件测试的结束点&#xff0c;要依据自己公司具体情况来制定&#xff0c;不能一概而论!个人认为测试结束点由以下几个条件决定&#xff1a; 1.基于“测试阶段”…

预览版Edge申请微软new Bing失败解决方案

文章目录1.首先需要配置科学上网2.下载预览版Edge浏览器卡它bug&#xff01;卡它bug&#xff01;卡它bug&#xff01;没有申请上ChatGPT的朋友们&#xff0c;试试new Bing吧&#xff0c;更新更强大&#xff0c;关于申请方式&#xff0c;网上已经有很多帖子了&#xff0c;其中一…

WebRTC 拥塞控制 | Trendline 滤波器

1.指数平滑1.1一次指数平滑法&#xff08;Single Exponential Smoothing&#xff09;指数平滑法&#xff08;Exponential Smoothing&#xff09; 是在移动平均法基础上发展起来的一种时间序列分析预测法&#xff0c;它是通过计算指数平滑值&#xff0c;配合一定的时间序列预测模…

fiddler抓包实战(1),模拟手机弱网测试,判断BUG来自客户端还是服务端

手机app中常见的测试之一就是弱网测试&#xff0c;什么是弱网测试呢?顾名思义就是模拟弱网的时候用户对于手机的一些操作和响应是否成功&#xff0c;在使用的过程中是否能够正常的使用 手机端常见弱网测试方法就是切换5G、4G、3G、2G这样 Web中就可以直接模拟打开F12然后就可…

Linux C++ 内存映射文件及其应用

Linux C 内存映射文件及其应用一. 原理二. 应用场景1. 实现多进程通信2. 实现内存持久化3.实现读写大文件三. 问答参考链接一. 原理 内存映射文件&#xff0c;是从一个文件到一块内存的映射。 内存映射文件与虚拟内存有些类似&#xff0c;通过内存映射文件可以将文件与内存中一…

【ESP32+freeRTOS学习笔记-(十)任务通知机制】

目录1、任务通知&#xff08;Task Notifications&#xff09;概念1.1 概念1.2 使用任务通知的优势1.3 无法使用任务通知的场景2、使用任务通知2.1 xTaskNotifyGive()2.2 ulTaskNotifyTake()2.3 使用任务通知代替信号量&#xff0c;方法12.4 使用任务通知代替信号量&#xff0c;…

mtd和嵌入式系统分区

一. MTD介绍 嵌入式系统的磁盘分区情况&#xff0c;一般由mtd来表示。 MTD&#xff08;Memory Technology Device)&#xff1a;内存技术设备是Linux的存储设备中的一个子系统。其设计此系统的目的是&#xff0c;对于内存类的设备&#xff0c;提供一个抽象层&#xff0c;一个接口…

【计算机三级网络技术】 第五篇 局域网技术基础及应用

文章目录一、局域网组网基础知识1.局域网的主要特征2.局域网标准3.交换式局域网4.虚拟局域网技术二、综合布线基本概念1.综合布线系统的组成2.综合布线的优点3.综合布线的设计等级4综合布线系统标准三、局域网互联设备1.中继器2.集线器3.网桥&#xff08;Bridge&#xff09;4.交…

eKuiper 1.8.0 发布:零代码实现图像/视频流的实时 AI 推理

LF Edge eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源软件&#xff0c;可以运行在各类资源受限的边缘设备上。eKuiper 的主要目标是在边缘端提供一个流媒体软件框架&#xff08;类似于 Apache Flink &#xff09;。eKuiper 的规则引擎允许用户提供基于 SQL 或基…

10_创建和管理表

表操作基础1.1 一条数据存储的过程存储数据是处理数据的第一步 。只有正确地把数据存储起来&#xff0c;我们才能进行有效的处理和分析。否则&#xff0c;只能是一团乱麻&#xff0c;无从下手。那么&#xff0c;怎样才能把用户各种经营相关的、纷繁复杂的数据&#xff0c;有序、…

CIMCAI intelligent railway logistics world leading container AI

港航人工智能/集装箱人工智能领军企业CIMCAI&#xff0c;多式联运智能化铁路货运智能化方案&#xff0c;全自动化集装箱识别数字化海运铁路运输集装箱管理。CIMCAI中集飞瞳是世界应用落地最广&#xff0c;规模最大&#xff0c;最先进的的集装箱人工智能高科技企业。世界集装箱A…

一文读懂PaddleSpeech中英混合语音识别技术

语音识别技术能够让计算机理解人类的语音&#xff0c;从而支持多种语音交互的场景&#xff0c;如手机应用、人车协同、机器人对话、语音转写等。然而&#xff0c;在这些场景中&#xff0c;语音识别的输入并不总是单一的语言&#xff0c;有时会出现多语言混合的情况。例如&#…

PMP怎么对项目工程师的职业生涯产生影响?

职业生涯的影响无非两个&#xff1a; 工作能力增强升职加薪 考取证书你能获得&#xff1a; a、全面的、科学的、专业的项目管理架构理论知识; b、经过模拟实践题的联系&#xff0c;项目经验可以媲美拥有三年以上的项目管理经验的项目管理人士; c、所学的知识基础与实践已经获得…

flutter 优化检测工具

本篇内容主要结合我的另一篇文章flutter 开发App优化之旅同步补充的一篇文章&#xff0c;以供各位攻城狮借鉴共勉。 1、Flutter Inspector (debug模式下) Flutter Inspector有很多功能&#xff0c;其中有两个功能更值得我们去关注&#xff0c;例如&#xff1a;“Select Widget…