视觉语言模型
把图像 patch 和文本 token 放进同一个序列,剩下的交给注意力。语言模型是怎么长出眼睛的,以及它仍然做不到什么。
当一张图像成了一串 patch token、文本成了一串文本 token 之后,一个再明显不过的想法就摆在那里:把它们放进同一个序列。
视觉语言模型本质上就是这么回事。注意力同时作用在两边,所以一个文本 token 可以去看一个图像 patch,反过来也一样。
标准架构
三个组件,有意思的活儿发生在中间那个上。
视觉编码器把图像变成 patch 的 embedding。通常是一个预训练的图像模型,而且常常是冻结的。
投影层把这些 embedding 映射到语言模型的 embedding 空间里。视觉编码器是单独训练的,产出的向量在它自己的空间里,语言模型看不懂。一个小的、学出来的适配器——有时就是一个线性层——把两边接起来。
语言模型接收投影后的图像向量,把它们当作 token 的 embedding 来处理,和真正的文本交错在一起。
于是 prompt「这张图里有什么?」变成一个像 [img_1] [img_2] ... [img_196] 这张图里有什么? 这样的序列,语言模型做它一贯做的事:预测下一个 token。
妙处在于语言模型几乎不需要改动。它本来就接收一串向量,而这些向量没有任何理由必须来自文本。
为什么训练要分阶段
从零训练这三个部分会极其昂贵,而且大部分是白费——好的视觉编码器和好的语言模型本来就已经存在。
通常的顺序:
- 从一个预训练视觉编码器和一个预训练语言模型出发。
- 只训练投影层,用图像-描述配对数据,两个大模型都冻结。便宜,而且它能教会适配器说语言模型那门方言。
- 可选地解冻部分参数,在指令数据上微调——图像配上问题和好答案。
这就是为什么视觉能力能比较快地加到已有的语言模型上。难的部分早就训好了,新的只有那座桥。
它们擅长什么
描述与生成图片说明。 训练数据最直接奖励的任务。
针对图像内容问答。 发生了什么、哪里不寻常、什么气氛。
读取成篇的文字。 文档、幻灯片、标牌——前提是文字够大,扛得住缩放。参见文档理解与 OCR。
解读图表和示意图。 在趋势和结构上常常出人意料地好,在具体数值上就没那么可靠。
从设计稿生成代码。 截图转标记语言之所以管用,是因为两边在训练数据里都覆盖得很好。
它们做不好什么
这些失败是成堆出现的,而且大多能追回到 patch 表示上。
计数。 尤其是很多相似的小物体。patch 网格不区分个体,模型也没有计数机制。
精确的空间关系。 大致布局没问题;精确的偏移和对齐不行。
小字和细微之处。 往往在模型看到任何东西之前就被缩放毁掉了。这是预处理阶段的损失,不是理解失败——这也解释了为什么同一张图换个更高分辨率就能用。
图表里的确切数值。 它读出形状,然后估算数字。它给出的数字要当成近似值。
否定与不存在。 「这张图里没有猫吗?」不可靠,原因和否定会迷惑 embedding一样。
实操要点
分辨率比什么都重要。 如果细节丢了,先发一张更大或裁过的图,再去改 prompt。很多「模型读不出来」的问题其实是缩放问题。
裁到关键部分。 整张截图会把它的 patch 预算花在无关的界面装饰上。裁到关心的区域,是你能做的最有效的一招。
图像要花 token。 一张高分辨率图像吃掉的上下文可能比好几页文字还多,服务商也照这个计费。多张图还要再乘。
先让它推理。 一步步来在视觉推理上管用,和它在文本上管用的是同一个机制上的原因。
幻觉同样适用。 问模型一件图里根本没有的东西,它经常照样描述一番。AI 模型为什么会产生幻觉?里的每一条规律都照搬过来——让模型基于图像作答能减少编造,但不能消除。
要点回顾
- 视觉语言模型把图像 patch 和文本 token 放进同一个序列,注意力因此在两边通用。
- 架构是视觉编码器 + 投影层 + 语言模型;分阶段训练意味着最开始只训那座桥。
- 强在描述、问答、成篇文字和图表结构。
- 弱在计数、精确空间关系、细节、图表确切数值和否定。
- 分辨率和裁剪比 prompt 技巧更重要;图像消耗的上下文相当可观。
下一篇: 图像生成是怎么工作的