面向多向量嵌入模型的 Token 池化感知训练
理解多向量检索中的 Token 池化
多向量嵌入模型(如 ColBERT)将文档表示为上下文 Token 向量的集合,而不是单个向量。这种方法通过 MaxSim 评分实现了高表达能力的搜索,即将查询 Token 与最相关的文档 Token 进行匹配。然而,这种粒度导致了巨大的存储需求,因为拥有数百万文档的语料库可能会生成数亿个向量。
Token 池化通过将相似的 Token 向量合并为较少的代表性向量来缓解这一问题。虽然标准池化可以应用于任何模型,但它通常会导致信息丢失,因为编码器最初并未被训练为使用压缩表示进行检索。池化感知训练通过明确教导模型在向量合并时保持检索准确性来解决这个问题。
池化感知训练的机制
池化感知训练的功能类似于 Matryoshka 嵌入,通过同时对完整表示和压缩表示应用检索目标来实现。在训练过程中,每个批次计算两个损失:
- 未池化损失 (Unpooled Loss): 使用原始的完整文档嵌入集进行检索。
- 池化损失 (Pooled Loss): 在将文档压缩到目标向量计数(例如,使用
pool_factor为 4)后进行检索。
总损失是这两个组件的平均值。这迫使编码器构建其 Token 嵌入,使得关键信息能够在聚类过程中存活下来。HierarchicalTokenPooling 模块使用 Ward 分层聚类来对向量进行分组,训练过程采用直通估计器 (straight-through estimator),尽管聚类分配具有离散性,仍能将梯度传回原始 Token 嵌入。
实现与性能
开发者可以使用 Sentence Transformers 库中的 MultiVectorTokenPoolingLoss 包装器来实现这一点。通过包装现有的检索损失,这种方法允许进行高效训练,而无需针对不同的池化变体进行单独的编码器传递。
关键性能提升
在 NanoBEIR 基准测试中使用 ModernBERT-base 进行的评估表明,在相同的存储预算下,池化感知训练的表现显著优于标准模型:
- 保留率: 在
pool_factor=4(向量减少 4 倍)时,池化感知训练实现了未池化 nDCG@10 分数 97.8% 的保留率,而普通训练模型为 94.6%。 - 灵活性: 这种训练的好处超出了训练期间使用的特定
pool_factor,在各种固定上限和自适应池化阈值下均显示出持续的改进。 - 自适应校准: 用户可以校准距离阈值以实现目标平均向量计数,从而允许模型为信息密度更高的文档动态分配更多向量。
推荐的压缩策略
对于索引大小是主要约束的应用,建议采用以下分层方法:
- 量化: 应用诸如 Fast-PLAID(2 位或 4 位残差量化)之类的技术来减少每个坐标的存储空间。
- Token 池化: 使用池化感知微调来减少文档向量的总数。
- Matryoshka 嵌入: 利用 Matryoshka Token 嵌入来降低单个向量的维度。
这些技术是互补的,可以通过包装多个损失函数(例如 MultiVectorMatryoshkaLoss 和 MultiVectorTokenPoolingLoss)来组合使用,从而同时优化向量计数和维度。