为何Contextual Bandit模型在训练集上预测动作与训练动作不符?
为什么Vowpal Wabbit上下文老虎机模型在训练集上的预测动作与训练时记录的动作不一致?
这是Contextual Bandit(上下文老虎机)算法的正常行为,核心原因是这类模型的目标不是拟合训练数据中的历史动作,而是学习能最小化长期成本的最优策略,具体解释如下:
Contextual Bandit与监督学习的本质区别
监督学习以“复刻训练标签”为目标,但Contextual Bandit的训练逻辑完全不同:它通过历史动作的反馈(成本/奖励)来调整策略,让模型学会在给定上下文下选择**成本最低(或奖励最高)**的动作,而非记住训练时选过的动作。训练数据中的动作是“历史探索行为”,而非最优解
你训练数据里的动作是过去某次选择的结果(可能是随机探索、旧策略输出,甚至是错误选择):- 比如第一条训练数据中
action=1对应的成本是2(训练集中最高成本),模型学习后会判断“在这个上下文下选动作1代价太高”,因此预测时会优先选择成本更低的动作(比如你截图里的动作3); - 反之,像第二条数据
action=3成本为0,模型会提升这个动作在对应上下文下的优先级。
- 比如第一条训练数据中
训练过程是策略优化,而非记忆
调用model.learn()时,VW会根据action:cost:probability的反馈更新每个动作的估值:- 高成本动作的估值会被降低,后续预测时被选中的概率变小;
- 低成本动作的估值会被提升,更容易被选中。
最终预测的是当前模型认为的最优动作,和训练时的历史动作没有必然关联。
测试集结果符合教程是正常的
教程的测试集是用来验证模型学到的策略是否符合预期(比如在特定上下文下选择最优动作),和训练集的历史动作无关,所以结果一致说明你的模型训练流程是正确的。
额外验证建议
如果想直观看到模型对每个动作的估值,可以改用--cb_explore 4初始化模型,此时predict会返回每个动作的预估得分(得分越低代表成本越低),你能清楚看到模型为什么会避开训练时的高成本动作。
内容的提问来源于stack exchange,提问作者bkowshik
相关产品推荐
相关产品推荐

