基于哈希的嵌入是一种将分类数据(如单词或 ID)转换为机器学习模型可用的数值向量的技术。 与为每个可能的类别分配唯一的嵌入向量(需要存储大型查找表)不同,基于哈希的嵌入使用哈希函数将类别直接映射到固定大小的嵌入表中的索引。 这种方法减少了内存使用,并且可以优雅地处理未见类别(词汇表外标记),因为哈希函数可以将任何输入映射到有效的索引。 例如,单词“apple”可能会被哈希到索引 42,而“orange”可能会被哈希到索引 15,两者都在预定义的表大小(如 1000)内。 这种方法通常被称为“哈希技巧”。
该过程首先定义一个具有固定数量的槽的嵌入表(例如,1000)。 当遇到一个类别(如单词)时,哈希函数(如 SHA-1 或更简单的非加密哈希)会计算出一个数值。 然后使用模运算将该值映射到表中的索引。 例如,对“apple”进行哈希处理可能会产生 1042,模 1000 后变为索引 42。 然后,模型在训练期间检索或更新该索引处的嵌入向量。 一个关键的权衡是多个类别可能会冲突到同一个索引,从而导致共享嵌入。 然而,在实践中,模型通常可以有效地处理冲突,特别是当嵌入维度足够高时,允许网络学习鲁棒的表示,尽管存在重叠。
基于哈希的嵌入在具有大型或动态词汇表的场景中特别有用,例如处理用户生成的文本或处理频繁出现的新类别。 例如,在垃圾邮件检测系统中,不断出现新的电子邮件发送者或域,基于哈希的嵌入避免了为未见条目重建嵌入表的需要。 像 TensorFlow 和 PyTorch 这样的框架通过 tf.feature_column.hashed_column
或自定义哈希层等工具支持这一点。 然而,固定表大小需要平衡:太小的表会增加冲突风险,而非常大的表会抵消内存节省。 开发人员经常尝试表大小和哈希函数,以针对其特定任务进行优化,并在不要求精确唯一性的情况下优先考虑效率。