当前位置: 首页 > news >正文

每天一个知识点——L2R

面试的时候,虽然做过医疗文献搜索,也应用过L2R的相关模型,但涉及到其中的一些技术细节,都会成为我拿不下offer永远的痛。也尝试过去理解去背下一些知识点,终究没有力透纸背,随着时间又开始变得模糊,下面对相关问题进行一个总结。

一、PointWise、PairWise和ListWise

这个并不是特定的算法,而是排序模型的设计思路,主要体现在损失函数(Loss Function)以及相应的标签标注方式和优化方法的不同。

PointWise

可以训练一个二分类网络:h_{\theta }(q_{i},c_{i,j})\rightarrow y_{i,j},其中0\leq y_{i,j}\leq 1训练的目标是最小化数据集中所有问题和候选句子对的交叉熵

缺陷是虽然预测分数,但损失函数只考虑正负样本,并不要求精确打分,正样本内的先后关系并不在考虑范围。

Pointwise常见算法有SVM等

PairWise

损失函数为合页损失函数:

L=max\{0,m-h_{\theta }(q_{i},c_{i}^{+})+h_{\theta }(q_{i},c_{i}^{-})\}

这里m为边界阈值,即正样本的得分不仅要比负样本的高,而且还要高出一定阈值范围,h_{\theta }(q_{i},c_{i}^{+})-h_{\theta }(q_{i},c_{i}^{-})\geq m

缺陷是对噪音更加敏感,比如一个样本标注错误,会引起多个pair对错误,仅考虑了pair对的相对位置信息,并没有考虑到绝对位置信息。

Pairwise常见算法有Ranking SVM、RankNet、RankBoost等。

ListWise

在训练过程中给定提问q_{i}和它的一系列候选句子 C(c_{i1},c_{i2},...,c_{im})和标签 Y(y_{i1},y_{i2},...,y_{im}) ,归一化的得分向量S通过如下公式计算:

Score_j=h_\theta(q_i,c_{ij})

S=softmax([Score_1,Score_2,...,Score_m])

标签归一化为,

Y=\frac{Y}{\sum_{j=1}^{m}y_{ij}}

训练的目标可以为最小化SY的KL散度。

Listwise常见算法有AdaRank,SoftRank,LambdaMART等

二、RankNet、LambdaRank和LambdaMart

RankNet

RankNet的训练数据是一个个的pair对,比如文章(i,j),然后模型对两个候选进行打分,我们建模的目标是一个概率,即模型认为候选i比候选j更相关的概率:

P_{ij}=\frac{1}{1+e^{-\sigma (s_i-s_j)}}

C=-\bar{P}_{ij}logP_{ij} - (1-\bar{P}_{ij})log(1-P_{ij})

\bar{P}_{ij}=\frac{1}{2}(1+s_{ij}),s_{ij}\in \{-1, 0, 1\}

LambdaRank

首先对RankNet的损失函数进行分解,得到其中的梯度,

\begin{aligned} \frac{\partial C}{\partial \omega _k} &=\frac{\partial C}{\partial s _i}\frac{\partial s _i}{\partial \omega _k} + \frac{\partial C}{\partial s _j}\frac{\partial s _j}{\partial \omega _k} \\ &=\sigma (\frac{1}{2}(1-S_{ij}) - \frac{1}{1+e^{\sigma (s_i-s_j)}})(\frac{\partial s_i}{\partial \omega_k} - \frac{\partial s_j}{\partial \omega_k}) \\ &=\lambda _{ij}(\frac{\partial s_i}{\partial \omega_k} - \frac{\partial s_j}{\partial \omega_k}) \end{aligned}

\lambda _{ij}可以表示梯度的强度,进一步简化,假设对于文档对(i,j),都有文档i在文档j前面,即S_{ij}=1,则

\lambda _{ij}=\frac{-\sigma }{1+e^{\sigma (s_i-s_j)}}

LambdaRank主要创新点在于不直接定义模型的损失函数再求梯度,而是通过分析RankNet排序损失函数的梯度再直接对梯度lambda进行修改。

现在将NDCG,ERR等指标引入lambda中,论文中的做法是交换两个文档i,j的位置,然后计算评估指标的变化情况|\Delta Z|,把|\Delta Z|作为lambda的因子,Z可以是NDCG等评价指标

\lambda _{ij}=\frac{-\sigma }{1+e^{\sigma(s_i-s_j)}}|\Delta Z|

通过梯度lambda也可以反推出LambdaRank的损失函数,如下,

C=log(1+e^{-\sigma (o_i-o_j)})|\Delta Z|

三、LambdaMart的实现原理

MART: Multiple Additive Regression Tree

GBDT: Gradient Boosting Decision Tree

  • 基于多个决策树来预测结果;
  • 决策树之间通过加法模型叠加结果;
  • 每棵决策树都是针对之前决策树的不足进行改进。

在这里插入图片描述

 综上的伪代码可知,lambdaMart的计算经历这样几个步骤

  1.  利用训练数据每个query的pair对情况,计算\lambda

|\Delta Z|=\frac{abs(single\_dcgs[(i,j)] + single\_dcgs[(j,i)] - single\_dcgs[(i,i)] -single\_dcgs[(j,j)])}{IDCG}

single\_dcgs[(i,j)]=\frac{2^{scores[i]} - 1}{log_2(j + 1)}

rho = \frac{1}{1+e^{temp\_scores[i] - temp\_scores[j]}}

\lambda _i = \lambda _i + rho *|\Delta Z|

\lambda _j = \lambda _j - rho *|\Delta Z| 

同时,计算的,还有权重参数\omega,用于牛顿迭代法,但实际代码中感觉没有用到这一块。

w[i] = w[i] + rho *(1-rho) *|\Delta Z|

w[j] = w[j] + rho *(1-rho) *|\Delta Z|

        2. 以每个样本特征为X,以\lambda为拟合目标Y,构建决策树,

tree = DecisionTreeRegressor(max\_depth=50) \\ tree.fit(self.training\_data[:, 2:], \lambda )

        3. 然后用训练的决策树去预测X的分数,将得到分数加入temp\_scores中,

pred = tree.predict(self.training\_data[:, 2:]) \\ predicted\_scores = predicted\_scores + self.lr * pred

        4、然后重复上面3个步骤,训练多棵决策树。

说到决策树的训练:lambdaMART采用最朴素的最小二乘法,也就是最小化平方误差和来分裂节点:即对于某个选定的feature,选定一个值val,所有<=val的样本分到左子节点,>val的分到右子节点。然后分别对左右两个节点计算平方误差和,并加在一起作为这次分裂的代价。遍历所有feature以及所有可能的分裂点val(每个feature按值排序,每个不同的值都是可能的分裂点),在这些分裂中找到代价最小的。

五、评价指标

NDCG

DCG@T=\sum_{i=1}^{T}\frac{2^{l_i}-1}{log(1+i)}

NDCG@T=\frac{DCG@T}{maxDCG@T}

这里计算的时候,会可能会采取两种策略,需要注意下:

        1、预测结果的分数不要,只要文档的顺序,而具体分数用文档真实的分数,也就是分子分母计算的l_i用的是同一套,只不过由于预测文档的先后顺序出现变动,最大分数未必会出现在第一位;

        2、分子用预测分数,分母用真实分数。

另外需要注意的一点是分子分母计算面对可能并非完全一样的样本集。

六、参考文献

  • 排序学习(LTR)经典算法:RankNet、LambdaRank和LambdaMart

  • LambdaMART简介-基于Ranklib源码(Regression Tree训练)
  • LambdaMART简介-基于Ranklib源码(lambda计算)

相关文章:

每天一个知识点——L2R

面试的时候&#xff0c;虽然做过医疗文献搜索&#xff0c;也应用过L2R的相关模型&#xff0c;但涉及到其中的一些技术细节&#xff0c;都会成为我拿不下offer永远的痛。也尝试过去理解去背下一些知识点&#xff0c;终究没有力透纸背&#xff0c;随着时间又开始变得模糊&#xf…...

解决flutter showDialog下拉框,复选框等无法及时响应的问题

使用StatefulBuilder _showDialogr() {showDialog(context: context,builder: (BuildContext ctx) {return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {return Scaffold(body: Column(children: <Widget>[Container(height: 400,padding: …...

[C++ 网络协议编程] UDP协议

目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…...

reactNative跳转appstore链接报错:Redirection to URL with a scheme that is not HTTP(S)

在reactnative中webview跳转H5下载页面&#xff0c;包错Redirection to URL with a scheme that is not HTTP(S) 在webview中添加一下代码 const onShouldStartLoadWithRequest (event: any) > {const { url } event;console.log(url);if (url.startsWith(https://itune…...

html css实现爱心

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…...

react中使用shouldComponentUpdate生命周期函数调用setState引起的无限循环的错误

场景&#xff1a; 在 React 组件中&#xff0c;当在 componentWillUpdate 或 componentDidUpdate 生命周期方法中调用 setState 时&#xff0c;会触发无限循环&#xff0c;导致超过最大更新深度。 错误原因 在React组件中 &#xff0c;我们使用componentWillUpdate 或 componen…...

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?

近日&#xff0c;麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势&#xff0c;并把他们分为5大类&#xff0c;人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一&#xff1a;人工智能革命 生成式AI 生成型人工智能标志着人工智…...

【爬虫】P1 对目标网站的背景调研(robot.txt,advanced_search,builtwith,whois)

对目标网站的背景调研 检查 robot.txt估算网站大小识别网站所用技术寻找网站的所有者 检查 robot.txt 目的&#xff1a; 大多数的网站都会包含 robot.txt 文件。该文件用于指出使用爬虫爬取网站时有哪些限制。而我们通过读 robot.txt 文件&#xff0c;亦可以最小化爬虫被封禁的…...

maven如何建立JavaWeb项目并连接数据库,验证登录

这里是建立建立web项目&#xff1a;Maven如何创建Java web项目&#xff08;纯干货版&#xff09;&#xff01;&#xff01;&#xff01;_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面&#xff1a;index.jsp 还需要再…...

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)

注1:本文系“计算机视觉/三维重建论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读计算机视觉&#xff0c;特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…...

动态规划(基础)

一&#xff0c;背包问题 老规矩&#xff0c;上链接&#xff08;http://t.csdn.cn/hEwvu&#xff09; &#xff08;1&#xff09;01背包问题 给定一个承重量为C的背包&#xff0c;n个重量分别为w1​,w2​,...,wn​的物品&#xff0c;物品i放入背包能产生pi​(>0)的价值(i1,…...

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector

文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1&#xff09;在自然语言处理NLP领域&#xff0c;是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度&#xff0c;通常在几…...

动态库的命名规则

1、动态库的命名规则&#xff1a;libname.so.x.y.z 名字含义lib这是共享库的前缀name共享库名字x主版本号y次版本号z发布版本号 2、每个版本号的含义 版本号含义主版本号表示库的重大升级&#xff0c;不同主版本号的库之间是不兼容的。依赖旧的主版本号的程序需要改动相应的…...

【Linux】网络---->网络理论

网络理论 网络协议分层模型网络数据的封装于分用地址管理 网络协议分层模型 OSI五层模型&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层 应用层&#xff1a;主要负责应用程序间的沟通&#xff0c;代表协议有HTML协议&#x…...

Android学习之路(4) UI控件之输入框

本节引言&#xff1a; 在本节中&#xff0c;我们来学习第二个很常用的控件EditText(输入框)&#xff1b; 和TextView非常类似&#xff0c;最大的区别是&#xff1a;EditText可以接受用户输入&#xff01; 1.设置默认提示文本 如下图&#xff0c;相信你对于这种用户登录的界面并…...

1.初识Web

文章目录 1. 什么是Web?2.初始Web前端2.1.Web标准 1. 什么是Web? web:全球广域网&#xff0c;也称万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 2.初始Web前端 网页有哪些部分组成&#xff1f; 文字、图片、音频、视频、超链接… 我们看到的网页&am…...

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

微服务技术一 技术栈图一、注册中心Eureka概念&#xff1a;搭建EurekaServer服务注册服务发现&#xff08;消费者对提供者的远程调用&#xff09; 二、Ribbon负载均衡负载均衡的原理&#xff1a;LoadBalanced负载均衡的策略&#xff1a;IRule懒加载 三、Nacos注册中心Nacos的安…...

【Linux】可重入函数 volatile关键字 以及SIGCHLD信号

可重入函数 volatile关键字 以及SIGCHLD信号 一、可重入函数1、引入2、可重入函数的判断 二、volatile关键字1、引入2、关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 1、引入 我们来先看一个例子来帮助我们理解什么是可重入函数&#xff1a; 假设我们现在要对…...

【动态规划】回文串问题

文章目录 动态规划&#xff08;回文串问题&#xff09;1. 回文子串2. 最长回文子串3. 回文串分割 IV4. 分割回文串 ||5. 最长回文子序列6. 让字符串成为回文串的最小插入次数 动态规划&#xff08;回文串问题&#xff09; 1. 回文子串 题目链接 状态表示 f[i][j]表示 i 到 j …...

Laravel Swift Mail发送带附件的邮件报错 “Swift_IoException The path cannot be empty“处理

先说下情况&#xff0c;就是我要做一个发送附件的邮件发送功能&#xff0c;结果&#xff0c;报错&#xff1a;The path cannot be empty。给我整的有点迷糊&#xff0c;网上也没有类似的问题。后来&#xff0c;我检查了一下代码&#xff0c;发现有个地方&#xff0c;是需要给附…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...