第 123 题:ID特征的哈希冲突,特征哈希 vs 特征嵌入的内存权衡?
题目
ID特征的哈希冲突,特征哈希 vs 特征嵌入的内存权衡?
完整讲解
一、ID 特征与高基数
用户 ID、物品 ID、请求 ID 等高基数类别特征,若 one-hot 或纯嵌入表,参数量为「基数 × 嵌入维度」,内存与训练成本高,且长尾 ID 样本少、嵌入难学准。特征哈希与特征嵌入是两种常用方案,各有内存与精度权衡。
二、特征哈希(Hashing)
- 做法:将 ID 映射到固定大小的桶,$h(\text{id}) \bmod B$,得到桶索引 $b \in [0, B-1]$,再对桶做嵌入(共 $B$ 个嵌入向量)。冲突:不同 ID 可能落入同一桶,共享同一嵌入,即哈希冲突。
- 优点:内存固定 $O(B \cdot d)$,与 ID 基数无关;可控制内存上限;实现简单、无需预知全量 ID。
- 缺点:冲突导致不同 ID 共享表示,表达力下降、可能负向;冲突率约 $1/B$ 量级(生日悖论下实际冲突比理论略高),$B$ 小则冲突多。
三、特征嵌入(Embedding Table)
- 做法:为每个 ID 分配独立嵌入向量,即嵌入表大小 = 基数 × $d$。无冲突、表达力最强。
- 优点:无冲突、每个 ID 可学独立表示;长尾 ID 可通过预训练或冷启动策略补足。
-
| 缺点:内存 $O( |
\text{Vocab} |
\cdot d)$,高基数时巨大;新 ID 需动态扩展或映射到「未登录」嵌入。 |
四、内存与冲突的权衡
- 小内存、可接受一定冲突:用哈希、$B$ 取百万级或千万级,监控冲突率与指标;可多哈希(多个 $h_1,h_2$)取不同桶做多嵌入再融合,缓解单桶冲突。
- 追求精度、内存允许:用完整嵌入表;或「高频 ID 嵌入 + 长尾哈希」混合。
- 经验:$B$ 约为预估唯一 ID 数的 1~2 倍可压低冲突;若指标对冲突敏感,优先增大 $B$ 或改用嵌入表+动态扩展。
面试要点
- 能说明特征哈希:ID→桶索引→桶嵌入,内存 $O(B\cdot d)$;冲突即不同 ID 同桶共享嵌入。
-
| 能对比嵌入表:无冲突、内存 $O( |
\text{Vocab} |
\cdot d)$;哈希省内存但冲突损表达。 |
- 能说清选型:内存紧用哈希并调 $B$、多哈希;追求精度用嵌入或混合;可监控冲突率。
记忆要点
- 特征哈希:固定 $B$ 桶、内存可控;冲突=多 ID 同桶、表达力降。
- 嵌入表:无冲突、表达力强;内存与基数成正比。
- 权衡:小内存用哈希、调 $B$ 或多哈希;大内存/高精度用嵌入或高频嵌入+长尾哈希。