使用Softmax Explorer(——cb_explore_adf)在vowpalrabbit中进行排名



我试图使用VW使用上下文强盗框架执行排名,特别是使用--cb_explore_adf --softmax --lambda X。选择softmax是因为,根据大众的文档:"这是一个不同的浏览器,它使用策略不仅预测一个动作,而且预测一个分数,表明每个动作的质量。这个与质量相关的分数是我想用来排名的。

这个场景是这样的:我有一个项目列表[a, B, C, D],我想按照最大化预定义指标(例如,点击率)的顺序对其进行排序。正如我所看到的,其中一个问题是我们无法单独评估这些项,因为我们无法确定哪个项是否让用户点击。

为了测试一些方法,我创建了一个虚拟数据集。作为尝试解决上述问题的一种方法,我使用整个有序列表作为评估点击是否发生的方法(例如,给定用户X的上下文,如果项目是[C, a, B, D],他会点击)。然后,我根据它们在列表中的位置分别奖励它们,例如,0 &lt为reward = 1/P;P & lt;len(列表)。在这里,C、A、B、D的奖励分别是1、0.5和0.25、0.125。如果没有点击,那么所有道具的奖励都是零。这背后的原因是,更重要的项目将稳定在顶部,而不太重要的项目将在底部。

此外,我发现的困难之一是为这种方法定义抽样函数。通常,我们只对选择一个选项感兴趣,但这里我必须采样多次(在示例中为4次)。正因为如此,我不太清楚我应该如何在采样时融入探索。我有一些想法:

  • 复制概率质量函数赋值给copy_pmf。在0和max(copy_pmf)之间画一个随机数,对于copy_pmf中的每个概率值,增加sum_prob变量(非常类似于这里的教程:https://vowpalwabbit.org/tutorials/cb_simulation.html)。当sum_prob > draw时,我们将当前项目/问题添加到列表中。然后,我们从copy_pmf中删除这个概率,设置sum_prob = 0,并在0和max(copy_pmf)之间再次绘制一个新数字(可能会改变或不变)。
  • 另一个选择是绘制一个随机数,如果最大概率,即max(pmf)大于这个数字,我们利用。如果不是,我们对列表进行洗牌并返回这个(探索)。这种方法需要调优lambda参数,该参数控制输出pmf(我见过最大概率为>0.99,这意味着大约1%的探索机会。我也见过最大概率为~0.5的例子,这大约是50%的探索。

我想知道关于这个问题是否有任何建议,特别是抽样和奖励函数。还有,如果我在这里遗漏了什么。

谢谢!

这听起来像是可以通过条件上下文强盗来解决的问题

对于您提到的演示场景,每个示例应该有4个槽。在这种情况下,你可以使用任何一种探索算法每个槽都是独立完成的。学习目标是所有槽的平均损失,但决策是从第一个槽到最后一个槽依次做出的,所以即使在二元奖励的情况下,你也可以有效地学习排名。

最新更新