多模态大模型是怎么”看图说话”的?视觉编码器入门
拿一张商品图去问多模态模型:”图里有几个瓶子?”它答得挺准。换个问法:”从左数第三个瓶子在第二个的左边还是右边?”它开始含糊,甚至答反。同一张图,同一个模型,为什么一个能答一个不能?
大多数人把这归结为”模型还不够聪明”。其实这是两件不同的能力:认出东西和理解空间关系,在模型内部走的是完全不同的路径。搞清这条路径,你就知道该怎么提问、该给什么图。
第一步:图片先被切成”词”
语言模型只认识 token,不认识像素。所以第一步必须把图翻译成 token
序列。
主流做法是把图切成固定大小的小块,常见是 16×16 或 14×14 像素一个
patch。一张 1024×1024 的图,切成 16×16 就是 64×64=4096 个 patch,每个
patch 拉平成一个向量,就得到 4096 个”视觉词”。
这一步的关键含义:模型看到的不是一张图,而是一串排好队的方块。图的二维结构在切块时就被压平成一维序列了,后面的处理全靠位置编码把”谁在哪”补回来。
第二步:视觉编码器把方块变成”有含义的向量”
切完块只是原始像素,还需要一个编码器(通常是一个 ViT,视觉
Transformer)把每个 patch 变成富含语义的向量。
它的训练方式和语言模型不同:不是预测下一个词,而是对比学习。拿一亿多组”图+配文”数据,让图片向量和它对应的文字向量在同一个空间里靠近,和无关的文字向量远离。这就是
CLIP 那套思路。
结果是:一张”红色运动鞋在木地板上”的图,它的向量会天然靠近”红色””运动鞋””木地板”这些词向量。模型不需要被告知这是什么,它只是知道这张图”离哪些词近”。
第三步:投影层把视觉向量”翻译”成语言模型能读的输入
编码器输出的向量和语言模型的词嵌入空间并不在同一个坐标系里,中间需要一个投影层(也叫
connector)做一次线性或小 MLP 映射。
投影层通常是整个多模态模型里参数量最小的部分,但它决定了信息损耗。映射得好,视觉细节完整进入语言模型;映射得粗,进去的就只剩”大概是个什么场景”。很多开源模型的差距,不在编码器,而在这层。
第四步:分辨率决定它”看多细”
这是最实用的一条。patch 大小固定,图越大,切出的 token
越多,模型能看到的细节越多。
- 224×224 的图,16 像素 patch,只有 196 个视觉
token——只够判断”这是什么”; - 1024×1024,4096 个 token——能看清标签文字、纹理、构件;
- 但 token 有上限。超了就会被降采样或裁切,细节直接丢失。
所以同一张图,你上传原图,和上传一张被微信压缩到 800
像素宽的截图,模型看到的东西根本不是一个量级。很多”AI看图不准”的案例,本质是图太小。
第五步:为什么空间关系总出错
认出物体靠语义向量,判断”左边右边”靠位置编码。而位置编码在切片那一步就已经被压成一维了——模型知道第
137 个 patch 和第 138 个 patch 相邻,但要还原”这两个 patch
在原图的上下左右关系”,需要额外的二维位置建模。
多数模型这块做得比较弱。再加一层原因:训练数据里的图文对,描述空间的句子本来就少,”一只猫在桌子的左边”这种精确表述在语料里占比很低。模型没被充分训练过这件事,自然答不准。
可操作的结论
知道了原理,提问方式可以立刻改:
一是给够分辨率。
需要看文字、看细节的图,别压缩,直接传原图,长边尽量在 1024
以上。需要看整体的场景图,反而可以小一点,省 token 也够用。
二是把空间问题拆成子问题。
不要问”第三个在第二个左边吗”,改成分区域问:”图片左三分之一里有什么?”把二维判断降到一维枚举,准确率明显上升。
三是先描述再提问。
让模型先输出”我在图里看到了什么、各在什么位置”,再基于这段描述回答你的问题。相当于强制它把视觉信息先转成文字,绕过弱的空间编码。
四是复杂图先裁切。
一张长图、一张密集报表,整张丢进去细节全被稀释。切成三块分别问,再让模型汇总,结果比一次问准得多。
这套”图—token—语义—位置”的链路,在做
素材审核时天天要用:判断一张生成图能不能用,靠的不是模型说”好看”,而是能不能准确读出画面里的产品位置、文字、构图比例。理解了编码器的边界,你就知道哪些判断可以交给模型,哪些必须人眼过一遍。相关的
AI广告制作
实操记录,我们整理在其它几篇笔记里。