跳到主要内容
稠密稀疏不站队,一次前向全出——UEmbed 这张图我画错了一遍

稠密稀疏不站队,一次前向全出——UEmbed 这张图我画错了一遍

画唠
画唠

· 阅读约 4 分钟

“稠密 vs 稀疏”这一对,被讲得跟两大门派似的,各有信仰,选边之前还得先背一遍各自的优劣。我先撂一句:不是门派,是没被画明白。

arXiv 八月初挂出来的 UEmbed(2608.02583),干的事说穿了特别朴素——别选了,两个一起出。一次前向传播,稠密向量和稀疏词项权重同时生成。

我第一眼的理解是错的,但错的挺有代表性。我以为“一起出”就是模型跑两遍,一遍走稠密头、一遍走稀疏头,拼起来管这叫统一。画出来是这样:

   输入 ──► 前向 ──► 稠密向量
        └─► 再前向 ──► 稀疏向量

两遍计算,省了个模型,仅此而已。我当时还想,这有啥好发的。

然后去读它到底怎么做的。不对,人家是一遍。机关在这儿:在输入后面接上 N 个可学习的特殊标记,同时把词表切成 N 个不相交的子集。每个特殊标记的因果隐藏状态,负责预测自己那个子集上的稀疏权重,最后各子集一拼,就是完整的稀疏向量。

重来,画第二遍:

   输入 + [特殊标记₁][特殊标记₂]…[特殊标记_N]
        │
        ▼  一次因果前向传播
   ┌────────────┬────────────┐
   ▼            ▼            ▼
  子集₁权重    子集₂权重    …子集_N权重 ──拼──► 稀疏向量
   [CLS]隐藏态 ──────────────────────► 稠密向量

看到这张图我才咔哒一下扣上——稀疏那部分根本不是另起炉灶算的,是搭在因果生成的便车上的。特殊标记就像挂在输入尾巴上的一串“探针”,一个探针管一块词表地盘。因为整个模型是 decoder-only,这些探针的位置天然就能干“看到前文之后预测词项权重”这件事,跟 next token prediction 用的是同一套肌肉。

打个比方:稠密向量是模型给你的“整体印象分”,稀疏向量是它给你开的“关键词清单”。以前的架构里这俩是两套人马各开各的会,UEmbed 让同一个人在同一个会上顺手把两张表都填了。

这个比喻有地方漏风,照例标出来:清单听着像模型在“挑选”关键词,好像有什么取舍判断。其实没有——每个探针是在自己子集上打权重,打多高打多低是连续的,不是挑与不挑的二元动作。真正的“稀疏”来自大多数权重接近零。抓“一次算两份”这个大方向,清单比喻够用;抠细节就回到“子集上的权重预测”这个真实机制。

翻车记录也留着。第二遍画图时我把子集画成了“重叠的”,想着每个探针看全词表再各有侧重。盯了半天觉得不对——重叠的话,同一个词的权重会被多个探针各预测一遍,拼的时候打架。回原文看,人家明确写的是 N 个不相交子集,一人一块地,不越界。这个“不相交”不是随便定的,它就是拼接能成立的前提。我自己画错一笔,才意识到这一笔是承重墙。

数字不堆了,挑一个:9B 版在 MMEB-v2 上稠密 71.8、稀疏 71.0,跟公开数据训的基线比是能打的。BEIR 上跟强基线相当,没吹超。我个人挺欣赏这种“相当”就写“相当”——见多了动不动碾压的,这种反而可信。模型放了 2B、4B、9B 三个规模,公开数据训的,想自己试是有梯子的,2B 那个随便一张卡就能摸。

那它酷在哪?我觉得酷在它顺手掀了一个更老的问题:稀疏检索以前基本是纯文本的游乐场,BM25 那一挂的。UEmbed 这么一搞,稀疏表示也是模型生成出来的了,那多模态输入自然也能有稀疏表示——图文进来,清单里该有啥有啥。论文里管这叫统一到智能体应用,我自己的读法糙一点:以前检索系统稠密一路、稀疏一路,两条流水线两套维护;现在源头合流了,下游怎么组合是你的事。这玩意儿真的太酷了——不是酷在分数,是酷在“原来这两条路可以在一个前向里合流”这个结构本身。

照例自检:现在你能不能给一个没接触过的人画明白“它怎么一遍出两份”?画到“探针”那里卡住的话告诉我,那附近我可能也还有没画透的地方。

下期候选还是那几个,embedding 那张二维平面的基础图我欠了好久了。这期先到这儿。

画唠
画唠

把被讲玄的概念用图 + 比喻 + 动手实验拆到咔哒扣明白,错的也保留。

查看主页 →