这是多模态系列的第三篇。《边想边说》讲了模型想好之后怎么开口《给音视频一个共享时钟》讲了多路输入进来之后怎么对时。今天回到更源头的一步:画面和声音,究竟以什么「形态」进入模型?

文字天生是离散的——汉字就那么几万个,词表再大也是有限的清单。而世界天生是连续的——光是亮度的连续变化,声音是气压的连续波动,中间没有格子。于是每个多模态模型在动第一行代码之前,都要回答同一道选择题:把连续的世界喂给模型时,是把它翻译成「字」(离散 token),还是保持为「向量」(连续特征)?

这篇讲清楚两条路线各自的道理、各家模型怎么选,以及为什么答案正在收敛。

一、先看清 LLM 的母语:离散

大语言模型处理文字的全流程,从头到尾都是离散的:

「热」词表编号#8271查表变向量embeddingTransformer词表上的分布softmax → 抽签分词离散 → 连续思考连续 → 离散生成的每一步 = 在有限词表里抽签;有限,才有得选
文字的一生:进来是编号,出去也是从有限选项里抽一个编号

一句话先被分词器切成词表里的编号(「热」→ #8271),编号查表变成向量,穿过 Transformer,最后一步再变回一个关于词表的概率分布——生成,就是在这个有限的清单里「抽签」。第一篇里 Talker 采样语音 token 的抽签,和这里是同一件事。

注意这个结构性事实:「抽签」需要有限的选项。softmax 只会在一个有限集合上分配概率——你没法在「所有可能的浮点向量」这个无限集合上掷骰子。这个事实决定了后面几乎所有的架构选择,先记住它。

二、路线 A:把画面和声音也变成「字」

第一条路线顺着 LLM 的母语走:既然模型只认识离散 token,那就给图像和声音也各编一本词典

做法叫向量量化(VQ)。用一个编码器把图像切块、把声音切帧,得到特征向量;再学习一本「码本」——可以理解为视觉或声音的字典,比如 8192 个条目;每个特征向量吸附到字典里离它最近的那个条目,输出条目编号。连续信号就这样变成了一串「字」。

特征空间 + 一本「视觉词典」(码本)#512#89○ 真实特征 ■ 词典条目:吸附到最近的词输出:一串编号#512#89#89#7✓ 编号可并入 LLM 词表, 和文字彻底平权、可被抽签✕ 两个不同的细节(左图两点) 吸附到同一个词——失真发生
向量量化:特征吸附到码本里最近的条目,连续世界变成一串编号——代价是吸附即失真

这条路线的旗手是 Meta 的 Chameleon:一张 512×512 的图被切成 32×32 共 1024 个 token,码本 8192 个条目,和 BPE 文本 token 合在同一本 65536 词的大词表里——图像和文字在模型眼里彻底平权,一个 next-token 目标同时学会看图、写字、画图。智源的 Emu3 把这条路走到极致:图像、视频全部离散化,宣言就叫「next-token 预测就是你需要的一切」。

语音这边离散化更成熟,因为语音天然要「生成」:

  • Kyutai 的 Moshi 用 Mimi codec 把 24kHz 波形压成每秒 12.5 帧的多层 RVQ 编号,第一层还专门向 WavLM 蒸馏,让它承担「语义」、其余层承担音色细节;
  • 智谱的 GLM-4-Voice 更极简:单码本、12.5Hz、175bps 的超低码率语义 token;
  • 第一篇里 Qwen-Omni 的 Talker 吐出的语音 token(qwen-tts-tokenizer)、MiniCPM-o 的 S3 token,也都是这一路。

离散路线的回报清清楚楚:统一。理解和生成变成同一个游戏(预测下一个 token),会「读」就会「写」。代价也清清楚楚:吸附即失真——字典再厚也是有限的,两个细微不同的画面块可能吸附到同一个条目上,OCR 小字、纹理细节、说话人独特的音色,都在量化那一下被抹掉一层。另外序列也不短(一张图上千 token),码本本身还难训练——Chameleon 论文花了整整一节讲怎么用 QK-Norm 等手段压住训练不稳定。

三、路线 B:让向量直接进来

第二条路线反过来:不做翻译,让向量以向量的身份直接进来

视觉编码器(ViT)把图像变成一串浮点向量,过一个投影层对齐到 LLM 的嵌入空间,然后当作普通 token 一样拼进序列——只是这些「软 token」不在词表里,是词表之外的合法公民。声音同理:Whisper 一类编码器的连续特征直接投影进来。

🖼️ 图像 / 🎙️ 声音路线 A:离散——变成「字」VQ / codec查「视觉 / 声音词典」#512 #89 #7 …离散编号✓ 可进可出(能抽签生成) ✕ 量化有损路线 B:连续——保持向量编码器ViT / Whisper[0.12, −0.7, …]连续向量(软 token)✓ 保真、复用预训练编码器 ✕ 只进不出LLM
两条路线:离散——变成「字」,可进可出;连续——保持向量,高保真但只进不出

这条路线是理解(而非生成)的绝对主流,从极简到精巧排一排:

  • Fuyu 是极简的极致:连视觉编码器都不要,图像块线性投影直接进 decoder;
  • LLaVA 的经典配方:CLIP 视觉编码器 + 一层线性投影(后来升级为两层 MLP),简单到令人发指,效果奠定了一个流派;
  • Qwen2-VL / 2.5-VL:原生分辨率 ViT,相邻 2×2 个 patch 经 MLP 合并成一个 token,压缩序列长度;
  • MiniCPM-V:用重采样器把每张图压到固定 64 个 token,4.5 代的 3D-Resampler 更是把 6 帧视频联合压成 64 个 token(96 倍压缩)——上一篇讲过的「把时间压进 token 包」;
  • 音频侧,Qwen2.5-Omni 的 Whisper 系特征(40ms 一个)、Qwen3-Omni 的 AuT 特征(80ms 一个),全是连续向量进模型。

好处同样明确:保真——没有字典这一道关卡,OCR 的小字、图表的细线、语气里的犹豫都完整保留;还能复用现成的预训练编码器(CLIP、SigLIP、Whisper 都是白嫖不完的宝藏),端到端可微,训练顺滑。

但别忘了第一节的伏笔:连续向量只能进、不能出。模型没法在无限的向量空间里抽签,所以纯连续路线的模型只能用文字回答你——它看得懂图,却画不出图。

四、答案的收敛:理解连续,生成离散

把两条路线的长短板放在一起,主流答案几乎是推导出来的:

  • 理解要保真 → 输入侧用连续;
  • 生成要可采样 → 输出侧用离散。

前两篇的主角正是这个配方的标准样本:Qwen-Omni 和 MiniCPM-o「听」的是连续特征(Whisper/AuT 向量),「说」的是离散 token(codec 编号)——输入侧连续、输出侧离散,一进一出各用其长。

更有意思的是把这个矛盾直接做成显式设计的模型:

  • DeepSeek 的 Janus 给同一个模型装了两套视觉系统:理解走 SigLIP 连续特征,生成走 VQ 离散 token,共用一个自回归主干——名字取自双面神,一张脸看,一张脸画;
  • 月之暗面的 Kimi-Audio 在输入侧干脆不做选择题:离散语义 token 和连续声学特征并联输入(都是 12.5Hz,一一对齐),语义的归离散、细节的归连续。
输入:连续输入:离散能生成非文本仅文字Qwen-Omni 系 🔊MiniCPM-o 🔊Transfusion 🖼️↑ 图像走连续扩散(连续派攻生成的特例)Chameleon 🖼️Emu3 🖼️GLM-4-Voice 🔊Moshi 🔊Kimi-Audio 🔊Janus 🖼️输入混合:离散语义+连续声学理解用连续、生成用离散LLaVAQwen2.5-VLMiniCPM-VFuyu↑ 纯理解:看得懂图,却画不出、也不出声(几乎没人住这格:吃了量化的亏,还不要生成的甜)🔊 输出语音 🖼️ 输出图像 · 上半区都在「生成」,但生成的模态不同,别混为一谈位置为示意;横轴看输入形态,纵轴看能否生成非文本——下半区四个只输出文字
一张地图:横轴是输入形态,纵轴是能否生成非文本模态;🔊 生成语音、🖼️ 生成图像——常被笼统叫作「多模态生成」的其实是两件事

这里要拆穿一个常见误解:图上半区的模型都在「生成」,但生成的东西天差地别。Qwen-Omni、MiniCPM-o 吐的是语音(离散 codec token),它俩生成不了图像;Chameleon、Emu3、Janus 画的是图像(离散 VQ token);Transfusion 也画图像,但走的是连续扩散。换句话说,能「看图」不等于能「画图」——Qwen-Omni 看得懂你发的照片,却生成不出一张新照片(Qwen 家能生成图的是 Qwen-Image 那个独立模型,不是 Omni 系列)。而下半区的 LLaVA、Qwen2.5-VL、MiniCPM-V、Fuyu 连语音都不出,只会用文字回答。

顺带一个彩蛋:Mimi、GLM-4-Voice、Kimi-Audio、Qwen3-Omni 的 AuT——不约而同都落在每秒 12.5 个 token(80ms 一格)。上一篇说 TMRoPE 的刻度从 40ms 换到 80ms 时提过「刻度多大不重要」,但行业显然在用脚投票:80ms,正在成为语音 token 的共识心跳。

五、战线仍在移动

两派都没闲着,都在攻对方的腹地。

离散派攻理解:Chameleon 和 Emu3 证明了全离散模型照样能做理解任务,代价是上面说的失真与训练难度——目前在细粒度任务上仍普遍吃亏。

连续派攻生成,这边更热闹:Meta 的 Transfusion 在同一个 Transformer 里让文字走自回归、图像走扩散——图像压根不量化,以连续向量形式被「去噪」出来;何恺明团队的 MAR 则给自回归配了一个扩散头,每一步不再从词表抽签,而是用一个小扩散过程「采样出一个连续向量」。还记得第一节说的「无限集合上没法掷骰子」吗?扩散模型恰恰就是那颗能在连续空间里掷的骰子——只是掷一次要多算几步。

所以这场离散与连续之争没有终局:离散是为了「能选」,连续是为了「不丢」。今天的均衡解是理解连续、生成离散、必要时混合或解耦;等连续采样的骰子掷得足够快,格局也许还会再变一次。

六、写在最后

三篇串起来,一个多模态模型的输入输出全景就完整了:

  1. 进门(本篇):世界以什么形态进入模型——离散保「能选」,连续保「不丢」;
  2. 对时TMRoPE):进来的各路信号如何共享一条时间轴;
  3. 开口Thinker-Talker):想好的内容如何变成文字和声音流出来。

而贯穿三篇的其实是同一种工程品味:不要让一个表示承担两种使命。时间语义交给位置编码而不是排队顺序,选词交给 token 而语气交给隐层,保真交给连续而采样交给离散——各司其职,然后在合适的地方汇合。

参考