你可能会想,Tokenizer 不就是把文本切成词吗?我最早也是这么以为的,直到我开始研究多模态模型,才发现图片和视频也有自己的 tokenizer,而且它们长得完全不像。更麻烦的是,这三种 tokenizer 各说各话,让“统一”变成了一场灾难。

先说文字。现在大模型几乎都在用 BPE(字节对编码)。它的思路特别简单:从单个字符开始,反复统计相邻字符对的出现频率,把最高频的合并成一个新符号。比如 “low” 和 “lowest” 都出现,“low” 就会被合并,模型就不再需要单独记 l-o-w。这个过程迭代到词表达到预设大小为止。
# BPE 的合并循环(伪代码)
while len(vocab) < target_size:
pair = most_frequent_pair(corpus) # 找最高频相邻对
merge(pair) # 合并成新符号
BPE 有两个特点很关键:第一,输出是离散的整数 ID;第二,每个 ID 没有固定的语义长度,它只是一个“词碎片”。你问模型 “low” 和 “lowest” 的关系,模型看 ID 就能知道,因为它们共享 “low” 这个前缀。
图片的 tokenizer 完全是另一套逻辑。ViT(Vision Transformer)把一张图切成固定大小的正方形小块,比如 16×16 像素。一张 224×224 的图,切完得到 14×14=196 个 patch。每个 patch 展平后经过一个可学习的线性层,变成一个向量,再加位置编码,就变成了模型的输入。
注意,这里跟 BPE 有本质区别:ViT 的 patch 是连续的向量,不是离散 ID。而且 patch 的大小是人为定的,跟图像的语义内容完全无关。同一张图,换个切法,模型看到的东西就变了。
我最早以为图片的 tokenizer 是把每个像素变成数字,后来才发现是切 patch。这让我困惑了很久——为什么不像 BPE 那样找重复模式?后来想通了:图像没有自然的“词”边界。一个像素的意义完全取决于周围像素,强行聚类成离散符号反而会丢失大量信息。ViT 干脆放弃语义,用固定大小的 patch,把语义学习交给模型自己。
视频的 tokenizer 又把难度提升了一个维度。因为视频有时间。常见的做法是用 3D patch,比如 ViViT 里的立方体 patch:同时切空间和时间,例如 16x16x2(两帧)。这样每个 token 代表一个时空小区域,包含了几帧内的运动信息。
但时间维度带来的麻烦是 token 数量爆炸。一秒钟 30 帧的视频,切成 16x16x2 的 patch,每两帧合并成一个时间块,那么一秒钟有 15 个时间块;每个时间块在 224×224 的空间上产生 14×14=196 个 patch,所以一秒钟就有 196×15=2940 个 token。如果是 1 分钟视频,就是 176,400 个 token。这个数量直接让注意力机制的计算量炸裂。
| 模态 | Tokenizer | 输出类型 | 典型token数 | 时间维度 |
|---|---|---|---|---|
| 文本 | BPE | 离散整数ID | 一句话约20-100 | 无 |
| 图像 | ViT Patch | 连续向量 | 一张224×224图约196 | 无 |
| 视频 | 3D Patch | 连续向量 | 一秒约2940 | 有 |
到这里,你应该已经清楚了三种 tokenizer 各自长什么样。那接下来的问题就是:为什么不能把它们统一成一个?我仔细想了想,发现困难几乎无处不在。
粒度不对齐:一个 token 代表的东西完全不一样
文本 token 是一个词或子词,语义颗粒明确。图像 token 是一个固定大小的空间区域,可能只是一片树叶的一部分。视频 token 还多了一个时间维度。模型在处理跨模态任务时,必须自己学会“这个 patch 里的内容对应哪个词”,但 tokenizer 本身不提供任何对齐信息。
离散 vs 连续:一个用 ID,一个用向量
BPE 输出离散 ID,可以直接用交叉熵预测下一个 token。ViT patch 是连续向量,不能直接做自回归。为了统一,有人用 VQ-VAE 把图像也离散化,比如 DALL-E 就是这么干的。但离散化会丢失细节,特别是高分辨率图像和视频。所以后来的多模态模型,比如 Gemini,干脆混合使用:文本用离散 token,图像用连续 patch,然后让模型自己适应。
token 数量失衡:注意力计算量跟着爆炸
一句话 20 个 token,一张图 196 个 token,一秒钟视频近 3000 个。注意力机制是两两交互的,token 数量翻倍,计算量翻四倍。所以很多视频模型只能处理几秒钟的片段,再长就内存爆炸。这不是工程优化能解决的问题,而是算法复杂度的问题。
信息密度差异:一个 token 的“含金量”完全不同
一个文本 token 可能压缩了“美国总统”这个复杂概念,而一个图像 patch 可能只是背景里的一片纯色块。模型需要决定把注意力花在哪里,但注意力本身是均匀分配的。这就是为什么多模态模型经常在图文对齐上犯低级错误——它们的 token 之间没有优先级概念。
训练目标不统一:预测下一个词 vs 预测下一个 patch
文本可以自回归,预测下一个 ID 很自然。图像呢?预测下一个 patch 没有明确顺序,从左到右还是从上到下?所以图像模型常用掩码重建。视频更复杂。训练目标不一致导致多模态模型往往需要多个损失函数叠加,但各任务之间会互相干扰。
那么有没有统一的希望?有。一条路是把所有模态都离散化,用 VQ-GAN 把图像和视频也变成离散 ID,这样整个模型就是一个纯自回归 Transformer。另一条路是像 Perceiver 那样,用一组固定长度的潜在向量作为“瓶颈”,把任何模态的输入都压缩成固定数量的 token。但这两条路都有代价:离散化丢失细节,瓶颈压缩会模糊语义。
还有一个思路是像 Meta 的 ImageBind 那样,不统一 tokenizer,而是统一 embedding 空间——让图像、文本、音频、视频的表示都对齐到一个共同的语义空间。但这并不是 tokenizer 的统一,而是模型层面的对齐。
我的判断是:多模态 tokenizer 的统一困难,本质上不是技术问题,而是因为不同模态的信息结构不同。文字是离散符号系统,图像是连续空间信号,视频是时空连续信号。强行用同一种 tokenizer,等于要求它们用同一种原子单位来切分,这违背了各自的物理本质。未来更可能的路线不是发明一个万能 tokenizer,而是设计一个能接受异构 token 序列的统一模型架构。已经有了一些尝试,比如 Chameleon 用混合 tokenizer 让文本和图像可以交错输入。
所以下次你看到“多模态大模型”的宣传时,可以想想它背后是怎么把文字、图片、视频变成 token 的。它们各自为政,却又被硬塞进同一个模型。统一 tokenizer 这件事,可能比我们想象的要难得多——但正因为难,才值得研究。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/222.html