第 15 · 多模态 · 8 min
当模型读取图像时
块嵌入、ViT、CLIP。文本Transformer如何通过将图像视为标记网格而变成多模态。
模型并不真正"看见"
当你向 GPT-4o 或 Claude 发送一张照片,它告诉你图片里有什么,这背后并没有一双"眼睛",也没有目标检测器,没有视觉系统。模型不是在"看"图像——它是在读取一串向量。
这就是现代多模态的核心把戏:将任意类型的数据(图像、音频、视频)转化为类似文本 Token 的表示。完成这种转换之后,标准的 Transformer 便能接手一切。
关于本章范围的说明。 我们这里讨论的是理解图像的模型(描述图像、回答问题、读图表)。从文本生成图像的模型——Stable Diffusion、DALL-E、Midjourney——架构则完全不同,会在第 21 章里专门讲。
ViT:将图像切成图块
图像处理的参考架构叫做 ViT(Vision Transformer,视觉变换器),由 Google 于 2020 年提出。
它的思路简单到令人困惑:将图像切成固定大小的小方块(图块,Patches)——默认是 16×16 像素。每个图块被展平成一个向量,再投影到 Transformer 的嵌入空间中。
一张 224×224 像素的图像,被切成 16×16 的图块后,产生 196 个图块——196 个 Token。这些 Token 被送入 Transformer,就像文本 Token 一样。注意力机制处理它们、关联它们、提取相关特征。
每个图块在图像中的位置通过位置编码来表示,与文本 Token 的位置编码机制完全相同。
探索图块化
下面是一张 16×16 的简化图像(ViT-Base 实际工作在 224×224 上)。改变图块大小,观察分辨率和 Token 数量如何变化。
图像被切成方形 patch,每个 patch 通过线性投影变成一个 token。Transformer 不再分清输入是文本还是图像网格——它以同一种方式处理这个序列。
你一拖动滑块,取舍立刻就显现出来:图块越小,图像越清晰,但 Token 数量会爆炸——而注意力是 O(n²) 的开销(第 04 章),图块边长减半,Token 数就翻四倍,代价翻十六倍。每一个视觉模型都在做这个权衡:图块要多到足够读懂一张图表,又不能多到把推理成本拖垮。
特殊的 [CLS] Token
在早期的 ViT 中,一个特殊的 [CLS] Token 被添加在序列开头。注意力在所有图块之间传递信息后,[CLS] 向量被用作整张图像的全局表示。
这个向量随后被送入一个分类头,来回答"这是什么?"
当下的多模态模型——GPT-4V、Claude 3、Gemini 那一代在 2023—2024 年打开了局面,如今所有大模型都能做到——走的是另一条路:图像图块 Token 被拼接到文本 Token 后面,合成同一条序列。到这一步就不需要再做任何特别的事了:平常的自注意力自然会让每个词去看图像的每一小块,反之亦然。这也正是这种做法如此省事的原因——不需要任何专用机制,Transformer 原样拿来用。
也存在另一种变体:图像单独保留成一条序列,由文本通过交叉注意力去查询它(Flamingo 和 Llama 3.2 Vision 就是这么做的)。模块化更好,但没那么简洁。
CLIP:对齐图像与文本
在将图像和文本混合到同一个 Transformer 之前,图像嵌入和文本嵌入必须存在于同一个向量空间中。
这正是 CLIP(OpenAI,2021)解决的问题。CLIP 并行训练两个编码器——一个处理图像,一个处理文本——目标只有一个:让一张图像与其描述文字的表示尽可能靠近。
在数亿(图像,文本)对上训练之后,CLIP 产生了这样的空间:"一张猫的照片"这段文字与一张真实的猫的照片,会拥有相近的向量。这种特性让大语言模型得以"理解"注入其上下文的图像。
视觉语言模型的架构
当前的多模态大语言模型通常由以下部分组成:
- 视觉编码器(通常是预训练的 ViT),将图像转化为图像 Token。
- 投影层(一个小型 MLP),将图像 Token 映射到大语言模型的嵌入空间。
- 大语言模型,接收混合序列(图像 Token + 文本 Token)并生成回复。
这个"投影层"往往是将一个文本大语言模型适配为多模态时唯一需要训练的部分——其余部分保持冻结。
模型实际"看到"的是什么
我们很容易想象模型拥有深刻的"视觉理解"。但实际上,发生的是这些:
每个 16×16 的图块首先被摊平:16 × 16 × 3 个颜色通道 = 768 个数值,排成一条列表。这条列表接着经过一次学习得到的线性投影——一个与模型其余部分一起训练出来的矩阵——变成嵌入向量(ViT-Base 是 768 维)。所以它并不是像素的平均值:什么都没有被抹平,图块内部的排布完整地保留在了向量里。但这个表示依然非常局部——这个向量对图像其余部分发生的事一无所知。
正是所有这些向量之间的注意力,重建了空间关系、检测了边缘、识别了形状。模型没有"圆形"或"人脸"的内置概念——它从统计规律中发现这些。
这就是为什么视觉大语言模型在一些对人类而言极为简单的任务上表现令人意外(数物体的个数、区分左右),却在高级任务上表现卓越(解读图表、阅读处方)。
那音频呢?
同样的原理——把任意一种模态转换成 Token 序列——也适用于语音。OpenAI 的 Whisper(2022)至今仍是语音转文字在开源领域的参考模型——原生多模态的模型如今做得更好,但都是闭源的。它的架构是一个 encoder-decoder Transformer,和翻译模型完全一样。
诀窍在于:把音频信号转换成 Mel 频谱图(Mel spectrogram)——一张二维图像,纵轴是频率,横轴是时间。这张频谱图上的每一个小方块都成为一个输入 Token,就像 ViT 处理图像时的图块一样。然后 Whisper 在输出端产出文本 Token。
对于语音生成(text-to-speech,TTS),原理则反过来:从文本生成音频 Token。ElevenLabs、OpenAI TTS、Suno(用来做音乐)都使用 Transformer,被训练去预测下一个音频 Token。所谓"克隆某个亲人的声音",本质上就是把几分钟的录音词元化,作为条件输入。
这一飞跃来自原生多模态语音模型,由 2024 年的 GPT-4o realtime 和 Gemini Live 开启。这些模型不再在内部做"文本 ↔ 音频"的来回转换:它们直接在一个混合了文本 Token 和音频 Token 的空间里推理。于是延迟可以这么低(约 300 毫秒),韵律也更自然——模型可以一边说话一边"微笑",因为它从未离开过音频域。
这个区分很要紧,因为很多语音助手其实并不属于这一类。比如 Claude 的语音模式,是把三个独立部件串起来:先转写,再走文本模型,最后语音合成。效果很好,但模型从头到尾没有听到过你的声音——它拿到的只是别人替它转成的文字。
和视觉一样,底层架构仍然是一个 Transformer。区别只在于 Token 的模态不同。
Token:通用货币
多模态的真正启示在于:Token 是一种通用的抽象。
文本 → Token。 图像 → Token(图块)。 音频 → Token(频谱图的切片)。 分子 → Token(原子)。
只要你能将某种模态转化为一串稠密向量,Transformer 就能处理它。这就是为什么那些彻底改变自然语言处理的相同架构,如今正在革新视觉、音频、生物学和物理学。
Transformer 是一台 Token 引擎。研究人员不断发明新的方式,将这个世界词元化。
这也让一个问题越来越尴尬。同一个模型既能读文本、又能描述照片、还能转写语音、顺带写代码:那我们凭什么判定它比另一个模型更好?总得有个分数——而任何分数都是一次简化。下一章要看的,是各种基准测试到底测出了什么,以及它们必然会漏掉什么。
更新于