Vision Transformer(ViT)是几乎所有现代 VLM 视觉编码器的架构基础。它把一幅图像看作 1 个"序列",用和文本 Transformer 几乎一样的机制来处理图像,只是输入从单词 token 变成了图像的 patch token。
直接答案:原始 ViT 使用 all-to-all 的双向 self-attention,不是 causal attention。任意 patch token 都可以关注任意其他 patch token;放在序列开头的 [CLS] token 也能 1 次看到整幅图像。
| 位置 | Attention mask | token 能看到什么 |
|---|---|---|
| ViT 视觉编码器 | 全连接,不遮挡未来位置 | 所有图像 patch 与 [CLS] |
| Decoder-only LLM | Causal,下三角 | 自己和序列中更早的 token |
如果有 \(N\) 个视觉 token,ViT 的 attention score 矩阵是完整的 \(N \times N\):第 \(i\) 行不会把 \(j > i\) 的位置设为负无穷。原因是图像 patch 没有“尚未生成的未来”;编码 1 个 patch 时,左右上下的全局上下文都应该可见。位置关系仍由 position embedding 表示,因此 all-to-all attention 仍然保留空间位置信息。
VLM 中的两段注意力:图片经过 ViT 时使用 all-to-all attention;ViT 输出的 visual embeddings 插入 Qwen、LLaMA 等 decoder-only LLM 的输入序列后,语言主干使用 causal mask。同一套 VLM 因而同时包含视觉编码器的双向注意力和语言模型的因果注意力。
推理含义:标准 ViT 对整张图像做 1 次并行编码,不是逐 patch 自回归生成,因此通常没有类似 LLM decode 的逐 token KV cache。其主要代价是视觉 token 数增长后,完整 self-attention 的计算量约按 \(\mathcal{O}(N^2)\) 增长。
例外:某些自回归图像生成器、视频预测模型或特殊 masked vision model 会使用 causal/local mask,但那不是原始 ViT encoder 的默认设计。
ViT 将图像切成固定大小的小方块(patch),把每个 patch 展开为一维向量,再用线性投影(patch embedding)映射到 Transformer 的 hidden dimension。这个过程可以写成卷积:Conv2d(in_channels=3, out_channels=hidden_dim, kernel_size=patch_size, stride=patch_size)。卷积输出展平后得到形状为 (num_patches, hidden_dim) 的序列。
例如对于一幅 224×224 的 RGB 图像,当 patch 大小为 16×16 时:总共切出 \(14\times 14=196\) 个 patch,每个 patch 是 \(16\times 16\times 3=768\) 个像素值。patch embedding 将这 768 个值投影到 hidden_dim(如 768 或 1280),得到 196 个 token。
对于一幅 448×448 的图像,patch 大小仍为 16×16:总共 \(28\times 28=784\) 个 patch,visual token 数增加到 784 个。token 数量随分辨率平方增长,这也是为什么 受限显存设备必须严格控制 max_pixels。
下面是 1 个 224×224 图像被 16×16 patch 切分的 ASCII 表示。每个编号代表 1 个 patch:
文本 token 有天然的顺序(第 1 个词、第 2 个词...),但图像的 patch 是二维排列的。Transformer 本身不感知输入的位置,因此需要位置编码告诉模型"这个 patch 在图像的左上角,那个 patch 在右下角"。
ViT 使用可学习的位置嵌入(learned position embedding):为每个 patch 位置预分配 1 个向量,与 patch embedding 相加。1D 的文本位置编码用 (t),2D 的图像位置编码用 (h, w),但 ViT 的做法是将 2D 坐标 flatten 成 1D 序列号,再用标准的 1D 位置嵌入。更现代的方案(如 Qwen-VL 的 M-RoPE)用显式三维编码同时表示高度和宽度。
还有 1 个特殊 token:[CLS] token。ViT 借鉴 BERT,在 patch 序列最前面加 1 个可学习的 [CLS] token。Transformer 编码后,[CLS] token 的最终 hidden state 被用作整个图像的全局表示(用于分类)。不过在现代 VLM 中,[CLS] token 往往不被使用,visual token 直接全部送入下游。
Qwen-VL 系列使用的视觉编码器是 ViT-bigG(约 1.9B 参数),从 CLIP 预训练初始化。对于 Qwen3-VL,视觉编码器做了进一步的轻量化。基本参数如下:
| 参数 | ViT-bigG(Qwen-VL) | Qwen3-VL 视觉编码器 |
|---|---|---|
| hidden_dim | 1664 | 1280(更轻量) |
| 层数 | 48 | 约 32 |
| patch_size | 14 | 14 |
| 参数量 | 约 1.9B | 约 0.4B |