
上一篇写 RAG 的时候,我提到了 embedding——把文字变成向量,让模型可以做语义检索。
写完之后我就开始想另一个问题:图片是怎么做到这件事的?
当我在 ChatGPT 或者 Claude 里上传一张截图,让它帮我解释里面的内容,模型是怎么"看懂"这张图的?
图片在计算机里是什么
我先想搞清楚一件事:计算机眼里的图片到底是什么。
在计算机里,一张图片本质上就是一个数字矩阵。以最常见的 RGB 图片为例,每个像素点都有三个数值,分别对应红、绿、蓝三个通道,值的范围是 0 到 255。
一张 512×512 的图片,就是一个 512×512×3 的数字数组,共计约 78 万个数字。
计算机"存图片"这件事就是这样——存一堆数字。
但这堆数字本身没有"猫"或者"表格"或者"代码截图"这些概念,它只是数字。从一堆数字里读出"这是一只猫",就是 AI 理解图像要解决的问题。
早期的解法:CNN
在 Transformer 出现之前,图像识别的主流方案是 CNN(卷积神经网络)。
CNN 的做法是:用一个小窗口(卷积核)在图片上一块一块地扫,每次只看一小块区域,提取局部特征。扫完一遍之后,这些局部特征再被逐层叠成更抽象的特征。
可以粗略地理解为:
- 第一层识别出"边缘"和"颜色"
- 中间层识别出"纹理"和"形状"
- 最后几层识别出"耳朵"、“眼睛”、“毛发”
- 最终输出"这是一只猫"
CNN 在图像分类这个任务上做得很好,但它有个局限:它的感受野是固定的,很难建立图片里跨区域的长距离关系。比如理解"这是一张表格",你需要同时感知行、列、标题这些分散在各个位置的元素,CNN 的局部扫描就比较吃力。
现在的主流方案:ViT
ViT 全称是 Vision Transformer,2020 年由 Google 提出。它做了一件很有意思的事:把图片当成文字来处理。
Transformer 处理文字的方式是把一段话切成一个个 token,每个 token 变成一个向量,再通过注意力机制让每个 token 关注其他所有 token。
ViT 的做法几乎一模一样:
- 把图片切成若干个固定大小的小方块,叫做 patch(比如 16×16 像素一块)
- 把每个 patch 展平成一个向量,再经过线性变换,变成一个 patch embedding
- 加上位置编码,告诉模型这个 patch 在图片的哪个位置
- 把这一排 patch embedding 送进标准的 Transformer 里处理
这样,一张图片就被转换成了一串"视觉 token",和文字 token 的形式完全一致。
以一张 224×224 的图片为例,如果每个 patch 是 16×16,那整张图片会被切成 196 个 patch,也就是 196 个视觉 token。
多模态模型怎么把图片和文字连起来
到这里就到了我最好奇的部分:像 GPT-4o 或者 Claude 这样的多模态模型,是怎么同时理解图片和文字的?
答案是:得让图片的表示和文字的表示落在同一个向量空间里,这样才能互相比较。
说到这里就绕不开 CLIP(Contrastive Language-Image Pre-training),OpenAI 在 2021 年发布的。
CLIP 的训练方法说起来不复杂:给模型大量"图片 + 文字描述"的配对,让匹配的图文对在向量空间里靠近,不匹配的推远。
训练完之后,CLIP 拥有两个编码器:
- 一个图像编码器(Image Encoder)
- 一个文字编码器(Text Encoder)
两个编码器的输出在同一个向量空间里,所以可以直接做相似度比较。这也是为什么用 CLIP 可以做"以文搜图"——把文字和图片分别 embed,然后找最近邻。
搞清楚 CLIP 之后,多模态模型的工作方式就好理解了:
- 用一个 Vision Encoder(通常是 ViT)把图片变成一组视觉 token
- 把这组视觉 token 和文字 token 拼在一起,一起送进语言模型
- 语言模型通过注意力机制,让文字和图片的 token 互相感知,最终生成回答
就是这么直接:图片被转成 token,和文字 token 混在一起,统一处理。
小结
现在回头看,整件事没我想象的神秘:
- 图片是像素数组,本质是数字
- ViT 把图片切成 patch,每个 patch 变成一个向量,形式和文字 token 一致
- CLIP 做了图文对齐,让图片和文字可以在同一个语义空间里比较
- 多模态模型把视觉 token 和文字 token 一起送进 Transformer,用注意力机制做融合
当我把截图发给 AI 让它解释,背后大概就是这个过程:图片切成 patch,变成 token,和我的问题拼在一起进了模型,然后模型输出回答。
这个系列还有很多可以继续深挖的地方,但对我现在的目的来说,先搞清楚主流程就够了。