首页
/
新闻
/
亲爱的,我把嵌入缩小了:Matryoshka 与 PCA
亲爱的,我把嵌入缩小了:Matryoshka 与 PCA
摘要
Dylan Castillo 比较了 Matryoshka 表示学习(MRL)与主成分分析(PCA)在降低嵌入维度方面的效果,并在八个 BEIR 数据集上进行了实验,以评估检索质量与向量大小缩减之间的权衡。
暂无内容
查看缓存全文
缓存时间:
2026/08/09 14:27
# 天啊,我把向量给缩小了:Matryoshka 与 PCA 的对比 – Dylan Castillo
来源:https://dylancastillo.co/posts/matryoshka-vs-pca
当人们开始将 LLM 与自己的文档结合使用时,一个新问题出现了:你如何高效地存储和搜索所有这些信息?
向量数据库(https://en.wikipedia.org/wiki/Vector_database)很快成为标准解决方案。但向量可能包含数千个维度,存储数百万个这样的向量会让检索变得缓慢且昂贵。
AI 实验室(https://openai.com/index/new-embedding-models-and-api-updates/)回应(https://docs.cohere.com/changelog/embed-multimodal-v4)了一种名为 Matryoshka 表示学习(MRL)(https://arxiv.org/abs/2205.13147)的技术,它让你可以使用更少的嵌入维度,而不会在检索质量上损失太多。这意味着更小的向量数据库账单和更快的查询。
圆满结局。几乎是的。
我通常不会在周三为向量数据库账单发愁。但 Doug Turnbull 的关于使用主成分分析(PCA)(https://arxiv.org/abs/1404.1100)来降低向量维度的文章(https://softwaredoug.com/blog/2026/07/24/pca-shrink-ray)让我很好奇:这种更古老、更简单的技术相比 MRL 表现如何?
为了找到答案,我在八个标准检索质量数据集上比较了这两种方法。在本文中,我将介绍整个实验过程并分享我的发现。
所有代码和数据都可在 GitHub(https://github.com/dylanjcastillo/blog/tree/main/_extras/matryoshka-vs-pca)上获取。
## 什么是 MRL 和 PCA?
这两种方法都会产生更小的向量,其行为几乎与完整向量一致。但它们实现的方式不同。
**MRL** 在训练期间起作用。你在训练模型时,会在多个前缀长度上同时应用损失:前 64 维、前 128 维,依此类推。这教会模型将最重要的信息打包在向量的开头,就像一组套娃一样。
在推理时,你只需保留前 *d* 个维度并重新归一化结果向量。许多现代嵌入模型都采用这种方式训练,但较旧的模型则不然,因此基于 MRL 的截断对许多流行的嵌入模型并不可用。
**PCA** 在训练之后起作用,这意味着它可以用于任何模型。你取一批嵌入样本,找到它们变化最大的方向,并保留前 *d* 个方向作为投影矩阵1(https://dylancastillo.co/posts/matryoshka-vs-pca#fn1)。PCA 能给你更小的向量,但也增加了额外的操作复杂性。你需要存储并对 PCA 变换进行版本管理,然后在添加数据到索引和查询索引时始终如一地应用相同版本。
## 我如何运行实验
实验背后的想法很简单:我用每种方法缩小嵌入向量,运行基准测试,然后查看在每个尺寸下检索质量损失多少。
我通过 OpenRouter 生成了所有嵌入,并在八个 BEIR(https://github.com/beir-cellar/beir)数据集上评估了检索:SciFact、NFCorpus、ArguAna、FiQA、SciDocs、Quora、TREC-COVID 和 Webis-Touché 2020。对于每个数据集,我将嵌入向量缩减到 512、256、128、64 和 32 维。
| 数据集 | 任务 | 语料库 | 查询 |
| --- | --- | --- | --- |
| SciFact | 科学声明验证 | 5.2K | 300 |
| NFCorpus | 医学搜索 | 3.6K | 323 |
| ArguAna | 反论点检索 | 8.7K | 1,406 |
| FiQA-2018 | 金融问答 | 57K | 648 |
| SciDocs | 引文推荐 | 25K | 1,000 |
| Quora | 重复问题检索 | 523K | 10,000 |
| TREC-COVID | 生物医学搜索(COVID-19) | 171K | 50 |
| Touché 2020 | 从网页文档中检索论点 | 382K | 49 |
我想回答三个问题。
#### Q1:哪种方法在削减维度时能保持更多的检索质量?
为了回答这个问题,我使用了两个经过 MRL 训练的模型:OpenAI 的 `text-embedding-3-small`(1536 维)和阿里的 `qwen3-embedding-8b`(4096 维),后者位于开源权重 MTEB BEIR 排行榜的顶部。
我通过两种方式削减了每个模型的嵌入:
1. 使用**截断**,我保留前 *d* 个维度并重新归一化。这就是使用 MRL 减少维度(https://developers.openai.com/api/docs/guides/embeddings#reducing-embedding-dimensions)的方法。
2. 使用**PCA**,我在将要搜索的同一数据集的完整维度文档嵌入上拟合投影,并保留前 *d* 个主成分。此后,每个文档和查询嵌入在搜索前都会乘以该投影矩阵并重新归一化。
然后,我在八个数据集上运行基准测试,在两种模型上比较这两种方法,以观察哪种方法在嵌入向量变小后能保留更多的检索质量。
#### Q2:这仅仅是 MRL 训练的功劳吗?
如果 PCA 表现良好,那可能是因为 MRL 训练已经以一种便捷的方式组织好了嵌入空间。为了验证这一点,我添加了 `text-embedding-ada-002` 作为对照,这是一个较旧的 1536 维模型,没有使用 MRL 训练。
我对这两个模型都应用了 PCA。如果 PCA 在 `text-embedding-3-small` 和 `text-embedding-ada-002` 上保留了相似的检索质量份额,那就表明 PCA 的表现并不依赖于 MRL 训练。
#### Q3:拟合数据重要吗?
PCA 必须在某些数据上进行拟合,这引出了两个实际问题:你需要多少拟合数据,以及它必须来自你要搜索的语料库吗?
对于第一个问题,我在 FiQA 的 57K 文档的随机样本(1000、5000、20000,以及完整语料库)上拟合了 PCA,并检查了拟合样本大小对检索质量的改变程度。这涵盖了你在数据样本上拟合 PCA,然后随着索引增长从不更新它的场景。
对于第二个问题,我将常规 PCA 与**域外 PCA** 进行了比较:一次在 100,000 个 MS MARCO 段落上拟合的投影,之后不加修改地在其他每个数据集上重用。这是最极端的版本:你在看起来与你实际索引内容非常不同的数据上拟合 PCA。
## 但首先,进行一个合理性检查
在运行实验之前,我想确保评估流程能产生合理的结果。因此,我首先尝试重现官方 MTEB 对这些模型的评分。
下表比较了完整维度下的 NDCG@10:官方 MTEB 得分与我的评估流程产生的得分。
| 数据集 | ada-002 | 3-small | qwen3-8b |
| --- | --- | --- | --- |
| | MTEB | 我的 | MTEB | 我的 | MTEB | 我的 |
| SciFact | 0.7275 | 0.7277 | 0.7337 | 0.7296 | 0.7846 | 0.7863 |
| NFCorpus | 0.3697 | 0.3705 | 0.3833 | 0.3847 | 0.4145 | 0.4150 |
| ArguAna | 0.5744 | 0.5757 | 0.5549 | 0.5573 | 0.7685 | 0.7689 |
| FiQA | 0.4441 | 0.4440 | 0.4491 | 0.4484 | 0.6457 | 0.6492 |
| SciDocs | 0.1836 | 0.1837 | 0.2080 | 0.2077 | 0.3274 | 0.3268 |
| Quora | 0.8760 | 0.8759 | 0.8883 | 0.8880 | 0.8890 | 0.8901 |
| TREC-COVID | 0.6847 | 0.6884 | 0.7790 | 0.7775 | 0.9499 | 0.9492 |
| Touché 2020 | 0.2161 | 0.2143 | 0.2428 | 0.2433 | 0.3593 | 0.3596 |
官方数字来自 MTEB 结果存储库(text-embedding-3-small(https://github.com/embeddings-benchmark/results/tree/main/results/openai__text-embedding-3-small)、text-embedding-ada-002(https://github.com/embeddings-benchmark/results/tree/main/results/openai__text-embedding-ada-002)、qwen3-embedding-8b(https://github.com/embeddings-benchmark/results/tree/main/results/Qwen__Qwen3-Embedding-8B))。我的结果与官方数字足够接近,使我相信该流程按预期工作。
## Q1:哪种方法能保留更多的检索质量?
在几乎所有维度上,PCA 都达到或超过了两种 MRL 训练模型上的 MRL 截断。
下面的每个单元格显示了在缩减后保留的检索质量比例:该维度下的 NDCG@10 除以完整维度下的 NDCG@10(`text-embedding-3-small` 为 1536,`qwen3-embedding-8b` 为 4096),在八个数据集上取平均。
| 维度 | 3-small (MRL) | qwen3-8b (MRL) |
| --- | --- | --- |
| | 截断 | PCA | 截断 | PCA |
| 512 | 98% | 97% | 99% | 98% |
| 256 | 94% | 95% | 96% | 96% |
| 128 | 86% | 90% | 91% | 91% |
| 64 | 71% | 82% | 83% | 84% |
| 32 | 46% | 65% | 68% | 71% |
- 3-small
- qwen3-8b
在 512 维时,MRL 截断略有优势。但随着向量变小,PCA 迎头赶上,并超过或追平 MRL。
在 `text-embedding-3-small` 上,PCA 在 256 维以下明显更好(32 维时保留 65% 对 46%)。在 `qwen3-embedding-8b` 上,差距要小得多(32 维时 71% 对 68%)。
我发现有趣的一点是,`qwen3-embedding-8b` 中的 MRL 训练非常强大,以至于将其从 4096 维截断到 32 维的向量,比从 1536 维截断的 3-small 保留更多质量。
逐个数据集地看,你会发现一些差异:
- 3-small
- qwen3-8b
在最小维度下,PCA 在八个数据集中的七个上击败了 `text-embedding-3-small`,并在八个中的六个上击败了 `qwen3-embedding-8b`。
跨维度来看,PCA 在 SciFact、FiQA 和 NFCorpus 上对这两种模型表现都更好。ArguAna 和 SciDocs 在使用 `text-embedding-3-small` 时也偏向 PCA,尽管在 `qwen3-embedding-8b` 上的结果不太确定。截断在 Quora 上对两种模型表现都更好。Touché 在 `qwen3-embedding-8b` 上偏向截断,但在 `text-embedding-3-small` 上基本持平,而 TREC-COVID 的结果则取决于维度。
## Q2:这仅仅是 MRL 训练的功劳吗?
我担心 PCA 在 `text-embedding-3-small` 和 `qwen3-embedding-8b` 上表现良好,仅仅是因为 MRL 训练已经以一种便捷的方式组织了它们的嵌入空间。如果真是这样,那么 PCA 在从未经过 MRL 训练的 `text-embedding-ada-002` 上的表现应该会明显更差。
在大多数情况下,事实并非如此。直到 128 维,PCA 在 `text-embedding-ada-002` 上保留的质量份额与 `text-embedding-3-small` 几乎相同;在此之下,出现了一点小差距:
| 维度 | ada-002 (无 MRL) | 3-small (MRL) |
| --- | --- | --- |
| | 截断 | PCA | 截断 | PCA |
| 512 | 96% | 99% | 98% | 97% |
| 256 | 89% | 96% | 94% | 95% |
| 128 | 83% | 89% | 86% | 90% |
| 64 | 66% | 78% | 71% | 82% |
| 32 | 41% | 59% | 46% | 65% |
PCA 在 `text-embedding-ada-002` 上在 64 维时保留了 78%,在 32 维时保留了 59%,而在 `text-embedding-3-small` 上则分别为 82% 和 65%。这可能是因为 MRL 确实有帮助,也可能只是因为 `text-embedding-3-small` 是更新、更好的模型。我无法通过这个实验区分这两者。但无论如何,考虑到在这些维度下,即使是在非 MRL 模型上的 PCA(32 维时 59% 对 46%)也优于在 MRL 模型上的截断,“PCA 只是因为 MRL 才有效”的假设似乎不太可能。
出于好奇,我还在 `text-embedding-ada-002` 上尝试了截断,尽管该模型从未为此训练过。它的表现比我预想的好得多,在 128 维时保留了 83%。
## Q3:拟合数据重要吗?
与 MRL 相比,PCA 增加了更多的操作复杂性:拟合和版本管理投影,在查询时使用它,在索引更改时更新投影。所以我想知道如果你偷懒会怎样:只在首次创建索引时拟合一次 PCA,之后就再也不管它了。
**在域内小样本上拟合。** 在这种情况下,你在开始时拥有的文档(1000、5000、20000,或 FiQA 的全部 57K)上拟合 PCA,并将该投影用于之后索引的所有内容。在这个规模下,差别不大:在 1000 个文档上拟合的投影与在完整语料库上拟合的投影,在每个维度、每种模型上的表现几乎相同。
- 3-small
- qwen3-8b
**域外拟合。** 在这种情况下,你用于拟合的数据与你最终搜索的数据不匹配,可能是因为你的语料库随时间漂移,或者是因为你在任何可用数据上拟合。为了模拟最极端的情况,我在 100K 个通用 MS MARCO 段落上拟合了一次 PCA,并用该投影搜索了其他所有数据集。
在 `text-embedding-3-small` 上,从 512 维到 64 维,迁移后的拟合平均效果与之相当或更好。各个数据集的差异在正反两个方向上都更大。在 `qwen3-embedding-8b` 上,它一直保持到 128 维,但在更低维度上落后(32 维时保留 56% 对 71%)。
- 3-small
- qwen3-8b
对像我这样懒惰的人来说,这是个好消息。拟合样本大小的重要性远低于我的预期,而且域外拟合在中等压缩率下表现良好。然而,这些模式可能是实验规模或我使用的特定基准测试的结果。所以对这些结论应持保留态度。
## 量化呢?
你也可以使用一种叫做量化的技术来缩小向量。量化不是减少维度数量,而是用更少的比特存储每个维度。使用 `int8`,每个维度占用 1 字节(比 `float32` 小 4 倍);使用二值化,只需符号位(小 32 倍)。对于下面的数字,int8 量化文档向量,而查询保持 float32;二值化同时量化文档和查询,并按点积排序,这等同于按汉明距离排序。
单独使用量化,`text-embedding-3-small` 在完整的 1536 维下可以得到以下结果:
| 配置 | 每向量字节数 | 相对于完整 float32 的大小 | 保留的质量 |
| --- | --- | --- | --- |
| int8 | 1,536 | 25% | 100% |
| 二值化 | 192 | 3.1% | 95% |
你可以通过将量化与截断或 PCA 结合来进一步压缩。由此产生的向量可以大大缩小,同时仍然保留令人惊讶的检索质量。
例如,将二值化量化与 512 维的 PCA 相结合,可以保留 82% 的原始性能,同时将原始向量大小减少到 float32 基线的约 1%。这看起来有点过于乐观,所以可能只是我的 AI 幻觉。这里是完整结果(https://github.com/dylanjcastillo/blog/tree/main/_extras/matryoshka-vs-pca/data/analysis/openai__text-embedding-3-small/quantization_summary.csv)。
## 局限性
- **嵌入模型很少**:我测试了三种模型,其中两种来自 OpenAI。Qwen 已经表明,更强的 MRL 实现缩小了 PCA 的领先优势,因此其他模型系列可能会进一步改变结果。
- **语料库大小**:为了控制预算(约花费 30 美元),我排除了最大的 BEIR 数据集,因此 PCA 有可能在未触及的规模上落后于 MRL。
- **实验室条件**:我的评估在原始向量上执行精确搜索,这并不是实际向量数据库的工作方式。真实部署会使用近似索引,应用自己的压缩,使用全精度向量重新打分,并且通常还会混入 BM25 和重新排序器。这可能会使我的结果失效。
- **基准污染**:BEIR 数据集被广泛用于训练嵌入模型,因此绝对得分可能被高估了。
## 结论
PCA 不仅与 MRL 截断旗鼓相当,而且在大多数维度上胜出。
在 `text-embedding-3-small` 上,PCA 在几乎所有维度上都击败了 MRL 截断,并且在激进压缩下优势明显:32 维时保留了 65% 的质量,而截断仅保留 46%。在 `qwen3-embedding-8b` 上,MRL 在 512 维时略有优势,在 256 维时基本持平,而 PCA 在更低维度下领先。
这些结果似乎也不是 MRL 训练的产物。PCA 在未经截断训练的 ada-002 上表现同样良好。
它也比我想象中更容易维护。在小规模域内样本上拟合时,结果几乎没有变化。域外拟合在中等压缩率下也表现良好。
对于一种比洗衣机2(https://dylancastillo.co/posts/matryoshka-vs-pca#fn2)还要古老的技术来说,这真不错!
如果您想自己查看数据,完整流程在仓库中(https://github.com/dylanjcastillo/blog/tree/main/_extras/matryoshka-vs-pca)。
## 脚注
1. 这个页面(https://setosa.io/ev/principal-component-analysis/)解释得很好↩︎(https://dylancastillo.co/posts/matryoshka-vs-pca#fnref1)
2. 电动洗衣机↩︎(https://dylancastillo.co/posts/matryoshka-vs-pca#fnref2)
## 引用
BibTeX 引用:
```
@online{castillo2026,
author = {Castillo, Dylan},
title = {Honey, {I} Shrunk the Embeddings: {Matryoshka} Vs. {PCA}},
date = {2026-08-01},
url = {https://dylancastillo.co/posts/matryoshka-vs-pca.html},
langid = {en}
}
```
如需署名,请引用此作品为:
Castillo, Dylan. 2026. “Honey, I Shrunk the Embeddings: Matryoshka Vs. PCA.” August 1. https://dylancastillo.co/posts/matryoshka-vs-pca.html.
相似文章
Hacker News Top
本文介绍了一种多项式自编码器,通过利用二次解码器捕捉非线性方差,在压缩 Transformer 嵌入方面改进了传统的 PCA 方法。在 BEIR 基准测试中的结果表明,该方法在保持高压缩率的同时,其检索质量显著优于标准 PCA 和 Matryoshka 嵌入。
Hugging Face Daily Papers
# Paper page - MatryoshkaLoRA: Learning Accurate Hierarchical Low-Rank Representations for LLM Fine-Tuning Source: [https://huggingface.co/papers/2605.07850](https://huggingface.co/papers/2605.07850) We propose**MatryoshkaLoRA**, a general, Matryoshka\-inspired training framework for LoRA that learns accurate hierarchical low\-rank representations by inserting a fixed, carefully crafted diagonal matrix**P**between the existing LoRA adapters to scale their sub\-ranks accordingly\. By introducing
arXiv cs.CL
Tevatron-Elastic 为训练弹性检索器和重排序器提供了统一抽象,使单个检查点能够在深度、token 和宽度轴上支持多种模型规模。它统一概括了 Matryoshka 嵌入和提前退出等先前方法,并引入了用于联合 token 压缩训练的 Matryoshka LTC。
Replicate Explore
zsxkib/embedding-gemma-300m 是 Google 的 EmbeddingGemma-300M 模型在 Replicate 上的部署,用于生成 768 维文本嵌入,通过 Matryoshka 表示学习支持灵活的输出维度。
arXiv cs.CL
This paper studies using sparse PPMI graph averaging to refine Random Indexing embeddings, showing it improves accuracy on a fairytales analogy benchmark but trails neural baselines on text8 and SimLex-999.