Matryoshka 嵌入模型简介
Matryoshka 嵌入模型能够创建可以截断至更小维度而性能损失不显著的嵌入。这种方法使实践者能够根据存储成本、处理速度和准确性要求动态地扩展其嵌入解决方案。
Matryoshka 嵌入的工作原理
Matryoshka 嵌入基于 Matryoshka 表示学习(MRL),这是一种鼓励模型将最关键信息存储在嵌入向量最前面维度的技术。就像俄罗斯套娃一样,模型被训练以确保较小的截断版嵌入仍保留足够的信息,可用于下游任务。
应用与优势
可变尺寸的嵌入为 AI 实践者提供了两个主要优势:
- 筛选与重新排序:用户可以使用小的截断嵌入进行初始的高效“筛选”搜索。确定候选集合后,可使用全维度嵌入对结果进行重新排序,以获得更高的精度。
- 资源优化:Matryoshka 模型允许根据部署环境的具体约束,在存储成本、处理速度和性能之间进行可定制的权衡。
训练 Matryoshka 嵌入模型
理论框架
在标准嵌入训练中,损失函数作用于完整尺寸的嵌入。相比之下,Matryoshka 训练会对完整尺寸的嵌入以及不同截断维度的嵌入(例如 768、512、256、128 和 64)计算损失值。这些损失会相加得到最终的损失值,优化器据此调整模型权重,从而实现对最重要信息的“前置”。
在 Sentence Transformers 中的实现
Sentence Transformers 已通过 MatryoshkaLoss 实现对 Matryoshka 模型的支持。该包装损失函数将基础损失(如 CoSENTLoss)应用于嵌入的多个截断部分。使用 MatryoshkaLoss 进行训练不会导致显著的训练时间开销。
使用 Matryoshka 嵌入模型
通用推理
推理方式与标准嵌入模型类似。唯一的区别是嵌入在生成后可以选择性地截断为更小的维度。如果嵌入最初已归一化,则在截断后应重新归一化以保持一致性。
在 Sentence Transformers 中的实现
使用 SentenceTransformer 类时,用户可以在模型初始化时指定 truncate_dim 参数。随后 encode 函数会自动将输出嵌入截断至指定大小。
对于诸如 nomic-ai/nomic-embed-text-v1.5 等特定模型,需要在截断嵌入之前应用 F.layer_norm 的自定义架构。
性能结果
在 STSBenchmark 测试集上,将 Matryoshka 模型(tomaarsen/mpnet-base-nli-matryoshka)与标准模型(tomaarsen/mpnet-base-nli)进行比较的实验结果显示如下:
- 更高的准确性:Matryoshka 模型在所有测试维度上实现了更高的 Spearman 相似度。
- 性能保持:Matryoshka 模型的性能衰减远慢于标准模型。即使截断至原始大小的 8.3%,Matryoshka 模型仍保留了 98.37% 的最高性能,而标准模型仅为 96.46%。
这些结果表明,Matryoshka 嵌入能够显著降低存储需求并提升检索速度,而对性能的影响并不显著。