视觉 Token 是怎么进入大模型的?
简化版
图像通常先被切成 patch,经视觉编码器变成一串视觉特征,再由 projector 或 resampler 映射到语言模型的隐藏维度,并作为前缀、占位符替换内容或交叉注意力的键值参与推理。视觉 Token 不是文本 tokenizer 切出的“词”,其数量由分辨率、patch 大小和压缩策略决定,位置编码与多模态训练负责让模型理解空间及图文对应关系。
详细版
以 ViT 路径为例:H×W×3 图像按 P×P 切块,每个 patch 展平后线性投影,得到约 (H/P)×(W/P) 个向量;加二维位置编码后送入视觉 Transformer。视觉输出维度通常与 LLM 不同,因此用 MLP/线性 projector 对齐,或由 Q-Former、Perceiver Resampler 用固定数量查询压缩,再通过特殊图像边界 Token 插到文本序列中。
训练会用图文对比、Caption、自回归问答和指令微调建立语义对齐。设计取舍包括:保留多少视觉 Token、是否冻结视觉塔、采用早融合还是 cross-attention,以及如何支持动态分辨率。面试应能算 Token 数,并说明高分辨率为何提高细节但增加 prefill 成本和上下文占用。
pixels -> patch embedding -> vision encoder -> projector/resampler -> LLM hidden states
+ text embeddings -> attention -> answer
完整版教学
一、像素为什么不能直接当文字输入
语言模型接收的是固定隐藏维度的一串向量,而原始图像是高宽和颜色通道组成的稠密数组。即使把每个像素当 Token,1024×1024 图也会产生一百多万个位置,计算不可承受,而且单个像素语义太弱。视觉 Token 化的作用是把局部像素聚合成可学习的表示。
它与文本 tokenizer 不同:文本 Token 通常是离散 ID,通过词表查 embedding;视觉 patch 是连续像素,经线性层或卷积得到向量。二者最终形状都可以是 [序列长度, 隐藏维度],这才让统一注意力计算成为可能。
二、Patch Embedding 怎样计算
设输入尺寸 H×W,patch 边长 P,不考虑 padding 时 Token 数为:
N = (H / P) × (W / P)
patch vector dimension = P × P × 3
例如 224×224 RGB 图片用 16×16 patch,会得到 14×14=196 个 patch;每块原始维度为 16×16×3=768。线性投影把 768 维映射到视觉隐藏维度,也可用 kernel 和 stride 都为 16 的卷积一次完成同等切块投影。
patch 越小,空间细节越好,但序列越长。把 P 从 16 降到 8,横纵方向各多一倍,Token 变为四倍。这是多模态推理成本对分辨率和 patch 大小敏感的根源。
记忆钩子:文字是“查表得到向量”,图像是“切块投影成向量”;形式最后相似,来源和数量规律完全不同。
三、视觉编码器补上语义与上下文
裸 patch 只包含局部颜色,无法知道它属于猫耳还是背景。视觉 Transformer 加入位置编码并通过多层自注意力交换信息,逐渐形成物体、场景和关系特征。预训练可来自图像分类、图文对比或大规模图文生成,不同目标会影响细粒度能力。
位置表示非常关键,因为自注意力本身对排列没有天然空间概念。固定二维位置、可学习位置和相对位置各有取舍;动态分辨率时还要处理训练网格之外的长宽比和位置插值。若裁成多个 tile,应额外告诉模型每块在原图的位置。
四、Projector 为什么不可省略
视觉编码器可能输出 1024 维,LLM 隐藏维度可能是 4096,二者不能直接相加或拼入同一序列。Projector 用线性层或 MLP 把视觉特征映射到 LLM embedding 空间,并在多模态训练中学习“视觉概念如何被语言模型消费”。它不仅改维度,也是跨模态接口。
| 接口 | Token 数 | 特点 |
|---|---|---|
| 线性/MLP Projector | 通常保持 | 简单、保留细节,序列长 |
| Q-Former | 固定查询数 | 用查询从视觉特征提取信息 |
| Perceiver Resampler | 固定或可调 | 适合压缩可变长度输入 |
| 池化/卷积压缩 | 规则减少 | 快,但可能损失小目标 |
如果 1024 个视觉 Token 被 64 个查询压缩,LLM prefill 显著下降,但压缩瓶颈可能丢失文档小字。接口设计必须与目标任务共同训练和评测。
五、视觉序列怎样与文本融合
最直接的早融合把视觉向量放在特殊 <image> 边界中,与文本 embedding 拼成一条序列,由 LLM 自注意力统一处理。另一类架构在若干语言层加入 cross-attention,文本作为 Query,视觉特征作为 Key/Value;视觉 Token 不必完全占据语言上下文,但模型结构需要改造。
早融合:[BOS][IMG_START][v1]...[vN][IMG_END][问题Token...] -> LLM
交叉注意力:文本隐藏状态 --Query--> 视觉 K/V;再回到语言层
早融合容易复用现有 decoder-only LLM,跨模态交互充分;cross-attention 可隔离两类序列并缓存视觉特征。没有绝对最优,取决于训练成本、上下文预算和是否需要多轮复用图像。
六、模型怎样学会图文对齐
仅把视觉向量插进去,未训练的 LLM 不知道这些向量表示什么。常见过程先固定视觉塔和 LLM,只训练 projector 做图文 Caption 对齐;再用图文问答、OCR、定位和多轮数据指令微调;最后可解冻部分模块提升上限。分阶段训练减少破坏语言能力和显存需求。
对比学习让匹配图文靠近,生成损失则直接优化下一个文字 Token:
L_generation = - Σ_t log p(y_t | y_<t, visual_tokens)
如果训练数据只含概括性 Caption,模型可能会识别主体,却不会读小字或输出坐标。能力来自数据目标,而不是视觉 Token 接口自动产生。
七、动态分辨率与工程代价
固定尺寸会拉伸或丢细节,动态分辨率可保留长宽比并生成不同数量 Token。代价是 batch padding、位置编码和显存调度更复杂。系统常设置最大像素或 tile 数,用全局缩略图加局部块兼顾场景与细节。
视觉 Token 会增加首 Token 前的 prefill,但生成阶段新增每个文字 Token 的成本还取决于 KV Cache。线上应记录输入分辨率、视觉 Token 数、视觉编码耗时、LLM prefill 和解码时间,才能知道该优化 patch、压缩器还是语言模型。
八、常见误区与追问
- 误区:图片经过文本 tokenizer 变成视觉词。 通常是连续像素经 patch embedding 和视觉编码器得到向量。
- 误区:Projector 只负责改维度,没有学习价值。 它也是视觉空间到语言空间的可训练接口。
- 误区:视觉 Token 越多效果一定越好。 冗余会增大成本,过多无关区域还可能干扰注意力。
- 追问:为什么要加位置编码? patch 序列本身不表达二维位置,定位和空间关系依赖位置信号。
- 追问:Q-Former 的价值是什么? 用有限可学习查询从长视觉序列提取与语言相关的紧凑表示。
- 追问:冻结视觉塔有什么利弊? 训练稳定且便宜,但领域图像差异大时会限制适应能力。
九、加强记忆
视觉 Token 的旅程可记成“切、编、投、融、训”:切 patch 控制序列长度,视觉编码器加入空间语义,projector/resampler 对齐维度并压缩,再与文本早融合或交叉注意力交互,最后靠图文目标学会对应关系。能算出 224/16 得到 196 个 patch,并讲清 Token 数、细节和 prefill 的取舍,就真正掌握了这条链路。