(vowpal wabbit) 处理新上下文的上下文强盗
(vowpal wabbit) contextual bandit dealing with new context
最近几天我正在尝试训练一个上下文强盗算法 throw 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。因此,您提供的是名称为 5
或 15
的特征。特征名称被散列并用于确定特征的索引。因此,在您的情况下,特征 5
和特征 15
的值均为 1.0,并且是具有不同索引的不同特征。
因此,要解决您的问题,您只需为您的功能命名。
vw.learn('1:-2:0.5 | my_feature_name:5')
vw.learn('1:2:0.5 | my_feature_name:15')
您可以阅读有关输入格式的更多信息 here。
此外,我想指出 -q UA
在您的示例中没有执行任何操作,因为您没有命名空间。命名空间可以通过将它们放在栏旁边来指定。下面的示例有两个命名空间,A 和 B。(注意:如果多个字符用于命名空间,则只有第一个字符与 -q
一起使用)
1:-2:0.5 |A my_feature_name:5 |B yet_another_feature:4
在这种情况下,如果我们提供 -q AB
,那么 VW 将在运行时为 A 和 B 中的每对特征创建一个新特征。这允许您在 VW 学习的表示中表达更复杂的交互。
最近几天我正在尝试训练一个上下文强盗算法 throw 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。因此,您提供的是名称为 5
或 15
的特征。特征名称被散列并用于确定特征的索引。因此,在您的情况下,特征 5
和特征 15
的值均为 1.0,并且是具有不同索引的不同特征。
因此,要解决您的问题,您只需为您的功能命名。
vw.learn('1:-2:0.5 | my_feature_name:5')
vw.learn('1:2:0.5 | my_feature_name:15')
您可以阅读有关输入格式的更多信息 here。
此外,我想指出 -q UA
在您的示例中没有执行任何操作,因为您没有命名空间。命名空间可以通过将它们放在栏旁边来指定。下面的示例有两个命名空间,A 和 B。(注意:如果多个字符用于命名空间,则只有第一个字符与 -q
一起使用)
1:-2:0.5 |A my_feature_name:5 |B yet_another_feature:4
在这种情况下,如果我们提供 -q AB
,那么 VW 将在运行时为 A 和 B 中的每对特征创建一个新特征。这允许您在 VW 学习的表示中表达更复杂的交互。