龙空技术网

AI 驱动的搜索:11 构建学习对用户点击的训练数据进行排名

启辰8 518

前言:

眼前姐妹们对“js 点击元素”大概比较重视,同学们都想要分析一些“js 点击元素”的相关资讯。那么小编在网上搜集了一些关于“js 点击元素””的相关文章,希望小伙伴们能喜欢,姐妹们一起来了解一下吧!

11 构建学习对用户点击的训练数据进行排名本章涵盖根据用户行为信号(点击等)自动进行学习排名(LTR)再训练使用点击模型将用户信号转换为隐式 LTR 训练数据为什么仅使用原始点击次数并不能很好地构建 LTR 训练数据补偿用户点击搜索结果页面上方的倾向,无论相关性如何在训练数据中以更少的点击次数处理文档

在第 10 章中,我们逐步训练了排序学习 (LTR) 模型。就像了解制造汽车的机制一样,我们看到了 LTR 模型训练的基本细节。在本章中,我们将 LTR 训练过程视为黑匣子。换句话说,我们放弃了 LTR 的内部结构,而是将 LTR 视为一辆自动驾驶汽车,微调它的行程以到达最终目的地。

回想一下,LTR 依赖于准确的训练数据才能发挥作用。LTR 训练数据描述了用户期望搜索结果如何得到最佳排名。训练数据为我们输入 LTR 自动驾驶汽车提供了方向。正如您将看到的,根据用户交互了解相关内容会带来许多挑战。不过,如果我们能够克服这些挑战并对我们的训练数据获得高度信心,那么我们就可以构建自动排名学习:一个定期重新训练 LTR 以捕获最新用户相关性期望的系统。

由于训练数据对于自动化 LTR 至关重要,因此挑战不再是“我们应该使用什么模型/功能/搜索引擎?” 但更根本的是:“用户想从搜索中得到什么? ”,“我们如何将其转化为训练数据? ”,以及“我们如何知道该训练数据是否有用? ”。通过提高我们对这些问题答案的信心,我们可以将 LTR(重新)训练置于自动驾驶仪上,如图 11.1 所示

图 11.1。自动学习排名系统会自动学习并重新训练用户的信号。

简要介绍自动化 LTR 流程中的每个步骤:

第 1 步 - 输入新目的地:我们将训练数据输入到 LTR 系统中,这些训练数据基于我们对用户行为信号(例如搜索、点击和转化)的理解来描述理想的相关性(本章将介绍)。第 2 步 - 开车前往目的地:我们的 LTR 系统使用提供的训练数据重新训练 LTR 模型(如第 10 章所述)。第三步——我们到了吗?:这个模型真的对用户有帮助吗?未来的模型是否应该探索替代路线?(第 12 章介绍)。

自动 LTR 不断重复步骤 1-3 以自动优化相关性。搜索团队监控 Automated LTR 的性能并根据需要进行干预。这是图11.1 中的维护部分。在维护期间,我们打开引擎盖探索新的 LTR 功能和其他模型调整。维护还可能意味着重新审视第 1 步,纠正我们对用户行为的理解,从而构建更可靠、更强大的训练数据。毕竟,如果没有良好的训练数据,我们可以按照第 10 章进行操作,但仍然无法满足我们的用户。

本章通过关注步骤 1 来开始对自动化 LTR 的探索。为了了解步骤 1,我们首先定义从用户点击中获取训练数据的任务。然后,我们将在本章中克服搜索点击数据的常见挑战。在本章结束时,您将能够使用可靠的训练数据构建模型。第 12 章通过观察模型与实时用户的交互来完成我们的自动化 LTR 探索。特别是,第 12 章教你如何克服搜索数据最基本的缺陷:呈现偏差,除非我们给它们一个被点击的机会,否则我们永远不会知道某些结果是否相关!

11.1 从信号(重新)创建判断列表

我们提到,在通过点击创建 LTR 训练数据时,我们需要克服偏差。然而,在我们深入研究这些偏差之前,我们将探讨使用点击而不是手动标签对 LTR 训练数据产生的影响。然后,我们将在本节中首先尝试制作训练数据,最后反思哪些进展顺利,哪些进展不佳。这将为我们在本章的其余部分探索消除这些结果的偏差(第 11.2 节及以后的内容)做好准备。

11.1.1 从信号中生成隐含的概率判断

让我们为如何使用行为信号作为 LTR 训练数据奠定基础。然后我们将深入探讨构建可靠判断列表的实质内容。

在第 10 章中,我们讨论了 LTR 训练数据,称为判断列表判断。这些是针对给定查询的潜在搜索结果的相关程度的标签或等级。在第 10 章中,我们使用电影作为例子。我们将电影标记为 1(相关)或 0(不相关),如清单 11.1中的示例。

清单 11.1。给电影贴上相关或不相关的标签

mini_judg_list=[    # for 'social network' query    Judgment(grade=1, keywords='social network', doc_id='37799'),    [CA]# The Social Network    Judgment(grade=0, keywords='social network', doc_id='267752'),    [CA]# chicagoGirl    Judgment(grade=0, keywords='social network', doc_id='38408'),    [CA]# Life As We Know It    Judgment(grade=0, keywords='social network', doc_id='28303'),    [CA]# The Cheyenne Social Club    # for 'star wars' query    Judgment(grade=1, keywords='star wars', doc_id='11'),    [CA]# Star Wars, A New Hope    Judgment(grade=1, keywords='star wars', doc_id='1892'),    [CA]# Return of the Jedi    Judgment(grade=0, keywords='star wars', doc_id='54138'),    [CA]# Star Trek Into Darkness    Judgment(grade=0, keywords='star wars', doc_id='85783'),    [CA]# The Star    Judgment(grade=0, keywords='star wars', doc_id='325553'),    [CA]# Battlestar Galactica]

生成判断列表的技术有很多。这不是关于判断列表及其许多应用的综合章节 - 相反,我们特别关注 LTR 训练数据。因此,我们只讨论根据用户点击信号产生的判断,称为隐式判断。我们称这些判断为隐式判断,因为它们源自用户在搜索和点击时与搜索应用程序的真实交互。这与明确的判断形成鲜明对比,在明确的判断中,评估者直接将搜索结果标记为相关/不相关。

隐式判断对于自动化 LTR 来说是理想的选择,原因如下:

新近度:我们可以随时访问用户流量。我们可以根据最新的用户搜索期望自动训练当今的 LTR 模型。以更低的成本获得更多数据:即使通过众包,设置一项任务来捕获明确的判断也是耗时且昂贵的,要在规模上取得良好的效果。捕捉实时用户的判断使我们能够利用现有的用户群来为我们完成这项工作。捕获真实用例:隐式判断捕获使用您的搜索应用程序执行实际任务的真实用户。将此与实验室的人工环境进行对比,在实验室中,明确的评估者对人工任务进行了仔细的思考,也许是不切实际的。

然而,点击会带来更多的模糊性。我们不知道用户为什么点击给定的搜索结果。此外,用户并不是同质的,有些人会将某一结果解释为相关,而另一些人则不然。搜索交互还包含需要克服的偏差,从而为模型的计算带来额外的不确定性,我们将在本章和下一章中详细讨论。

由于这些原因,点击模型创建的是概率判断,而不是二元判断。等级表示随机用户认为结果相关或不相关的概率(0.0 到 1.0 之间)。例如,一个好的点击模型可能会用类似于清单 11.2 的内容重述清单11.1 中的判断。

清单 11.2。以概率方式标记电影查询相关性

mini_judg_list=[    Judgment(grade=0.99, keywords='social network', doc_id='37799'),    [CA]# The Social Network    Judgment(grade=0.01, keywords='social network', doc_id='267752'),    [CA]# chicagoGirl    Judgment(grade=0.01, keywords='social network', doc_id='38408'),    [CA]# Life As We Know It    Judgment(grade=0.01, keywords='social network', doc_id='28303'),    [CA]# The Cheyenne Social Club    # for 'star wars' query    Judgment(grade=0.99, keywords='star wars', doc_id='11'),    [CA]# Star Wars, A New Hope    Judgment(grade=0.80, keywords='star wars', doc_id='1892'),    [CA]# Return of the Jedi    Judgment(grade=0.20, keywords='star wars', doc_id='54138'),    [CA]# Star Trek Into Darkness    Judgment(grade=0.01, keywords='star wars', doc_id='85783'),    [CA]# The Star    Judgment(grade=0.20, keywords='star wars', doc_id='325553'),    [CA]# Battlestar Galactica]

注意清单 11.2中的星球大战电影——它grade变得更加有趣了。原版《星球大战》电影现在具有很高的相关性概率 ( 0.99)。续集《绝地归来》概率略低。其他科幻电影(《星际迷航:暗黑无界》和《太空堡垒卡拉狄加》)的收视率略高于0,因为星球大战迷可能也会喜欢这些电影。0.01《星星》完全不相关——这是一部关于第一个圣诞节的儿童动画电影——所以它的相关概率很低。

11.1.2 使用概率判断训练LTR模型

我们刚刚介绍了相关性等级可以是概率性的,即介于 0-1 之间的想法。现在,让我们考虑如何应用第 10 章中的经验教训,使用这些模糊的概率判断来训练模型。

一般来说,您在训练模型时可能会考虑以下选项:

量化成绩- 很简单,您可以在训练之前设置任意截止值,将成绩转换为可接受的格式。您可以将 > 0.75 的等级指定为相关(或1)。任何小于 0.75 的值都被认为是不相关的(或0)。其他算法(例如 LambdaMART)接受 1 - 4 等一系列等级,并且这些算法也可能有截止值,例如将任何 < 0.25 的值分配为 1 级,将任何 >= 0.25 但 < 0.5 的值分配为 2 级,等等在。使用这些算法,您可以创建 100 个这样的标签,将 0.00 分配为 0 级,将 0.01 分配为 1 级,依此类推,直到在训练之前将 1 分配为 100 级。只需使用浮点判断- 第 10 章中的 SVMRank 算法从不太相关的项目特征中减去更相关的项目特征(反之亦然),并构建一个分类器来区分相关和不相关。我们用二元判断来做到这一点,但没有什么可以阻止我们也用概率判断来做到这一点。在这里,如果“绝地归来”(等级 = 0.8)被认为比“星际迷航:暗黑无界”(等级 = 0.2)更相关,那么我们只需将“绝地归来”标记为比“星际迷航:暗黑无界”更相关(将差异标记为+1)。然后我们执行与第 10 章中执行的相同的成对减法,

本章中使用判断重新训练模型将大量重复第 10 章中的代码。我们已经包含了一个完整的端到端 LTR 训练示例,该示例使用我们在本章末尾获得的点击模型。要查看此示例,请访问标题为列表 xy 的笔记本(作为提醒 - 请参阅附录 A 了解如何设置您的环境)。

是时候回到代码并查看我们的第一次点击模型了!

11.1.3 点击率:您的首次点击模型

现在您已经了解了点击模型生成的判断,以及如何使用它们来训练模型,接下来我们将检查点击模型的第一个简单传递。之后,我们将退后一步,主要关注更复杂的通用点击模型,最后探索处理搜索点击信号中固有的核心偏差。由于我们专注于自动化 LTR 的单击模型,因此我们鼓励您阅读Chuklin、Markov 和 de Rijke 所著的《Click Models for Web Search》一书,以了解您可以使用的更广泛的点击模型选择。

我们将返回到 RetroTech 数据集。这些数据可以方便地与用户点击信号捆绑在一起。我们还根据这些信号对您需要构建高质量判断的原始会话数据进行了逆向工程。我们将利用该pandas库对会话数据执行表格计算。

在清单 11.3中,我们检查了电影“Transformers Dark of The Moon”的示例搜索会话。这些原始会话信息是您的起点,是根据用户信号制定判断列表所需的最低限度的信息。

清单 11.3。检查搜索会话

QUERY='transformers dark of the moon'query_sessions = sessions[sessions['query'] == QUERY] #1query_sessions[query_sessions['sess_id'] == 2] #2

输出:

sess_id query                           rank    doc_id          clicked2           transformers dark of the moon       0.0         47875842328     False2           transformers dark of the moon       1.0         24543701538     True2           transformers dark of the moon       2.0         25192107191     False2           transformers dark of the moon       3.0         47875841420     False2           transformers dark of the moon       4.0         786936817218    False2           transformers dark of the moon       5.0         47875842335     False2           transformers dark of the moon       6.0         47875841406     False2           transformers dark of the moon       7.0         97360810042     False2           transformers dark of the moon       8.0         24543750949     False2           transformers dark of the moon       9.0         36725235564     False2           transformers dark of the moon       10.0    47875841369         False2           transformers dark of the moon       11.0    97363560449     False2           transformers dark of the moon       12.0    400192926087    False2           transformers dark of the moon       13.0    97363532149     False2           transformers dark of the moon       14.0    93624956037     False

清单 11.3对应于查询 的单个搜索会话sess_id2 transformer dark of the moon。此会话包括查询transformers dark of the moon、用户看到的排名结果以及每个结果是否被点击。这三个元素(查询、提供给用户的前 N ​个结果、点击的内容)是点击模型完成其工作所需的核心要素。

搜索会话经常会有所不同。另一个会话,甚至几秒钟后,可能会向用户呈现略有不同的排名。搜索索引可能已更改或新的相关性算法已部署到生产中。我们鼓励您与另一个重试清单 11.2sess_id以比较会话。

让我们使用首次点击模型(简单的点击率)将此数据用于判断。

根据点击率建立判断

现在我们了解了输入,让我们构建一个简单的点击模型。我们将从简单的开始,熟悉数据,然后我们可以退后一步,看看第一遍的缺陷。这将使我们能够在本章的其余部分仔细思考为自动 LTR 生成的判断的质量。

我们的首次点击模型是点击率。点击率或CTR是搜索结果收到的点击次数除以搜索结果中出现的次数。如果搜索引擎每次返回结果时都点击该结果,则 CTR 将为 1。如果从未点击过,则 CTR 将为 0。听起来很简单 - 可能会出现什么问题?

让我们看看点击率的实际效果。我们可以查看查询的每个结果transformers dark of the moon,并根据返回的会话数考虑点击次数doc_id。清单 11.4显示了 CTR 计算以及每个文档的 CTR 值。

清单 11.4。计算点击率

QUERY='transformers dark of the moon'query_sessions = sessions[sessions['query'] == QUERY] #1click_counts = query_sessions.groupby('doc_id')['clicked'].sum() #2sess_counts = query_sessions.groupby('doc_id')['sess_id'].nunique() #3ctrs = click_counts / sess_counts #4ctrs.sort_values(ascending=False) #5

输出:

doc_id          CTR97360810042     0.082447875842328     0.073447875841420     0.043424543701538     0.036425192107191     0.0352786936817218    0.023697363560449     0.019247875841406     0.0160400192926087    0.012447875842335     0.010697363532149     0.008493624956037     0.008236725235564     0.008247875841369     0.007424543750949     0.0062

在清单 11.4中,我们查看每个会话以对每次doc_id计算的点击次数进行求和clicks_per_count。我们还在 中计算该文档的唯一会话数sess_counts。最后,我们ctrs通过除以进行计算click_count / sess_counts。我们看到该文档的97360810042点击率最高和24543750949最低。

该代码片段根据点击模型输出理想的搜索结果。也就是说,如果我们的 LTR 模型一切正确,它就会产生这个精确的排名。在本章和下一章中,我们将经常直观地显示这个理想的排名,以了解点击模型是否构建了合理的训练数据。我们可以在图 11.2 中看到 CTR 的理想状态transformers dark of the moon。

图 11.2。根据“变形金刚月黑之时”的点击率,理想的搜索结果。通过查看点击模型的理想搜索结果

检查图 11.2 的结果,可以发现以下几点:

我们的最高结果(电影《变形金刚:月黑之时》的蓝光)的点击率似乎相当低(0.0824,只比接下来的 0.0734 判断好一点)。我们可能期望蓝光的相关性等级比其他结果高得多。《变形金刚:月黑之时》的 DVD 甚至没有出现。它远远低于与电影《月黑之时》相关的看似无关的电影和次要视频游戏。我们预计 DVD 的排名会更高,可能与蓝光一样高或更高。

但也许transformers dark of the moon这只是一个奇怪的查询。让我们重复一些完全不相关的事情。这次dryer如图 11.3 所示。

图 11.3。根据“烘干机”点击率的理想搜索结果。

在图 11.3 中,我们看到了其他奇怪的结果:

前两个结果是干衣机,这看起来不错干衣机之后是干衣机部件。嗯。。好?一部叫《独立报》的电影上映了?这看起来完全是随机的。为什么这部作品会被评价如此之高呢?接下来是洗衣机配件。有点相关。最后,吹风机,这也许是这个词的另一个含义dryer

您如何看待CTR做出的判断?回想一下您在第 10 章中学到的内容。记住这是 LTR 模型的基础和目标。您认为它们是否会带来一个良好的 LTR 模型,如果投入生产,最终会取得成功?

我们还鼓励您问自己一个更基本的问题:我们如何判断判断列表是否良好?我们的主观解释可能与点击模型中的数据一样有缺陷!我们将在第 12 章中更深入地考虑这一点。在本章中,我们将让我们的直觉引导我们解决可能的问题。

11.1.4 判断中常见的偏差

到目前为止,我们已经看到,只需将产品的点击次数除以搜索返回该产品的次数,就可以创建概率判断(等级在 0-1 之间)。然而,输出似乎有点不足,因为它包括实际上与“变形金刚”系列无关的电影。我们还看到一部电影出现在搜索结果中dryer!

事实证明,搜索点击数据充满了偏见。在这里,我们将简要定义“偏差”的含义,然后逐步探索 RetroTech 点击数据中的每个偏差。

对于点击模型,偏差是原始用户点击数据与搜索结果的相关性无关的原因。相反,偏差定义了点击(或缺乏点击)如何反映用户心理、搜索用户界面设计或嘈杂数据。我们将偏见分为两大类。非算法和算法偏差。算法偏差是排名、显示以及与搜索结果交互中固有的偏差。非算法偏差的发生仅与搜索排名间接相关。

算法偏差可能包括:

位置偏差:用户点击排名较高的结果的次数多于排名较低的结果置信偏差:信号数据较少的文档与数据较多的文档对判断的影响相同呈现偏差:如果搜索从未显示结果,则用户永远不会单击它们。因此点击模型不会知道它们是否相关!

另一方面,非算法偏差是这样的偏差:

吸引力偏差:有些结果看起来很有吸引力并产生点击(可能是由于更好的图像或措辞选择),但结果却是垃圾邮件或无关紧要性能偏差:用户放弃缓慢的搜索,分心,最终没有点击任何内容

毕竟,这本书是人工智能驱动的搜索,因此我们将重点讨论搜索点击流数据中的算法偏差。但是,当然,非算法偏差也很重要!搜索是一个复杂的生态系统,超越了相关性排名。如果结果被频繁点击,但没有发生销售或其他转化等后续操作,则可能不完全是排名问题,但可能您遇到了垃圾产品的问题。或者您可能在产品页面或结账流程方面遇到问题。当限制因素实际上是用户体验、内容或搜索速度时,您可能会发现自己被要求提高“相关性”。有关更多信息,我们推荐 Max Irwin 撰写的文章“搜索质量简介”()

当我们探索其他点击模型时,我们将在本章的其余部分介绍位置偏差和置信度偏差。第 12 章将介绍呈现偏差。有关克服偏差的额外、全面的视角,我们推荐René Kriegler 撰写的论文《点击概率、确定性和上下文:从网络跟踪中得出搜索相关性判断的实用贝叶斯方法》 。

现在我们已经反思了我们的第一次点击模型,让我们努力克服第一个偏见。

11.2 克服排名偏差:搜索引擎返回的越高,它一定越好!

在上一节中,我们看到了第一个点击模型的实际应用:简单的点击率。这将产品在搜索中被点击的次数除以它在顶部结果中返回的次数。我们发现这是一个相当有缺陷的方法,并指出了许多可能存在偏见的原因。是时候开始解决这些问题了!

让我们实际操作一个旨在克服位置偏差的点击模型,通常第一个偏差点击模型可以克服。

11.2.1 定义位置偏差

大多数搜索系统中都存在位置偏差。如果向用户显示搜索结果,他们往往更喜欢排名较高的搜索结果而不是较低的搜索结果 - 即使这些较低的结果实际上更相关。约阿希姆斯等。等人在论文《评估网络搜索中点击和查询重构的隐式反馈的准确性》 ( )中讨论了存在位置偏差的几个原因:

信任偏见- 用户相信搜索引擎必须知道它在做什么,因此他们与更高的结果进行更多的交互扫描行为- 用户以特定模式(例如从上到下)检查搜索结果,并且通常不会探索他们面前的所有内容可见性- 排名较高的结果可能会呈现在用户屏幕中,因此用户需要滚动才能查看其余结果

考虑到这些因素,让我们看看是否可以在 RetroTech 会话中检测到位置偏差。

11.2.2 RetroTech 数据中的位置偏差

RetroTech 数据集中的会话中存在多少位置偏差?如果我们能够量化这一点,那么我们就可以考虑如何准确地解决这个问题。在考虑使用新的点击模型来克服这些偏差之前,让我们快速评估一下偏差。

通过查看所有会话、所有查询,我们可以计算每个排名的平均点击率。这将告诉我们 RetroTech 点击数据中存在多少位置偏差。我们在清单 11.5中这样做

清单 11.5。所有查询的搜索会话中每个排名的点击率

num_sessions = len(sessions['sess_id'].unique()) #1global_ctrs = sessions.groupby('rank')['clicked'].sum() / num_sessions #2global_ctrs

输出:

rank0.0     0.2497271.0     0.1426732.0     0.0842183.0     0.0630734.0     0.0562555.0     0.0422556.0     0.0332367.0     0.0380008.0     0.0209649.0     0.01736410.0    0.013982

您可以在清单 11.5中看到,用户点击较高位置的次数更多。结果的点击率rank=0是 0.25,其次rank=1是 0.143,依此类推。

此外,当我们将早期的点击率判断与查询中每个产品的典型排名进行比较时,我们可以看到排名偏差。如果存在位置偏差,那么我们判断的理想排名最终将类似于向用户显示的典型排名。我们可以通过平均每个会话中每个文档的排名来分析这一点,以查看它们出现的位置。

在清单 11.6中,我们展示了典型的会话搜索结果页面transformers dark of the moon。

清单 11.6。检查文档的等级transformers dark of the moon

QUERY='transformers dark of the moon'query_sessions = sessions[sessions['query'] == QUERY] #1avg_rank = query_sessions.groupby('doc_id')['rank'].mean() #2avg_rank.sort_values(ascending=True)

输出:

doc_id           mean historical rank47875842328      0.980824543701538      1.862625192107191      2.659647875841420      3.5344786936817218     4.444447875842335      5.277647875841406      6.137897360810042      7.013024543750949      7.862636725235564      8.685447875841369      9.579697363560449     10.430493624956037     11.329897363532149     12.1494400192926087    13.0526

在清单 11.6中,一些文档(例如24543701538和47875842328历史记录)出现在该查询的搜索结果的顶部。由于位置偏差,他们只会获得更多点击。图 11.5 所示的典型结果页面与图 11.2 中的点击率理想结果有很多重叠。

图 11.4。查询的典型搜索结果页面transformers dark of the moon。

不幸的是,点击率主要受到位置偏差的影响。用户点击图 11.4 中的奇怪电影是因为搜索引擎针对该查询返回了很高的结果,而不是因为它们相关。如果我们仅在 CTR 上训练 LTR 模型,我们会要求 LTR 模型针对用户已经看到和交互的内容进行优化。

在自动化 LTR 时,我们必须考虑位置偏差。接下来让我们看看如何在更稳健的点击模型中克服位置偏差来补偿位置偏差。

11.2.3 克服位置偏差的点击模型:简化的动态贝叶斯网络

您已经看到了立场偏见所造成的危害!如果我们直接使用点击量,我们将只训练 LTR 模型来强化已经向用户显示的排名。是时候介绍一个可以克服位置偏差的点击模型了。我们将首先讨论建模位置偏差的一个关键概念,即“检查”。然后,我们将介绍一种特定的点击模型,该模型使用此“检查”概念来调整原始点击次数以克服位置偏差。

点击模型如何通过“检查”事件克服位置偏差

在我们第一次尝试点击率时,我们并没有真正考虑用户如何扫描搜索结果。用户可能只考虑了几个结果(因位置而有偏差),最终决定单击一两个。如果我们能够捕获用户在点击之前有意识地考虑哪些结果,我们也许能够克服位置偏差。单击模型正是通过定义检查的概念来做到这一点。在构建克服位置偏差的点击模型之前,我们将探讨这个概念。

什么是检查?您可能熟悉印象- 在用户屏幕的可见部分呈现的 UI 元素。在点击模型中,我们考虑的是检查,即用户实际上有意识地考虑搜索结果的概率。众所周知,用户常常无法注意到眼前的事物。您甚至可能就是那个用户!图 11.6 体现了这一概念,将印象与检查进行了对比。

图 11.5。印象是在视口(显示器形状的正方形)中渲染的任何内容,

您可以在图 11.5 中看到,用户没有注意到位于第二位置的任天堂游戏 - 即使它正在他们的显示器上呈现。如果用户没有检查它,点击模型不应损害任天堂游戏的相关性。

为什么跟踪检查有助于克服立场偏见?检查点击模型如何理解位置偏差。“位置偏见”的另一种说法是“我们认为用户是否检查搜索结果取决于位置”。因此,建模检查权是大多数点击模型的核心活动。某些点击模型,例如基于位置的模型(或 PBM),尝试确定所有搜索中每个位置的检查概率。其他模型,例如级联模型,或者我们很快就会看到的动态贝叶斯网络模型,假设如果结果高于搜索页面上的最后一次点击,则可能已对其进行了检查。

对于大多数点击模型,顶部位置通常比较低位置具有更高的检查概率。这允许点击模型正确调整点击次数。经常检查和点击的项目会得到奖励,并被视为更相关。那些经过检查但未点击的内容被视为不太相关。

为了使这一点更加具体,让我们更深入地研究其中一个动态贝叶斯网络点击模型,看看它如何克服位置偏差。

定义简化动态贝叶斯网络

是时候回到算法了!我们讨论了点击模型如何通过对检查的概念进行建模来克服位置偏差。每个点击模型都以不同的方式定义了这个概念,接下来您将看到一种流行的点击模型如何解决这个问题。这将完成我们的立场偏见讨论,并让我们在本章结束时了解我们将讨论的最后一个问题:置信偏见。

简化动态贝叶斯网络(或SDBN )是更复杂的动态贝叶斯网络点击模型(或DBN )的精确度稍低的版本。这些点击模型假设,在搜索会话中,用户检查文档的概率在很大程度上取决于该文档是否位于点击次数最少的文档之上或之上。

SDBN 的算法首先标记每个会话的最后一次点击,然后考虑检查最后一次点击或以上的每个文档。最后,它通过简单地将文档的总点击次数除以总检查次数来计算相关性等级。我们有效地获得了一种动态点击率,跟踪用户可能检查结果的每个会话,并仔细使用它来解释用户如何评估其相关性。

让我们一步一步地了解这个算法。我们首先在清单 11.7中标记每个会话的最后一次点击。

清单 11.7。标记每个会话中检查了哪些结果

QUERY='dryer'sdbn_sessions = sessions[sessions['query'] == QUERY].copy().set_index([CA]'sess_id') #1last_click_per_session = sdbn_sessions.groupby(['clicked', 'sess_id'])[[CA]'rank'].max()[True] #2sdbn_sessions['last_click_rank'] = last_click_per_session #3sdbn_sessions['examined'] = sdbn_sessions['rank'] <= sdbn_sessions[[CA]'last_click_rank'] #4sdbn_sessions.loc[3] #5

输出(截断):

sess_id        query   rank    doc_id          clicked last_click_rank examined3       dryer   0.0     12505451713     False   9.0             True3       dryer   1.0     84691226727     False   9.0             True3       dryer   2.0     883049066905    False   9.0             True3       dryer   3.0     48231011396     False   9.0             True3       dryer   4.0     74108056764     False   9.0             True3       dryer   5.0     77283045400     False   9.0             True3       dryer   6.0     783722274422    False   9.0             True3       dryer   7.0     665331101927    False   9.0             True3       dryer   8.0     14381196320     True    9.0             True3       dryer   9.0     74108096487     True    9.0             True3       dryer   10.0    74108007469     False   9.0             False3       dryer   11.0    12505525766     False   9.0             False3       dryer   12.0    48231011402     False   9.0             False

在清单 11.7clicked中,我们通过将其存储在 中找到了 true 的最大排名last_click_per_session。然后,我们将last_click_rank在 的会话中检查的位置标记为等于或高于 的位置dryer,正如您在 的输出中看到的那样sess_id=3。

将每个会话更新为 True/False 时,我们现在将所有会话中每个文档的总点击次数和检查次数相加,如清单 11.8 所示。

清单 11.8。对该查询的每个 doc_id 的点击次数和检查次数进行求和

sdbn = sdbn_sessions[sdbn_sessions['examined']].groupby('doc_id')[[CA]['clicked', 'examined']].sum() #1sdbn

输出:

doc_id         clicked examined12505451713    355.0   2707.012505525766    268.0   974.012505527456    110.0   428.014381196320    217.0   1202.036172950027    97.0    971.036725561977    119.0   572.036725578241    130.0   477.048231011396    166.0   423.0...

在清单 11.8中,sdbn_sessions[sdbn_sessions['examined']]仅过滤检查的行。然后,根据doc_id,我们计算总数clicked和examined计数。您可以看到一些结果,例如doc_id=36172950027用户的点击次数相对较少,但显然已经进行了大量检查。

最后,我们通过计算点击次数来完成清单 11.9中的 SDBN 算法。

清单 11.9。计算最终 SDBN 等级

sdbn['grade'] = sdbn['clicked'] / sdbn['examined'] #1sdbn = sdbn.sort_values('grade', ascending=False)

输出

doc_id          clicked examined    grade856751002097    133.0   323.0       0.41176548231011396     166.0   423.0       0.39243584691226727     804.0   2541.0      0.31641174108007469     208.0   708.0       0.29378512505525766     268.0   974.0       0.27515436725578241     130.0   477.0       0.27253748231011402     213.0   818.0       0.26039112505527456     110.0   428.0       0.257009...

在清单 11.9的输出中,我们看到文档856751002097被认为是最相关的,0.4118在 323 次检查中获得了 133 次点击。

让我们重新审视我们的两个查询,看看现在如何寻找dryer和的理想结果transformers dark of the moon。图 11.7 显示了 的结果dryer,图 11.8 显示了transformers dark of the moon

图 11.6。dryer根据SDBN查询的理想搜索结果。请注意,SDBN 似乎如何将更多与洗衣服有关的结果归零。

图 11.7。transformers dark of the moon根据SDBN查询的理想搜索结果。我们现在已经推出了 DVD、蓝光电影和 CD 配乐

主观地考察图11.7和图11.8,两组判断似乎都比CTR判断更直观。在我们的dryer示例中,重点似乎是洗衣服。有些配件​​(例如烘干机球)的得分与烘干机本身大致相同。

对于transformers dark of the moon,我们注意到蓝光电影的等级非常高。我们还看到 DVD 和 CD 原声带的排名高于其他次要“月黑之时”项目(例如视频游戏)。有点奇怪的是,原声带 CD 的排名高于电影 DVD,也许我们应该对此进行更多研究。

当然,正如我们之前所说,我们现在使用的是主观感觉。在第12章中,我们将更客观地思考如何评估判断质量。

然而,随着位置偏差得到更好的控制,我们将继续微调我们的判断,以处理在使用点击模型自动化 LTR 时需要克服的另一个关键偏差:置信度偏差。

11.3 处理置信偏差:不要因为几次幸运的点击而颠覆你的模型

在棒球比赛中,球员的击球率告诉我们他们每次击球的安打比例。一名出色的职业球员的击球率 > 0.3。然而,想象一下,一位幸运的小联盟棒球运动员第一次击球就上垒,并获得了安打。从技术上讲,他们的击球率是 1.0!那么我们可以得出结论,这个小孩子是一个棒球神童,并且一定会拥有一个伟大的棒球生涯。正确的?

不完全的!在本节中,我们将探讨这位幸运小联盟选手的相关性。我们该如何处理那些只检查了几次、每次都点击一下的结果(也许只是运气不好)的结果?这些应该得到 1.0 的评分,对吗?事实上,我们会在数据中看到这个问题!有了这个问题定义,我们就可以致力于解决问题了。

11.3.1 RetroTech点击数据的低置信度问题

让我们查看数据,看看低置信度数据点在哪里使训练数据产生偏差。然后我们将了解如何弥补 SDBN 数据集中的低置信度问题。为了定义问题,让我们花时间查看 SDBN 结果transformers dark of the moon和另一个较罕见的查询,以了解常见的低置信度情况。

如果您还记得的话,《变形金刚月黑之时》的原声 CD 根据 SDBN 的排名如此之高,有点令人怀疑。当我们检查排名背后的原始数据时,我们可以看到一个可能的问题。在清单 11.10中,我们重建了 SDBN 数据来transformers dark of the moon调试此问题,并将清单 11.7-11.9 组合成一个代码片段。

清单 11.10。重新计算 SDBN 统计数据transformers dark of the moon

QUERY='transformers dark of the moon'sdbn_sessions = sessions[sessions['query'] == QUERY].copy().set_index([CA]'sess_id') #1last_click_per_session = sdbn_sessions.groupby(['clicked', 'sess_id'])[CA]['rank'].max()[True] #2sdbn_sessions['last_click_rank'] = last_click_per_session #2sdbn_sessions['examined'] = sdbn_sessions['rank'] <= sdbn_sessions[[CA]'last_click_rank'] #2sdbn = sdbn_sessions[sdbn_sessions['examined']].groupby('doc_id')[[CA]['clicked', 'examined']].sum() #2sdbn['grade'] = sdbn['clicked'] / sdbn['examined'] #2sdbn = sdbn.sort_values('grade', ascending=False)sdbn

输出

doc_id          clicked examined    grade97360810042     412.0   642.0       0.641745400192926087    62.0    129.0       0.48062097363560449     96.0    243.0       0.39506297363532149     42.0    130.0       0.32307793624956037     41.0    154.0       0.26623447875842328     367.0   1531.0      0.239713...

从清单 11.10的输出中,请注意最上面的结果,即蓝光电影 ( doc_id=97360810042),其检查数 (642) 远多于原声带 CD(doc_id=400192926087有 129 个检查)。蓝光的等级更可靠,因为它有更多的机会获得点击。它不太可能被嘈杂、虚假的点击声所主导。另一方面,CD 的检查要少得多。鉴于蓝光光盘的数据点比数据更有限的 CD 更可靠,难道不应该对蓝光光盘的相关性等级进行更高的权衡吗?

通常这种情况更加严峻。考虑查询blue ray。您会注意到这是 的常见拼写错误blu-ray。作为一个常见的错误,它可能会将审查数量较少的文件与收到的文件很少混合在一起。

在清单 11.11中,我们计算 的 SDBN 统计数据blue ray。

清单 11.11。SDBN 判断针对典型的躯干或长尾查询,几乎没有点击数据来构建判断。

QUERY='blue ray'sdbn_sessions = sessions[sessions['query'] == QUERY]sdbn_sessions = sdbn_sessions[sdbn_sessions['sess_id'] < 50050] #1sdbn_sessions = sdbn_sessions.set_index('sess_id')last_click_per_session = sdbn_sessions.groupby(['clicked', 'sess_id'])[[CA]'rank'].max()[True] #2sdbn_sessions['last_click_rank'] = last_click_per_session #2sdbn_sessions['examined'] = sdbn_sessions['rank'] <=[CA]sdbn_sessions['last_click_rank'] #2sdbn = sdbn_sessions[sdbn_sessions['examined']].groupby('doc_id')[[CA]['clicked', 'examined']].sum() #2sdbn['grade'] = sdbn['clicked'] / sdbn['examined'] #2sdbn = sdbn.sort_values('grade', ascending=False)sdbn

输出

doc_id          clicked examined    grade600603132872    1.0         1.0         1.000000827396513927    14.0    34.0        0.41176525192073007     8.0     20.0        0.400000885170033412    6.0     19.0        0.315789600603141003    8.0     26.0        0.30769224543672067     8.0     27.0        0.296296813774010904    2.0     7.0         0.285714...

看看清单 11.11的输出,我们发现一些令人不安的事情。就像我们幸运的少年棒球运动员的最极端的情况一样,最相关的结果 doc600603132872在仅由一名用户检查后获得 1 级(完全相关)!这个 1 分胜过下一个结果,下一个结果基于 34 次检查,得分为 0.411。当您将 doc 视为600603132872一组蓝光盒并且827396513927是蓝光播放器时,这感觉更麻烦。我们的主观解释可能会将玩家置于案件之上。第二个结果被检查的事实难道不应该更有意义吗?

我们在这些例子中看到的是置信偏差——当判断列表有许多基于统计上不显着的虚假事件的等级时。我们说这些检查很少的虚假事件的置信度较低,而检查较多的虚假事件的置信度较高。无论您的点击模式如何,您很可能都不是在用户搜索点击流量丰富的 Google 工作。在许多情况下,查询可能只有少量流量。要自动化 LTR,您需要调整训练数据生成以考虑您对数据的信心。

现在您已经了解了低置信度数据的影响,我们可以转向在构建点击模型时应用一些解决方案。

11.3.2 在概率模型置信度之前使用 Beta

我们刚刚看到了由于过于重视低置信度数据而产生的一些问题。如果不根据您对数据的信心来调整模型,您将无法构建可靠的自动化 LTR 系统。我们可以过滤掉这些低可信度的例子,但我们是否可以做一些更聪明的事情呢?在介绍 beta 分布的概念时,我们将在本节中讨论保留所有点击流数据的方法。但首先,让我们讨论为什么使用所有数据优于简单地过滤掉低置信度示例。

我们应该过滤掉低置信度的判断吗?

在我们的点击模型中,我们是否应该删除低置信度的示例?在退回到更成熟的解决方案之前,让我们考虑一下为什么我们不提倡这样做。然后,我们可以通过置信度调整的 SDBN 取得出色的成绩,这有助于我们最大限度地利用所有训练数据。

过滤训练数据(例如低于某些最低检查阈值)会减少您拥有的训练数据量。即使具有合理的阈值,查询的文档通常也会根据幂律分布进行检查。用户非常频繁地检查某些文档,而很少检查绝大多数文档。因此,阈值可能会删除太多好的 LTR 示例,并导致 LTR 模型错过重要模式(请记住,您可能不是 Google!)。即使有阈值,您也会面临如何权衡中等置信度示例与高置信度示例(例如transformers dark of the moon之前的查询)的挑战。

我们主张根据我们对数据的信心来权衡示例,而不是硬性截止。我们将在计算出的相关性等级之前使用 beta 分布来执行此操作,然后我们将缩小范围以应用此解决方案来修复我们的 SDBN 点击模型判断。

使用 beta 分布调整置信度

Beta 分布帮助我们根据概率(而不仅仅是有偏见的事件)从点击和检查中得出结论。然而,在我们直接使用 beta 分布进行判断之前,让我们首先使用一个有趣且更直观的示例来检查 beta 分布的有用性:棒球统计。

在棒球运动中,一名球员的击球率为 0.295,这意味着当该球员击球时,击球的几率大约为 29.5%。但如果我们想知道“九月下雨天在芬威球场击球的球员的击球率是多少”,我们可能没有什么信息可以继续。球员可能只在这种情况下击球几次。也许在这种情况下他们 3 次尝试命中 2 次。所以我们可以得出结论,他们在这些情况下的击球率是2/3或 0.67。现在我们知道这个结论是错误的:我们真的认为仅根据 3 次击球机会就可以得出结论,该球员的击球几率高得令人难以置信,高达 66.7%?更好的方法是使用 0.295 的总体击球率作为初始信念,随着我们逐渐获得更多有关“芬威球场九月雨天”击球数的数据,慢慢地偏离该假设。

Beta 分布是一种用于管理信念的工具。它将概率(如击球率或判断力)转换为两个值,a并将b该概率表示为分布。和值可以解释为a:b

a,成功次数:我们观察到的击球数、击球数、检查次数b,失败次数:我们观察到的没有安打的击球次数,没有点击次数的检查次数

对于 beta 分布,该属性mean = a / (a+b)成立,其中mean是初始点值,如击球率。给定 a mean,请注意我们可以找到许多满足 的a和值。毕竟也是如此等等。然而,每个都代表不同的贝塔分布。当我们继续前进时,请记住这个属性。bmean = a / (a+b)0.295 = 295 / (295 + 705)0.295 = 1475 / (1475 + 3525)

让我们将这些部分放在一起,看看 beta 分布如何防止我们根据虚假的点击(或击球)数据得出结论。

我们可以声明我们对任何文档的相关性等级的最初信念为0.125。这类似于宣布棒球运动员的击球率是0.295我们对其表现的最初信念。我们可以使用 beta 分布来更新特定案例的初始信念,例如“九月下雨天的芬威公园”或特定文档与搜索查询的相关性。

第一步是选择一个a能够b体现我们最初信念的。对于我们的相关性案例,我们可以选择许多满足 的 a 和 b 0.125=a/(a+b).。也许我们选择a=2.5,b=17.5没有点击的文档作为我们的相关性信念,绘制此图,我们将看到图 11.9 中的分布。

图 11.8。相关性等级为 0.125 的 Beta 分布。平均值对应于我们的默认相关性等级。

现在我们可以观察当我们第一次单击文档时会发生什么,将该文档的值增加到a3.5。在图 11.10 中,我们有a=3.5,b=17.5.

图 11.9。添加一次点击后相关性等级的 Beta 分布,现在等级为 0.1666。

更新后的分布的新平均相关性等级现在3.5/(17.5+3.5)为 0.16666,在第一次点击时有效地将初始信念“拉高”一点。如果没有 Beta 版发行版,该文档将经过 1 次点击和 1 次检查,从而得到 1 级。

我们将“起点”概率分布(选择的a和b)称为先验分布或只是先验。这是我们对我们认为将会发生的事情的最初信念。更新后的分布a和b特定情况(例如文档)是后验分布或只是后验分布。这是我们更新的信念。

回想一下,我们之前说过可以选择许多初始值a和值。b这与初始值的大小具有重要意义a,b并使我们的先验值变弱或变强。我们可以为a和bwhere选择任何值a / (a+b) = 0.125。但请注意如果我们选择一个非常小的值会发生什么a=0.25,b=1.75。然后我们通过将其增加 1 来进行更新。a后验分布的新期望值为1.25 / (1.25+1.75)or ~ 0.416。只需单击一下即可产生重大影响。相反,使用非常高的a并且b会使先验如此强大以至于几乎不会改变。因此,当我们使用 beta 分布时,您需要调整先验的大小,以便更新达到预期的效果。

现在您已经在实践中看到了这个用于捕获 SDBN 等级的方便工具,让我们看看 beta 分布如何帮助解决我们的 SDBN 置信度问题。

在 SDBN 点击模型中使用 Beta 先验

让我们通过使用 beta 发行版更新 SDBN 点击模型来结束这一章。当然,如果您使用其他点击模型,例如本章前面提到的模型,您将需要反思在这些情况下如何解决置信度问题。测试版发行版也可能是一个有用的工具。

如果您还记得的话,SDBN 的输出是每个文档的clicks和 的计数。examines在清单 11.12中,我们从清单 11.11中获取了计算blue ray查询的 SDBN 的信息。我们将选择先前的等级0.3与我们的 SDBN 模型一起使用。当我们没有有关文档的信息时,这是我们的默认等级 - 可能来自我们在判断中看到的典型等级。然后,我们使用该先前等级计算先前的 beta 分布 (prior_a和prior_b)。

清单 11.12。使用初始默认等级 0.3 计算先验 beta 分布

PRIOR_GRADE=0.3 #1PRIOR_WEIGHT=100  #2sdbn['prior_a'] = PRIOR_GRADE*PRIOR_WEIGHT   #3sdbn['prior_b'] = (1-PRIOR_GRADE)*PRIOR_WEIGHT    #3

输出

doc_id          clicked         examined   grade       prior_a prior_b600603132872    1.0      1.0        1.000000    30.0    70.0827396513927    14.0     34.0       0.411765    30.0    70.025192073007     8.0      20.0       0.400000    30.0    70.0885170033412    6.0      19.0       0.315789    30.0    70.0...

在清单 11.12中,权重为 100,您可以确认PRIOR_GRADE = prior_a / (prior_a + prior_b)as30 / (30+70)为 0.3。所以这已经捕获了我们先验的初始概率分布。

接下来,在清单 11.13中,我们需要计算后验分布和相应的相关性等级。我们通过增加prior_a点击次数(我们的“成功”)和prior_b没有点击的检查(我们的“失败”)来做到这一点。最后我们计算更新后的成绩beta_grade。

清单 11.13。计算相关性等级的后验 beta 分布

sdbn['posterior_a'] = sdbn['prior_a'] +  sdbn['clicked'] #1sdbn['posterior_b'] = sdbn['prior_b'] + (sdbn['examined'] -[CA]sdbn['clicked']) #2sdbn['beta_grade'] = sdbn['posterior_a'] / (sdbn['posterior_a'] +[CA]sdbn['posterior_b']) #3sdbn.sort_values('beta_grade', ascending=False)

输出(截断prior_a并prior_b省略,见上文):

doc_id          clicked examined    grade      ... posterior_a posterior_b[CA]beta_grade827396513927    14.0    34.0        0.411765   ... 44.0        90.0[CA]0.32835825192073007     8.0     20.0        0.400000   ... 38.0        82.0[CA]0.316667600603132872    1.0     1.0         1.000000   ... 31.0        70.0[CA]0.306931885170033412    6.0     19.0        0.315789   ... 36.0        83.0[CA]0.302521600603141003    8.0     26.0        0.307692   ... 38.0        88.0[CA]0.30158724543672067     8.0     27.0        0.296296   ... 38.0        89.0[CA]0.299213813774010904    2.0     7.0         0.285714   ... 32.0        75.0[CA]0.299065...

在清单 11.13的输出中,请注意我们通过对 进行排序得到的“蓝光”的新理想结果beta_grade。beta_grade聚类更接近之前的等级 0.3。值得注意的是,我们的蓝光盒已滑至第三个最相关的位置 - 单击一次不会将等级推高到 0.3 以上。

当我们在图 11.11 和 11.12 中重复这种计算判断时dryer,transformers dark of the moon我们注意到顺序是相同的,但是等级本身更接近先验值 0.3,具体取决于我们对数据的置信度。

图 11.10。Beta 调整后的 SDBN 的理想结果dryer。

图 11.11。Beta 调整后的 SDBN 的理想结果transformers dark of the moon。

检查图 11.12 可以明显看出,与没有建模置信度的 SDBN 判断(图 11.10)相比,对音轨的置信度较低。等级从0.48下降到0.4。值得注意的是,CD 之后的 DVD 等级没有太大变化,只是从 0.39 变为 0.36,因为我们对这一观察结果有更高的信心。

您的大多数查询不会像dryeror 那样transformers dark of the moon。他们会更像blue ray。为了在 LTR 中有意义地处理这些查询,您需要能够处理这些“小数据”问题,例如置信度较低。

我们开始拥有更合理的自动化 LTR 训练集,但仍有工作要做。在下一章中,我们将研究完整的搜索反馈循环。这包括解决呈现偏差问题。回想一下,这是一种偏见,即用户从不检查搜索结果永远不会返回给他们!我们如何为自动 LTR 反馈循环添加监视,以克服呈现偏差并确保我们的模型(以及扩展的判断)按预期工作?但在我们在下一章中讨论这些主题之前,让我们重新回顾一下 LTR 模型的训练,并邀请您尝试一下迄今为止所学到的知识。

11.4 探索 LTR 系统中的训练数据

做得好!您已经完成了第 10 章和第 11 章。您现在已经具备了开发合理的 LTR 训练数据和训练 LTR 模型所需的条件。您可能渴望从您的工作中训练模型。我们没有在这里重复第 10 章中的大量代码,而是创建了一个列表 xy 笔记本,以允许您在 RetroTech 数据上试验 LTR。

在此笔记本中,您可以微调内部 LTR 引擎 - 尝试满足训练数据的特征工程和模型创建。您还可以探索更改该引擎的自动输入的影响:训练数据本身。总而言之,这本笔记本包含了您到目前为止所学到的每一个步骤:

使用 SDBN 点击模型和 beta 先验将原始点击会话数据处理为判断。将数据框转换为Judgments我们在第 10 章中使用的数据框。加载一系列 LTR 功能以与 Solr LTR 插件一起使用。从 Solr 记录这些特征,然后将数据成对转换为合适的训练集训练并上传模型。正在寻找!

在 Markdown 中,您将看到“What you should play with”作为调优邀请,如图 11.13 所示:

图 11.12。探索完整 LTR 系统的笔记本。您可以将该模型进行试驾。

我们邀请您调整点击模型参数,考虑新功能以及达到最终 LTR 模型的不同方法,发现哪些模型似乎能产生最佳结果。当您进行此调整时,请务必与数据显示的内容相比质疑您自己的主观假设!

通过开箱即用的调整,我们给您留下图 11.14,显示了查询的当前搜索结果transformers dvd。在这里尝试不同的查询。如何帮助模型更好地区分相关文档和不相关文档?您遇到的问题是由于使用的训练数据造成的吗?或者是用于构建模型的特征?

图 11.13。训练有素的模特队伍transformers dvd。您认为您可以改进这一点吗?

在下一章中,我们将通过对模型进行监视来完善自动化 LTR 系统。最关键的是,我们将考虑如何克服呈现偏差。即使进行了本章中的调整,用户仍然只有机会根据搜索显示的内容采取行动。因此,我们的反馈循环仍然受到当前相关性排名的严重影响。我们怎样才能发现这个问题并克服它呢?在下一章中,我们将在 LTR 模型与现实生活中的用户交互时考虑这些问题。

11.5 总结如果我们能够使用点击模型可靠地将用户点击数据转换为相关性判断,我们就可以自动化排名学习(LTR) 。然而,点击模型本身必须使用 A/B 测试或其他形式的测试进行评估,以确保自动化 LTR 系统的可靠性。习得(隐式)相关性判断列表可以插入现有的学习中,对训练过程进行排名,以取代或增强手动创建的判断。由于算法对搜索结果进行排名和向用户呈现搜索结果的方式存在常见偏差,因此在自动 LTR 模型中,原始点击通常会出现问题在可见的搜索结果中,位置偏差表示用户更喜欢排名靠前的结果。我们通过使用点击模型来克服位置偏差,该模型跟踪用户检查文档或搜索结果中的位置的概率。大多数搜索应用程序都有大量虚假点击数据。当训练数据偏向这些虚假结果时,我们就会产生置信偏差。我们可以通过使用 beta 分布创建一个先验模型来克服置信偏差,当新的观察结果出现时,我们会逐渐更新该先验模型。

标签: #js 点击元素