第 6 节 / 共 12 节

第四章:多模态(ViT/CLIP)

通俗版

模型"看图"和人看图的根本区别

人看一张图,是先整体感知构图,再把注意力集中到感兴趣的区域,然后结合语义理解"这是一只猫坐在椅子上"。

模型"看"一张图,是先把图片切成一个个方块(patch),每个方块变成一串数字,然后把这一串数字当成一个"词"输进去,交给 Transformer 来处理。

以标准 ViT 的教学口径来说,一张 1024×1024 的图片,如果每个 patch 是 16×16 像素,就会切出 64×64 = 4096 个 patch。每个 patch 是 16×16×3(RGB)= 768 个像素值,经过线性投影变成一个向量。真实多模态模型还可能对这些视觉表示做重采样或压缩,所以 4096 是原始 patch 数,不是所有模型最终送进 LLM 的固定 token 数。

为什么不直接把像素值传进去

你可能会想:何必这么麻烦,直接把三百多万个像素值传进去不就好了?

第一,计算量爆炸。Transformer 的注意力计算是 O(N²),300 万个 token 的注意力矩阵是 300 万 × 300 万,根本算不了。

第二,相邻像素之间的信息密度很低。图片里,相邻的几个像素几乎肯定是一个颜色,信息高度冗余。Patch 切割是粗粒度的信息聚合,把"一小块区域"的信息压缩进一个向量,丢掉冗余像素,保留局部纹理、边缘、颜色分布这些有意义的特征。就像你不会把 RAW 格式的每个比特都传给服务器,而是先 JPEG 压缩一下。

工程上必须知道的成本陷阱

在不做后续压缩的教学模型里,一张 1024×1024 图片会产生 4096 个 patch 表示,几乎吃满 4K 上下文窗口。真实图像 API 的视觉 token 规则由具体模型决定,成本应按模型文档或返回用量核对。

视频理解更贵:30 秒视频按 1fps 降采样是 30 帧图片。若仍沿用上面的未压缩教学口径,就是 30 × 4096 = 122,880 个 patch 表示。因此真实视频模型通常会在时间和空间维度继续采样、压缩,不能把原始 patch 数直接当成 API token 账单。

在上述未压缩的教学模型里,分辨率从 1024×1024 降到 512×512、patch 尺寸不变时,patch 数会降到四分之一。真实模型是否同比降低费用与延迟,还要看它的视觉编码和计费规则。

CLIP:让图片和文字"说同一种语言"

ViT 把图片变成向量,文字也有向量,但这两个向量空间是各自独立训练的,互相不认识。CLIP 的做法是:用大量图文配对数据(图片和它的描述文字),训练时强制让描述同一件事物的图文向量靠近,不匹配的推远。

训练完之后,猫的图片向量和"猫"这个字的向量在空间里落在相近位置,图文就"对齐"了。你拿一张新图片,不需要预先定义类别,直接和各种文字描述的向量比相似度,谁最近就是什么——这叫零样本分类(zero-shot)。

图片向量到底怎么进大模型:两种融合范式

CLIP 只解决了"图和文能对齐",但没解决"图片信息怎么参与 LLM 生成"。真正的多模态大模型(GPT-4V、Claude、Gemini)要把图片当成上下文一部分,让模型基于图片来回答问题。业界主要有两条路:

  • 早期融合(LLaVA 派):图片过 ViT 得到一串 token,通过一个小投影层对齐到 LLM 的词向量空间,然后直接和文字 token 拼在一起送进 LLM。就像把图片"翻译"成 LLM 能读的"外语词",之后 LLM 用同一套注意力处理图文。实现简单、训练成本低,但图片 token 会挤占宝贵的上下文长度。

  • 交叉融合(Flamingo / Q-Former 派):图片 token 不进主流。LLM 该怎么走还怎么走,只是每隔几层塞一个 Cross-Attention 层,让文字 token 通过 Cross-Attention "扭头去看"图片 token。图片 token 数量可以先用 Q-Former 压缩到几十个"查询向量",大幅省 context。Flamingo 用这套支持了多图交错输入。

音频也是同样的思路:Whisper 把语音每 80ms 切一帧、算 Mel 频谱、编码成向量,最后也变成一串"音频 token"接进 LLM。所有模态最终都得走"变成 token → 进 Transformer"这条路。


进阶版

ViT 的思路转变

CNN 处理图片的方式是用小窗口(卷积核)在图片上滑动,每次只看局部。要看到全局关系,需要堆叠多层卷积,信息才能从局部逐层传播到全局。这种设计有归纳偏置——它假设图片的局部特征比全局特征更重要,相邻像素的关系比远距离像素的关系更重要。这个假设对自然图片通常成立,所以 CNN 在数据量有限时表现很好。

ViT 的做法是直接把 patch 序列扔给 Transformer,Transformer 的注意力机制天然是全局的——每个 patch 在第一层就可以和所有其他 patch 做注意力计算,没有局部优先的假设。代价是 ViT 没有任何先验假设,需要从数据里自己发现"哪些位置的信息更相关"这条规律,所以需要大量数据才能学好。这也是为什么 ViT 是随着 CLIP 这种大规模预训练数据集的出现才真正起来的——数据少 CNN 更稳,数据够多之后 ViT 才能发挥出来。

CLIP 对比学习的训练细节

一个 batch 里有 N 张图片和对应的 N 段文字描述。CLIP 把每张图片和每段文字都编码成向量,构成一个 N×N 的相似度矩阵。对角线是正样本(图片 i 对应文字 i),非对角线是负样本。损失函数强制对角线相似度最高,其余最低。

batch size 越大,任务越难,模型学到的表示越细致。实际训练时 batch size 会开到 32768 甚至更大,使得每张图片要从三万多个候选里区分出自己对应的文字,逼着模型学到非常精细的语义表示。


读完继续 用互动实验验证上面的内容
05 · 互动实验 多模态

观察视觉 token 与注意力配对规模如何增长。

100%