← 返回题目列表

ViT 如何把图像转换成 Token?分辨率和 Patch Size 有什么影响?

高频 中等 第 12 / 25 题 更新于 2026/07/28
ViTPatch Embedding视觉 Token位置编码

简化版

ViT(Vision Transformer)把图像切成固定大小的 Patch(图块),每个 patch 展平后线性映射成一个向量,加上位置编码,就变成了一串 token 送进 Transformer——相当于「把图像当成一句由 patch 组成的话」。图像 H×W、patch 为 P×P 时产生 (H/P)×(W/P) 个 patch token。更小的 patch 或更高分辨率保留更多细节,但 token 数暴涨、注意力 O(N²) 计算和显存明显增加,还会连累后接 LLM 的序列长度。

详细版

Patch Embedding 可看成步幅和卷积核都等于 P 的卷积:每个不重叠图块映射到 D 维向量。分类 ViT 常在序列前加 [CLS] token;多模态模型则直接用全部 patch token,或经池化/重采样后传给连接器。

标准自注意力对 token 数 N 的注意力矩阵是 。分辨率长宽各翻倍 → patch 数约 ×4 → 注意力矩阵元素约 ×16。所以「高分辨率」不能只理解成「图片变大」——它会同时推高视觉编码器和后接 LLM 的序列长度与成本。

完整版教学

记忆钩子:多模态题先看视觉信号如何变成 token,再看连接器如何对齐语言空间,最后看推理成本和幻觉风险。

一、Patch Embedding:把图像切成「视觉单词」

ViT 的核心操作,是把二维图像变成一维 token 序列。步骤:

输入图像 H×W×C
  1. 切成不重叠的 P×P 图块,每块含 P×P×C 个像素值
  2. 展平成向量,线性层映射到 D 维 → 一个 patch token
  3. 加位置编码
  → 得到 N 个 token 的序列,N = (H/P) × (W/P)

用具体数字算一遍(经典 ViT-B/16,224×224 图,patch=16):

N = (224/16) × (224/16) = 14 × 14 = 196 个 patch token
(分类任务再加 1 个 [CLS] → 197 个)

这一步在工程上通常就用一个卷积实现(kernel=stride=P)。实际预处理会先缩放/裁剪/补齐让尺寸满足要求——是否保留原始宽高比取决于处理策略(见高分辨率专题)。

二、为什么必须加位置编码

自注意力对 token 顺序无感——把 patch 打乱,注意力结果不变。但图像的布局至关重要(天空在上、地面在下),所以要位置编码告诉模型每个 patch 在二维网格里的位置。常见方案:

  • 可学习绝对位置:给每个位置一个可训练向量(原始 ViT);
  • 插值后的绝对位置:换分辨率时对位置编码插值;
  • 二维相对位置偏置:编码 patch 间的相对行列关系。

易错点:换分辨率时位置编码要插值,但插值不能自动弥补”训练时没见过这个分辨率”的分布差异——放大了不等于在放大后的分辨率上训练充分。

三、Patch Size 的取舍:细节 vs 成本

Patch 大小是一个核心旋钮,直接决定「看多细」和「多贵」:

Patchtoken 数细节保留计算/显存
小(如 /14)好(小文字、边界清晰)高(N² 暴涨)
大(如 /32)差(细节在嵌入前被混掉)
224×224 图:patch=16 → 196 token;patch=14 → 256 token;patch=32 → 49 token
注意力成本 ∝ N²:196²≈3.8万 vs 256²≈6.6万 vs 49²≈2400

易错点:模型名里的 /16 指 patch 边长 16,不是”只能接收 16×16 的图”——它接收标准分辨率的图,只是按 16×16 切块。

四、视觉 token 怎么进入 LLM

ViT 输出的向量维度通常不等于 LLM 的词向量维度,所以要经投影器/重采样模块转换(见连接器专题)。两种取向:

  • 直接传所有 patch token:保留信息多,但占大量上下文(576 个 patch token 很常见);
  • 压缩成少量查询 token:省上下文,但可能损失位置和细节。

关键认知:视觉 token 会占用 LLM 可处理的序列长度、并推高 Prefill 计算。一张高分辨率图切出上千视觉 token,可能比用户的文字问题还长——这是多模态推理变慢的主因之一。

五、高分辨率策略概览

细节任务(OCR、图表)需要高分辨率,但不能无脑放大(N² 会爆)。常见折中:

  • 整体缩放:简单,但小文字会糊;
  • 局部裁块:把大图切成多块分别编码,看清细节;
  • 全局缩略图 + 局部块:既懂整体布局又看清局部;
  • 动态分辨率:不同图产生不同数量 patch,减少拉伸/补边;
  • 视觉 token 压缩:池化/合并/剪枝降 token 数。

裁块能看清细节,但必须保留块的位置和全局关系,否则模型「看清局部却判错整体布局」。

六、常见误区与追问

  • 误区:/16 表示模型只接收 16×16 图。 它指 patch 边长 16,图仍是标准分辨率,只是按 16×16 切块。
  • 误区:高分辨率只是”图变大”。 分辨率翻倍 patch 数 ×4、注意力 ×16,同时连累视觉塔和 LLM。
  • 追问:224 图 patch=16 有多少 token? (224/16)²=196(分类再加 [CLS] 共 197)。
  • 追问:为什么 ViT 需要位置编码? 自注意力对顺序无感,要位置编码表达 patch 的二维布局。
  • 追问:patch 越小越好吗? 细节更好但 token 数和 N² 成本暴涨,要权衡任务与预算。
  • 追问:视觉 token 对 LLM 的影响? 占上下文、增 Prefill,高分辨率时可能远超文本 token。
  • 追问:换分辨率位置编码怎么办? 插值,但插值不能弥补训练分布差异,最好在目标分辨率上训练。

七、加强记忆

ViT 记「切块 → 线性映射 → 加位置 → 当 token」:图像切成 P×P 的 patch,每块映射成向量、加二维位置编码,变成 N=(H/P)×(H/P) 个视觉 token(224 图 patch16 = 196 个)。核心权衡钉死——patch 越小/分辨率越高,细节越好但 token 数暴涨、注意力 O(N²)、还连累后接 LLM 的序列和 Prefill。三个易错点:/16 是 patch 边长不是输入尺寸、高分辨率是 ×4 token 和 ×16 注意力、位置编码插值补不了训练分布差。分辨率、patch size、压缩率共同决定「看多细」和「多贵」。