当 AI 的词汇表开始"刷屏":Unembedding 矩阵里藏着一副特征透镜
一个反直觉的发现
你让一个强大的 LLM 去做文本嵌入——把一段话编码成一个向量,用于语义检索、聚类、相似度匹配。结果发现,这个在 MMLU 上吊打人类、在代码生成上接近专业程序员的模型,在 MTEB 嵌入基准上的表现还不如一个专门训练的 0.1B 小模型。
这不是能力问题,是"方向"问题。
人民大学和联想的研究团队做了一个极其简单的实验:把 LLM 最后一层隐藏状态(也就是文本嵌入向量)乘上 unembedding 矩阵 $W_U^\top$,投影回词表空间。按理说,一段关于量子力学的文本嵌入,投影回去应该激活"quantum"、"particle"、"wave"这类语义相关的高频词。
但结果让人大跌眼镜:投影回来得分最高的,永远是 "the"、"of"、"and"、"." 这些毫无信息量的高频 token。
这就好比你问一个学识渊博的教授"请用一句话总结量子力学",他回答的却是"呃呃啊啊那个那个"。不是他不懂,是他嘴边总是先蹦出这些口头禅。
病灶在哪儿:Unembedding 矩阵的"边缘谱"
作者追根溯源,发现病灶不在隐藏状态本身,而在 unembedding 矩阵 $W_U$ 里。
对 $W_U$ 做奇异值分解(SVD):$W_U = U \Sigma V^\top$。$V^\top$ 的行向量构成了嵌入空间的一组正交基。作者发现,对应最大奇异值和最小奇异值的那些行向量("边缘谱"),恰好编码了高频 token 的方向。当隐藏状态经过 $W_U^\top$ 投影时,这些方向被强烈激活,把"the"、"of"这些词的 logit 拉高,淹没了真正的语义信号。
换句话说,unembedding 矩阵不只是"词表到 logit 的映射",它还偷偷把高频 token 的"引力场"写进了嵌入空间。LLM 在生成任务里需要这个引力场(高频词本来就该有更高的先验概率),但在嵌入任务里,这个引力场就成了噪音。
EmbedFilter:一行 SVD,一次"降噪"
解法简单得令人怀疑:把边缘谱切掉,只保留中间的"体谱"(bulk spectrum)。
具体来说,设 $W_U \in \mathbb{R}^{|V| \times d}$,SVD 后得到 $V_h \in \mathbb{R}^{d \times d}$。取 $V_h$ 的中间 $k$ 行(跳过头尾各 $(d-k)/2$ 行),作为一个线性投影矩阵 $P \in \mathbb{R}^{k \times d}$。文本嵌入 $e$ 经过滤后变成 $Pe$,维度从 $d$ 降到 $k$。
就这么简单。没有额外训练,没有可学习参数,一次离线 SVD,永久生效。
代码实现(来自 GitHub 仓库)核心只有几行:
def set_lm_embed(self, filter_num=896, filter_type="edge"):
hidden_size = self.config.hidden_size
_, _, Vh = torch.linalg.svd(
self.lm_head.weight.float(),
full_matrices=False
)
if filter_type == "edge":
start_idx = (hidden_size - filter_num) // 2
end_idx = start_idx + filter_num
lm_embed.weight = nn.Parameter(Vh[start_idx:end_idx, :])
filter_type="edge" 的命名有点反直觉——它不是"保留边缘",而是"切掉边缘、保留中间"。filter_ratio=2 意味着保留 50% 的维度,filter_ratio=4 保留 25%。
为什么"切边缘"有效:一个频域类比
可以把 unembedding 矩阵的奇异值谱类比为信号的频谱:
- 最大奇异值方向(头部):对应"直流分量",是词表里出现频率最高的 token("the"、".")的方向。这些方向携带的信息量最低,但能量最强。
- 最小奇异值方向(尾部):对应"噪声分量",是词表里极罕见的 token 的方向。这些方向容易受到数值噪声影响,也不稳定。
- 中间奇异值方向(体谱):对应"信号分量",是中等频率、携带实际语义信息的 token 的方向。
数据说话:降维反而涨点
在 MTEB 基准上,EmbedFilter 的效果可以用"反直觉"来形容:
| 模型 | 原始维度 | MTEB 平均分 | EmbedFilter 后维度 | EmbedFilter 后分数 | 变化 |
|---|---|---|---|---|---|
| LLaMA-2 7B | 4096 | 44.2 | 2048 (50%) | 47.8 | +3.6 |
| Mistral 7B | 4096 | 46.1 | 1024 (25%) | 49.3 | +3.2 |
| Qwen2 7B | 3584 | 48.7 | 896 (25%) | 52.1 | +3.4 |
这意味着 LLM 原始嵌入向量里有超过 3/4 的维度不仅没用,还在主动"帮倒忙"——它们承载着高频 token 的引力场,干扰了语义检索。
为什么这件事重要:嵌入模型的"免费午餐"
当前文本嵌入领域的主流做法是:拿一个 LLM,用对比学习在大规模标注数据上微调,得到一个专用嵌入模型(比如 bge、e5、gte)。这条路有效但昂贵——需要百万级标注对、几十张 GPU、数天的训练。
EmbedFilter 提供了另一条路:不训练,只做一次 SVD 降噪。虽然性能仍不如专用嵌入模型,但作为零样本方法,它已经把 LLM 原始嵌入的质量提升到了"可用"区间。更重要的是,它揭示了一个深层结构:LLM 的 unembedding 矩阵同时承担了两个角色——生成时的词表先验,和嵌入时的语义干扰源。这两个角色在数学上是耦合的,但在功能上是矛盾的。
论文结尾提到,这个发现已经指导了他们新的 LLM 嵌入训练方法设计("stay tuned for the release")。如果未来的嵌入训练能从架构层面解耦这两个角色,我们可能会看到 LLM 嵌入质量的根本性提升。
一个更远的联想:AI 的"口头禅"问题
EmbedFilter 解决的是嵌入空间里的"高频 token 污染",但这个问题在生成空间里同样存在。LLM 生成时对"the"、"of"、"is"这类词的过度偏好,本质上就是 unembedding 矩阵头部谱在起作用。当前的对齐训练(SFT、RLHF)通过数据分布来间接抑制这种偏好,但并没有从矩阵结构层面解决。
如果未来有人把 EmbedFilter 的思路反过来用——在生成时动态调整 unembedding 矩阵的谱权重——或许能开发出更精细的"去口头禅"方法。这比单纯调温度参数或改 prompt 要本质得多。
---
论文: Your UnEmbedding Matrix is Secretly a Feature Lens for Text Embeddings 代码: github.com/CentreChen/EmbFilter 作者: Songhao Wu, Zhongxin Chen, Yuxuan Liu, Heng Cui, Cong Li, Rui Yan (人大 + 联想 + 武大)