Machine learning Vowpal Wabbit可能的哈希冲突

Machine learning Vowpal Wabbit可能的哈希冲突,machine-learning,hash,vowpalwabbit,Machine Learning,Hash,Vowpalwabbit,我在VW中生成了一个模型,我还在相同的数据上生成了两个可读的模型(第一个带有'--readable_model'arg,第二个带有'--invert_hash')。当我在测试数据集上运行模型并使用--audit选项时,与上面提到的可读模型中报告的权重相比,某些特性的报告权重略有不同。例如,这里是在train.data上训练的可读模型的一部分: 213006:-0.19007 213008:-0.692261 213009:-0.203193 如您所见,索引为213008的特征的权重为-0.69

我在VW中生成了一个模型,我还在相同的数据上生成了两个可读的模型(第一个带有'--readable_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的特性,这有可能是由一些散列冲突引起的吗?但是如果有哈希冲突,Wabbit不应该报告这个吗?如您所见,测试时使用了选项-t,因此模型应该是“稳定的”。

vw
允许散列冲突(故意的) 这在文献中被称为“散列技巧”

当从大量特征学习时,不认为特征哈希冲突是错误的,因为少量冲突很少对学习产生不利影响。在许多情况下,较小的碰撞率甚至有助于降低泛化误差

忽略碰撞有什么好处? 由于不需要以特殊的方式处理冲突,哈希技巧的一个明显优点是学习速度更快

碰撞不会让学习变得更糟吗? 散列冲突只是创建(随机)冲突特征子集的混合。只要碰撞子集是整个特征集的一小部分(当散列空间足够大时可以预期),这些碰撞就可以作为一种随机形式的正则化,并且通常(尽管并非总是)有助于避免过度拟合

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

我怎么知道碰撞是否太多? 渐进式验证错误是由vw在学习过程中打印出来的,它应该能很好地提示您的数据集的最佳
-b
值是多少

您也可以尝试使用以下方法搜索最佳值:

    # 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

回答如下,但给定
-t
,审计输出和可读模型输出之间的权重差异令人惊讶,可能是一个bug。如果您在模型中加载了
-i
,我建议您在github上报告一个完全可复制的示例(完整的数据集和完整的命令行),作为一个新问题。你应该使用一个较小的数据集和一个较低的-b来引发冲突。@arielf我试着将-b参数改为19(2^19比我拥有的数字功能多),它确实有帮助,很可能这就是问题所在。对于300k功能,您可能需要进一步增加
-b
-b 19
仅将空间增加一倍,并且由于散列是随机的,因此可能仍然存在许多冲突。我至少会试试
-b22
。显然,这会使模型更大,并且会减慢保存模型文件的速度。非常感谢。我试着将-b参数设置为19,这应该允许524k特性,这很有帮助。正如您在回答中提到的,超过300k的特征意味着18位空间中的碰撞特征部分非常重要,我是如何从“散列碰撞只是创建(随机)碰撞特征子集的混合”这句话中理解的,这是否意味着更多的特征必须“共享一个权重”?@JanMusil yes。当出现散列冲突时,两个独立的特征共享相同的权重,因此可以得到这两个特征的混合效果。