我在VW中生成了一个模型,并且在相同的数据上生成了两个可读模型(第一个使用’–readable_model’参数,第二个使用’–invert_hash’)。当我在测试数据集上运行我的模型并使用–audit选项时,一些特征的报告权重与上述提到的可读模型中的权重略有不同。例如,这是基于train.data训练的可读模型的一部分:
213006:-0.19007213008:-0.692261213009:-0.203193
如您所见,索引为213008的特征的权重为-0.692261。但是,当我在test.data上使用-t选项并带有–audit选项运行我的模型时,一些权重在审计输出中有所不同:
-3.962444 q^featureXY:213008:1:-0.756017
这是什么原因引起的?我有超过30万个特征,这是否可能由某种哈希冲突引起?但如果存在哈希冲突,Vowpal Wabbit不应该报告这一点吗?如您所见,测试时使用了-t选项,因此模型应该是“稳定”的。
回答:
vw
允许哈希冲突(有意为之)
这在文献中被称为“哈希技巧”。
在从大量特征中学习时,特征哈希冲突不被视为错误,因为少量冲突很少对学习产生不利影响。在许多情况下,少量的冲突率甚至可能通过降低泛化误差来帮助学习。
忽略冲突有什么优势?
由于不需要特别处理冲突,哈希技巧的一个明显优势是学习速度更快。
冲突不会使学习变得更差吗?
哈希冲突只是创建了(随机)冲突特征子集的混合。只要冲突的子集在整个特征集中占比很小(当哈希空间足够大时可以预期),这些冲突作为一种随机的正则化形式,通常(尽管并非总是)有助于避免过度拟合。
如果我的哈希空间太小(冲突太多)怎么办?
如果您有超过30万个特征,这确实是一个极端情况。30万大于默认的哈希空间大小(2^18 = 262144)
,因此冲突的部分不再是小的。在这种情况下,您应该通过增加-b <bits>
来增加哈希空间,其中<bits>
应高于默认值18
。
我如何知道我的冲突是否太多?
由vw
在学习过程中打印的渐进验证误差应该能为您提供一个关于数据集最佳-b
值的好提示。
您也可以尝试使用vw-hypersearch
来搜索最佳值,像这样:
# 在19到26位的哈希空间之间找到最佳平均损失
vw-hypersearch 19 26 vw -b % [other-vw-options...] -d data-set