如何在真实的在线模式中演示Vowpal Wabbit的上下文强盗?

时间:2018-01-10 18:34:55

标签: vowpalwabbit

根据可用的文档和资源,如何完成一个简单的入门流程并不是很清楚,你可以将Vowpal Wabbit作为一个守护进程启动(甚至可能没有任何预先学习的模型)并让它在线学习和探索 - 我正在寻找一个流程,我会在上下文中提供信息,获取建议,并反馈成本/奖励。

因此,让我跳过已经尝试过的技术描述,并简单地要求明确证明我可能认为必不可少的东西 -

  • 如何通过守护进行演示,学习正在进行,而不是在批处理数据的离线模式下,而是纯粹来自在线互动?有什么好的建议吗?
  • 如何在守护程序模式下报告选定操作后的成本/奖励?每次行动一次?散装?无论哪种方式,怎么样?
  • 有点相关 - 你会推荐一个使用守护进程的实时系统,用于上下文强盗吗?或者更确切地说是一些语言API?
  • 您是否可以指出服务器代码位于巨大的代码库中的位置?它可以是一个开始系统探索的好地方。

我通常会获得一个分发(允许操作数量的大小)作为每个发送输入的回复。通常是相同的分布,无论我发送什么。也许它需要一个完整的学习时代与默认的--cb_explore算法,我不知道,并且不确定纪元持续时间可以从外部设置。

据我所知,已经投入了大量资源来帮助学习过去的交互和来自cbfied数据。但是我认为应该有一些可用的解释清除上面那些或多或少的实用主义要点。

非常感谢!

1 个答案:

答案 0 :(得分:3)

有它。该流程仅需要Vowpal Wabbit输入格式的子集。成功安装后首先,我们开始使用Vowpal Wabbit守护进程:

vw --cb_explore 2 --daemon --port 26542 --save_resume

在上文中,我们告诉VW启动一个服务守护进程的Contextual Bandit模型,而没有通过旧策略数据提供任何前期培训。该模型将是大众的默认上下文强盗模型,它将假设如上所述,只有两个动作可供选择。 Vowpal最初将随机分配建议的操作,并随着时间的推移接近最优策略。

让我们检查守护程序是否已启动:pgrep 'vw.*'应返回进程列表。

如果我们想要停止守护进程并再次启动它,我们只需pkill -9 -f 'vw.*--port 26542'

现在让我们模拟所采取行动的决策点和成本。在下文中,我使用终端方式将消息分派给守护程序,但您可以使用postman或您自己的代码之类的工具来执行此操作:

echo " | a b " | netcat localhost 26542

在这里,我们告诉Vowpal建议对包含功能集(ab)的上下文采取什么操作。

Vowpal简洁地回复了所选择的行动,但是我们的模型被指示选择的每个动作的预测成本分布如下:

0.975000 0.025000

这些当然只是一些随机初始化的结果,因为它还没有看到任何成本!现在我们使用Vowpal的应用程序预计将根据此分布随机选择 - 这部分不是由Vowpal实现的,而是留给应用程序代码。 Contextual Bandits模型依赖于我们从这个分布中抽样来选择要对环境玩的动作 - 如果我们不遵循这个期望 - 算法可能无法完成它的学习。

所以想象一下,我们从这个发行版中采样,并获得了动作1,然后在真实环境中执行了该动作(对于我们要求Vowpal推荐的相同上下文a b)。想象一下,这次我们回来了0.7。我们必须将这笔费用反馈给Vowpal作为反馈:

echo " 1:0.7:1 | a b " | netcat localhost 26542

Vowpal得到了我们的反馈,并根据这一背景向我们提供了更新的预测:

0.975000 0.025000

我们现在不关心它,除非我们希望再次获得完全相同的建议,但我们仍然会得到更新的建议。

显然它与以前的建议相同,因为到目前为止,我们的单一反馈对于学习任何东西的模型来说还不够。重复多次,对于不同的上下文特征,从Vowpal返回的预测将适应和改变。多次重复此过程并针对许多不同的上下文,模型将根据其学习内容开始转移其预测。

注意我在这里提到成本而不是奖励,因为与Vowpal中实现的算法的大部分文献不同,至少命令行版本将成本视为反馈而非奖励。