【问题标题】:Vowpal Wabbit possible hash collisionVowpal Wabbit 可能的哈希冲突
【发布时间】:2019-06-30 17:09:18
【问题描述】:

我有一个在 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 的特征,这可能是由一些哈希冲突引起的吗?但是如果有哈希冲突,Vowpal Wabbit 不应该报告这个吗?如您所见,在测试时使用了选项 -t,因此模型应该是“稳定的”。

【问题讨论】:

  • 答案在下面,但鉴于-t,审计输出和可读模型输出之间的权重差异令人惊讶,可能是一个错误。如果您使用 -i 加载模型,我建议在 github 上使用完全可重现的示例(完整数据集和完整命令行)报告此问题作为新问题。您应该使用较小的数据集和较低的 -b 来引发冲突。
  • @arielf 好吧,我尝试将 -b 参数更改为 19(2^19 比我拥有的数字功能还多),它确实有帮助,所以很可能这是个问题。
  • 使用 300k 功能,您可能需要进一步增加 -b -b 19 只会将空间增加一倍,并且由于哈希是随机的,您可能仍然会遇到很多冲突。我至少会尝试-b 22。显然这会使模型变得更大,并且会减慢保存模型文件的速度。

标签: machine-learning hash vowpalwabbit


【解决方案1】:

vw 允许哈希冲突(故意)

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

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

忽略碰撞有什么好处?

由于不需要以特殊方式处理冲突,哈希技巧的一个明显优势是学习速度更快。

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

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

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

如果你有超过 300k 的特征,那确实是一个极端的例子。 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

【讨论】:

  • 非常感谢。好吧,我尝试将 -b 参数设置为 19,这应该允许 524k 功能并且它有所帮助。正如您在回答中提到的,超过 300k 的特征意味着 18 位空间中的部分碰撞特征非常重要,我如何从句子“哈希碰撞简单地创建(随机)碰撞特征子集的混合”中理解它,这是否意味着更多功能必须“共享一个权重”?
  • @JanMusil 是的。当发生哈希冲突时,两个独立的特征共享相同的权重,因此您会得到两者的混合效果。
猜你喜欢
  • 2023-03-06
  • 2013-12-15
  • 2015-11-14
  • 1970-01-01
  • 2012-11-07
  • 2019-06-18
  • 2016-07-30
  • 1970-01-01
  • 2018-01-20
相关资源
最近更新 更多