MRL即 Matryoshka Representation Learning -套娃表示学习
其代表性的论文是在2022年 Matryoshka Representation Learning
该论文是在设计一个训练方法,用于让一条长向量的前若干维,本身也成为有用的短向量。使得让同一个模型输出的向量,同时拥有精简版和完整版的向量表示。
背景
Embedding 模型可以把文本、图片等内容转换为多维向量。一个 1024 维向量,就是用 1024 个数字表示一段内容。这些数字共同表达语义,通常不能把某一维直接解释成“动物”、另一维解释成“颜色”。语义检索就是比较这些向量,寻找距离较近或相似度较高的对象。
问题在于,普通模型只需要保证完整的 1024 维好用。它没有义务保证前 128 维也好用。信息可能分散在所有维度中,直接删掉后面的数字,就可能破坏原来的语义关系。
然而在训练模型时,研究者往往不知道最终用户会有多少数据、多少内存,以及能接受多大精度损失。固定长度向量迫使所有部署环境使用同一种规格;MRL 则允许部署者在训练结束后,再选择合适的向量长度。
所谓套娃表示学习指的是这些向量共享同一个开头,彼此包含,例如
完整的 1024 维:[────────────────────────────────]
前面的 256 维:[────────]
前面的 64 维:[──]
训练原理
假设模型将输入 $x$ 编码为向量,选择几个训练尺寸,例如 64,256,1024
普通训练只计算完整向量的任务损失;MRL 会分别计算这些前缀向量的损失,再加权求和。公式为
$$ \mathcal{L}_{\mathrm{MRL}}=\sum_{m\in\mathcal{M}}\lambda_m\mathcal{L}_m(z_{1:m}) $$| 符号 | 含义 |
|---|---|
| $\mathcal{M}$ | 要训练的长度集合,这里是 64、256、1024 |
| $m$ | 集合中的某一个长度 |
| $z_{1:m}$ | 向量 $z$ 的前 $m$ 个数字 |
| $\mathcal{L}_m$ | 使用这个长度完成任务时的损失,越小越好 |
| $\lambda_m$ | 这个长度的损失占多大权重 |
| $\sum$ | 将各个长度的损失加起来 |
如果完整向量能找对文档,但前 128 维找不对,那么短向量对应的损失仍然会很大。为了降低总损失,训练会推动模型把完成检索所需的信息也编码到前面的维度中。因此,短向量能够继续使用,是训练出来的能力。
使用方法
MRL 训练完成后,同一个模型生成的向量,可以按需要选择不同的维度。
例如,在知识库中搜索“手机充不进电怎么办”。模型原本输出 1024 维向量,但为了减少存储和检索成本,我们决定使用其中的前 128 维。
使用过程如下:
知识库中的文档 → 模型生成 1024 维向量 → 保留前 128 维 → 存入向量库
用户提出的问题 → 模型生成 1024 维向量 → 保留前 128 维 → 与文档向量比较
查询和文档必须使用匹配的模型及处理流程。MRL 的训练使这些短向量仍然具备语义区分能力,因此可以用它们寻找相关文档;具体损失多少效果,需要实际测试。
截取之后,还需要按模型和检索工具的要求处理向量。一个常见步骤就是 L2 归一化。
假如我们采用“比较方向”的余弦相似度,就不希望向量本身的几何长度干扰比较。实现时,可以先把所有向量缩放到单位长度,再通过点积比较方向。
这里有两种不同的“长度”:
| 概念 | 含义 | 举例 |
|---|---|---|
| 维度 | 向量包含多少个数字 | 128 维,就是 128 个数字 |
| 几何长度 | 所有数字的平方和再开根号 | [3,4]的几何长度是 5 |
使用 MRL 时,先决定保留多少维。例如,把一个 1024 维向量的前 128 个数字取出来,就得到 128 维向量。
如果检索工具还要求做 L2 归一化,就对这 128 个数字计算平方和,再开根号,得到一个数,然后把每个数字都除以这个数。处理后仍然是 128 维,只是向量的几何长度变成了 1。
用一个小向量演示:
原始向量: [3, 4, 12]
截取前两维: [3, 4]
计算几何长度: √(3² + 4²) = 5
每个数字除以5: [0.6, 0.8]
归一化后仍然是两维,几何长度变成了 1:sqrt(0.6^2 +0.8^2) = 1
所以,对于采用“归一化后做点积”的检索系统,完整流程是:
生成向量 → 截取所需维度 → L2 归一化 → 存储或比较
为何要把几何长度变成1
把几何长度变成 1,是为了让直接做点积也能得到余弦相似度
用一组人为设计的数字演示。假设:
- 查询向量:$q=[1,0]$
- 文档 A:$a=[2,0]$
- 文档 B:$b=[10,10]$
把它们想成箭头:
- 查询指向正右方。
- A 也指向正右方。
- B 指向右上方,但箭头长得多。
如果我们只关心方向,显然 A 更接近查询。
直接做点积,会发生什么呢?
点积就是对应数字相乘,再相加:
| 比较对象 | 点积计算 | 得分 |
|---|---|---|
| 查询与 A | $1\times2+0\times0$ | 2 |
| 查询与 B | $1\times10+0\times10$ | 10 |
可以发现B得分更高。 因为尽管他的方向和查询向量不一致,但是他的数值更大。
如果我们把箭头都缩放到几何长度为 1 再做点积:
$$ \hat{q}=[1,0],\qquad \hat{a}=[1,0],\qquad \hat{b}\approx[0.707,0.707] $$| 比较对象 | 归一化后的点积 | 得分 |
|---|---|---|
| 查询与 A | $1\times1+0\times0$ | 1 |
| 查询与 B | $1\times0.707+0\times0.707$ | 约 0.707 |
现在 A 得分更高,符合方向更接近的判断。把长度统一为 1,就是让比较不再受箭头长短的影响。
当然也可以保留原始向量,直接使用完整的余弦公式
余弦相似度 =点积/两个向量的几何长度之积
结果完全一样。所以有两条等价的计算路线:
路线一:原始向量 → 直接计算完整的余弦公式
路线二:先归一化 → 直接计算点积
收益与成本
在数据类型相同的情况下,从 1024 维缩到 128 维,每条向量的原始存储量变为八分之一,逐次向量比较需要处理的数字也相应减少。但数据库还包含索引和元数据,因此总空间不一定缩小八倍,检索速度也不一定提高八倍。
标准 MRL 通常仍需运行完整编码模型,再截取输出,所以它主要节省向量存储、传输和比较成本。训练时需要优化多个尺寸,会增加一定开销;压缩越多,也可能损失更多检索效果,需要通过实际测试选择维度。
MRL 适合语义搜索、RAG 知识库以及图文检索等依赖 embedding 的场景。例如,Qwen3-Embedding 系列明确支持 MRL,Qwen3-VL-Embedding 则将这种能力用于多模态表示。实际部署时,可以选择较短向量建立索引,也可以先用短向量召回候选,再用保留的长向量重新排序