Vowpal Wabbit 可能发生哈希冲突
Vowpal Wabbit possible hash collision
我有一个在 VW 中生成的模型,我还在同一数据上生成了两个可读模型(第一个使用“--readable_model”参数,第二个使用“--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,因此模型应为 'stable'.
vw
允许散列冲突(故意)
这在文献中被称为"the hash trick"。
从大量特征中学习时出现特征散列冲突不被认为是错误,因为少量的冲突很少会对学习产生不利影响。在许多情况下,较小的碰撞率甚至可能有助于降低泛化误差。
忽略碰撞有什么好处?
由于不需要以特殊方式处理冲突,哈希技巧的一个明显优势是学习速度要快得多。
碰撞不会让学习变得更糟吗?
哈希冲突只是创建(随机)冲突特征子集的混合体。只要冲突的子集是完整特征集的一小部分(当 hash-space 足够大时可以预期),这些冲突充当随机形式的正则化并且经常(尽管不总是) ) 有助于避免过度拟合。
如果我的散列太小怎么办-space(冲突太多)?
如果你有超过 300k 个特征,那确实是一个极端的情况。 300k 大于默认的 hash-space 大小 (2^18 = 262144)
所以碰撞部分不再小。在这种情况下,您应该通过增加 -b <bits>
来增加散列 space,其中 <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
我有一个在 VW 中生成的模型,我还在同一数据上生成了两个可读模型(第一个使用“--readable_model”参数,第二个使用“--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,因此模型应为 'stable'.
vw
允许散列冲突(故意)
这在文献中被称为"the hash trick"。
从大量特征中学习时出现特征散列冲突不被认为是错误,因为少量的冲突很少会对学习产生不利影响。在许多情况下,较小的碰撞率甚至可能有助于降低泛化误差。
忽略碰撞有什么好处?
由于不需要以特殊方式处理冲突,哈希技巧的一个明显优势是学习速度要快得多。
碰撞不会让学习变得更糟吗?
哈希冲突只是创建(随机)冲突特征子集的混合体。只要冲突的子集是完整特征集的一小部分(当 hash-space 足够大时可以预期),这些冲突充当随机形式的正则化并且经常(尽管不总是) ) 有助于避免过度拟合。
如果我的散列太小怎么办-space(冲突太多)?
如果你有超过 300k 个特征,那确实是一个极端的情况。 300k 大于默认的 hash-space 大小 (2^18 = 262144)
所以碰撞部分不再小。在这种情况下,您应该通过增加 -b <bits>
来增加散列 space,其中 <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