Vowpal Wabbit可能的哈希冲突

时间:2019-02-06 17:01:08

标签: machine-learning hash vowpalwabbit

我有一个在VW中生成的模型,并且我还对同一数据生成了两个可读模型(第一个带有'--ready_model'arg,第二个带有'--invert_hash')。当我在测试数据集上运行模型并使用--audit选项时,某些功能的报告权重与上述可读模型中报告的权重相比略有不同。例如,这是在train.data上训练的可读模型的一部分:

213006:-0.19007
213008:-0.692261
213009:-0.203193

如您所见,索引为213008的要素的权重为-0.692261 但是当我在test.data上使用-t选项并使用--audit选项运行模型时,审计输出中的权重会有所不同:

-3.962444   q^featureXY:213008:1:-0.756017

是什么原因造成的?我有超过300k的功能,这可能是由于哈希冲突引起的吗?但是,如果存在哈希冲突,Vowpal Wabbit不应报告此情况吗?如您所见,测试时使用了-t选项,因此模型应该是“稳定的”。

1 个答案:

答案 0 :(得分:1)

vw允许哈希冲突(故意)

这在文献中被称为“哈希技巧”

从大量特征中学习时,具有特征哈希冲突不被认为是错误,因为少量冲突很少会对学习产生不利影响。在许多情况下,较小的冲突率甚至可以通过降低泛化误差来提供帮助。

忽略碰撞有什么好处?

由于无需以特殊方式处理碰撞,因此哈希技巧的明显优势是学习速度更快。

碰撞不会使学习变得更糟吗?

哈希冲突只是创建(随机)碰撞特征子集的混合。只要碰撞子集是整个功能集的一小部分(当哈希空间足够大时就可以预期),这些冲突就可以作为随机化的正则化形式,并且经常(尽管并不总是)有助于避免过度-配件。

如果我的哈希空间太小(冲突太多)怎么办?

如果您拥有超过30万个功能,那确实是一个极端的情况。 300k大于默认哈希空间大小(2^18 = 262144),因此冲突部分不再小。在这种情况下,您应该通过增加-b <bits>(其中<bits>高于默认18)来增加哈希空间。

如何知道我是否发生了太多碰撞?

vw打印的渐进式验证错误应该为您提供最佳的-b数据集最佳值提示。

您也可以尝试使用vw-hypersearch来搜索最佳值:

    # find the best average loss when using between 19 and 26 bits hash-space
    vw-hypersearch 19 26 vw -b % [other-vw-options...] -d data-set