✨ 要点🔬 技术摘要
想象一下,你正在运营一个服务数十亿人的超大规模、高速图书馆。每当有人索要一本书(视频、帖子或商品)时,你都需要调出该物品的特定“档案卡”,以了解它是什么以及谁可能会喜欢它。这些档案卡被称为嵌入(embeddings) 。
在小型图书馆中,你可以为每一本书分配一个独特的书架。但在拥有数十亿本书的图书馆中,书架数量远远不够。因此,你使用一种哈希技巧 :将书名输入机器,机器便会吐出一个书架编号。
问题:“双重预订”的噩梦
该系统的缺陷在于冲突 。有时,两本完全不同的书会被分配到同一个书架编号。
旧方法 :如果书 A 和书 B 共享一个书架,它们就被迫共用同一张档案卡。系统会感到困惑,误以为一部恐怖电影和一档烹饪节目是相同的,因为它们被挤在了一起。
“陈旧”问题 :更糟糕的是,想象书 A 已经过时,无人再读,但它仍占据着书架。如果一本全新的书 C 被分配到同一个书架,它并非从零开始。它会意外地继承旧书 A 的“幽灵”。新书必须花费所有时间去“遗忘”旧书的坏习惯,然后才能学习新内容。这被称为负迁移 。
解决方案:MPZCH(智能图书管理员)
论文提出了多探针零冲突哈希(Multi-Probe Zero Collision Hash, MPZCH) 。这就像一位超级聪明的图书管理员,绝不允许两本书共享一个书架。
以下是其工作原理,使用简单的类比说明:
1. “前瞻”搜索(线性探测)
当图书管理员收到一本书的请求时,他们不会只检查机器分配的那一个书架。
步骤 1(扫描) :他们快速扫描分配的书架以及随后的几个书架,查看:“这本书已经在这里了吗?”
步骤 2(行动) :
如果书已经在那里,他们只需更新“最后查看”时间。
如果书不在那里,他们寻找空书架。如果分配的书架已满,他们会检查下一个,再下一个,直到找到位置。
结果 :他们持续查找,直到找到唯一的位置,确保零冲突 。每本书都获得自己专属的档案卡。
2. “过期日期”(驱逐)
图书馆的空间有限。你无法永远保留每一本书。
MPZCH 为每本书的档案设置过期时间(TTL) 。
如果一本书有一段时间未被查阅(例如 3 天),图书管理员会将其标记为“陈旧”。
当一本新 书需要书架时,图书管理员不会将其硬塞进已满的书架。相反,他们会找到一本“陈旧”的书,将其扔掉,并将那个崭新、空置的书架交给新书。
关键细节 :当新书获得书架时,图书管理员会彻底擦除白板。他们不仅仅是覆盖旧书的档案,而是完全重置卡片。新书从零开始学习,没有任何过去的“幽灵”。
3. 速度提升(GPU 内核)
你可能会想:“为每本书检查 256 个书架听起来很慢!”
论文解释说,他们使用高速 GPU 芯片 (如游戏机中的芯片)构建了该系统。
他们创建了一条特殊的“流水线”,让成千上万名图书管理员并行工作。
结果 :尽管他们为了规避冲突而检查了更多书架,但速度极快(小于 1 毫秒),用户不会察觉到任何延迟。其速度与旧有的混乱系统一样快。
现实世界成果
该团队在服务于数十亿用户的真实系统(Meta 的推荐引擎)中测试了此方案。
对用户(人们)而言 :他们实现了零冲突 。每位用户都获得了自己唯一的档案。这使得推荐显著更加准确(提升了“观看时长”和“分享”等指标)。
对物品(视频/帖子)而言 :由于他们可以淘汰旧视频并以全新状态开始新视频,系统能更快地学习新内容。
“冷启动”修复 :新视频能更快获得正确推荐,因为它们不再被迫继承旧视频(且无关)的“个性”。
更好的分组 :同一创作者的视频在系统眼中开始显得更加相似,帮助算法立即理解创作者的风格。
总结
简而言之,MPZCH 是一种更智能的方式来组织庞大的数字图书馆。它不再强迫不同物品共享书架并产生混淆,而是为每样东西找到独特的位置。它还不断清理旧内容,以便新物品能够重新开始。其结果是构建了一个更快、更准确、更能理解新内容的推荐系统。
技术摘要:多探针零冲突哈希(MPZCH)
1. 问题陈述
大规模推荐系统依赖嵌入表将高基数分类特征(例如用户 ID、物品 ID)映射为稠密向量表示。然而,随着唯一 ID 数量的增长,传统的基于哈希的索引方法面临两个关键挑战:
嵌入冲突 :由于内存限制,“哈希技巧”将多个不同的 ID 映射到相同的索引。当不相关的用户或物品共享同一个嵌入向量时,会混淆它们的语义,从而降低模型性能和个性化质量。
模型陈旧与负迁移 :在动态环境中,新物品经常与已被过时、陈旧 ID 占用的槽位发生冲突。标准哈希方法缺乏淘汰这些旧 ID 的机制。因此,新物品会“继承”来自不相关实体的预训练嵌入,迫使模型在收敛到有用信号之前先遗忘噪声。这种“负迁移”阻碍了对新特征准确表示的学习。
虽然增加表大小可以降低冲突概率,但由于内存限制,它无法完全消除冲突,且即使表很大,标准哈希算法仍可能产生显著的冲突。
2. 方法论:MPZCH
作者提出了多探针零冲突哈希(MPZCH) ,这是一种作为高性能 CUDA 内核实现的新型索引机制。它将线性探测与辅助状态管理相结合,以缓解冲突并主动管理 ID 生命周期。
2.1 核心组件
辅助张量 :MPZCH 在嵌入表之外维护两个张量:
身份张量(Identities Tensor) :记录占用每个槽位的具体 ID(初始化为 -1)。这使得内核能够严格区分已占用的槽位和可用的槽位。
元数据张量(Metadata Tensor) :存储辅助信息,如生存时间(TTL)值或时间戳,以指导淘汰决策。
两遍线性探测 :为确保一致性并防止重复存储或过早淘汰,内核对每个 ID 执行两遍扫描:
第一遍(发现) :扫描探测范围以确定该 ID 是否已存在。此过程不进行任何写入操作。
第二遍(行动) :基于第一遍的结果:
更新 :如果 ID 已存在,则刷新元数据(例如时间戳)。
分配 :如果 ID 是新的,内核尝试寻找空槽位或淘汰过期的条目。
冲突回退 :如果在探测范围内未找到空槽位或可淘汰的槽位,系统默认使用初始哈希槽位(尽管在表大小和探测深度足够的情况下,这种情况很少见)。
2.2 淘汰与新鲜度策略
MPZCH 引入了可配置的淘汰策略来管理表容量并确保新鲜度:
TTL(生存时间)策略 :如果条目的元数据时间戳低于当前训练时间戳,则将其标记为过期。淘汰是惰性 的,仅在需要为新 ID 分配空间时触发。
LRU(最近最少使用)策略 :内核扫描探测范围,淘汰时间戳最旧的条目。
优化器重置 :至关重要的是,在淘汰发生时,嵌入权重和优化器状态(例如动量)均被重置 。这防止了新物品继承陈旧的嵌入,确保它们从头开始学习。
2.3 系统集成
TorchRec 集成 :MPZCH 设计用于与 Meta 的 TorchRec 库无缝集成。身份张量和元数据张量按行在秩(ranks)之间分片,以匹配嵌入表,确保所有操作在分片内部本地完成,无需复杂的跨秩同步。
推理优化 :在模型发布期间,元数据张量被省略以减小模型大小,身份张量被冻结。推理服务变为严格的只读模式,提供确定性和高效的查找。
流式更新 :系统支持带有流式更新的在线训练,确保身份张量与嵌入行修改保持一致。
3. 主要贡献
零冲突保证 :通过结合足够的表大小与可配置的探测深度,MPZCH 有效消除了用户嵌入的冲突,这是标准哈希难以实现的成就。
主动生命周期管理 :与静态哈希表不同,MPZCH 主动淘汰过时的 ID 并重置优化器状态,直接解决了“负迁移”问题并增强了模型新鲜度。
高性能实现 :该算法实现为自定义 CUDA 内核,可并行处理数万个 ID。基准测试表明,线性探测的开销微乎其微(即使探测深度增加,延迟仍保持稳定),保持了与现有方法相当的训练 QPS 和推理延迟。
开源发布 :该解决方案已在开源 TorchRec 库中发布。
4. 实验结果
作者通过严格的在线 A/B 测试和离线基准测试评估了 MPZCH:
冲突率 :在涉及 1.5 亿个唯一用户 ID 的实验中,MPZCH 在表大小为 2 亿(1.33 倍容量)且探测深度为 256 的情况下实现了零冲突 。相比之下,基线 Sigrid 哈希即使在表大小为 ID 基数三倍的情况下,仍保持了约 30% 的冲突率。
用户嵌入(视频排序) :部署在服务于 30 亿月活跃用户的生产视频排序模型中。消除冲突导致 17 个预测任务中有 14 个的归一化熵(NE)出现统计学显著的提升,包括分享率(+0.38%)和视频观看时长(+0.12%)。
物品嵌入(视频检索) :集成到基于 HSTU 的检索模型中,采用基于 TTL 的淘汰机制(帖子为 24 小时,所有者为 72 小时)。
性能 :新发布的视频(发布 48 小时内)的展示量增加了0.83% 。
语义质量 :t-SNE 分析显示,MPZCH 显著改善了同一创作者视频的嵌入聚类效果。对于同一天发布的帖子,同一创作者内部的相似度从 0.66% 提升至 0.91%(相对提升 38%)。
学习稳定性 :嵌入轨迹变得更加平滑和一致,消除了基线模型中因哈希冲突导致的剧烈波动。
5. 意义
该论文认为,MPZCH 为现代推荐系统提供了一种双重优势解决方案。首先,通过保证无冲突环境,它通过消除随机干扰提升了嵌入质量和预测准确性。其次,通过引入主动淘汰和优化器重置机制,它从根本上增强了嵌入的新鲜度,使模型能够快速适应不断变化的数据分布,而无需无限制地增加内存。作者得出结论,模型新鲜度和质量方面的这些实证改进验证了 MPZCH 作为大规模推荐系统稳健解决方案的有效性。
每周获取最佳 machine learning 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。