(Vowpal Wabbit)处理新上下文的上下文强盗



最近几天,我正在尝试训练一个上下文强盗算法抛出Vowpalwabbit,所以我正在做一些玩具模型,可以帮助我理解算法的工作原理。

所以我想象了一个有 4 个可能动作的状态,我在两个不同的上下文中训练我的模型。 每个上下文在 4 个操作中只有一个最佳操作。

我就是这样做的。

vw = pyvw.vw("--cb_explore 4 -q UA --epsilon 0.1")
vw.learn('1:-2:0.5 | 5')
vw.learn('3:2:0.5 | 5')
vw.learn('1:2:0.5 | 15')
vw.learn('3:-2:0.5 | 15')
vw.learn('4:2:0.5 | 5')
vw.learn('4:2:0.5 | 15')
vw.learn('2:2:0.5 | 5')
vw.learn('2:2:0.5 | 15')

因此,对于我的示例,对于他的特征等于 5 的上下文,最佳动作是 2,对于另一个,最佳动作是 3。

当我在这两个上下文上预测时,没有问题,因为算法已经满足了它们一次,并且得到了奖励条件他的选择。

但是当我到达一个新的上下文时,我希望算法能够使我成为最相关的操作,例如通过考虑上下文特征的相似性。

例如,如果我给出一个等于 29 的特征,我希望得到操作 3,因为 29 比 5 更接近 15。

所以我现在的审讯。

谢谢!

问题在于您构建功能的方式。要素的输入格式定义为name[:value],如果未提供值,则默认值为 1.0。因此,您提供的是一个名称为515的功能。对功能名称进行哈希处理,并用于确定功能的索引。因此,在您的案例中,特征5和特征15的值均为 1.0,并且是具有不同索引的不同特征。

因此,要解决您的问题,您只需为您的功能命名即可。

vw.learn('1:-2:0.5 | my_feature_name:5')
vw.learn('1:2:0.5 | my_feature_name:15')

您可以在此处阅读有关输入格式的更多信息。

另外,我想指出的是,-q UA在您的示例中没有执行任何操作,因为您没有命名空间。可以通过将命名空间放在栏旁边来指定命名空间。以下示例有两个命名空间,A 和 B.(注意:如果命名空间使用多个字符,则只有第一个字符与-q一起使用(

1:-2:0.5 |A my_feature_name:5 |B yet_another_feature:4

在这种情况下,如果我们提供了-q AB,那么大众将在运行时为 A 和 B 中的每对特征创建一个新功能。这允许您在大众学习的表示中表达更复杂的交互。

相关内容

  • 没有找到相关文章