跳转到内容
English

ViT:图像变成序列

交互教程

patch 是一组像素;token 是表示它的向量。ViT 明确建立了这层接口。

前置阅读:注意力与自回归 · 自编码器

CNN 已能用共享局部滤波器学习视觉特征;Transformer 已能用注意力混合序列元素。问题是:基本标准的 Transformer 能否在大规模数据下学习图像特征?

ViT 将图像切成不重叠的 patch,展开每个 patch 并投影到 D 维,加上可学习位置向量,再输入双向 Transformer 编码器。单独的 class token 进入分类头。贡献围绕图像识别及规模扩展,并非重建或自回归。

阅读顺序从左到右。点击模块,将它与计算和代码对应。代码为教学伪代码;来源链接提供论文方法或已核查的实现。

patch 投影

各 patch 共用投影矩阵,空间混合发生在后面。

patches = patchify(image, P)
z = patches @ W + bias

位置与注意力

加入可学习绝对位置,再使用双向注意力。

z = concat(cls_token, z) + position
z = transformer(z, causal=False)

读出

原始头对 class token 分类,不将 patch 还原为图像。

logits = classifier(z[:, 0])

查看固定版本来源

N=HW/P2,zi=flatten⁡(xi)W+eiN=HW/P^2,\quad z_i=\operatorname{flatten}(x_i)W+e_i

224 × 224 RGB 图像采用 16 × 16 patch 时,N=196。每个原始 patch 有 768 个值,经矩阵映射到 D 维特征。注意力在包含 class token 的 197 个位置间混合信息。N 是位置数,D 是每个位置的特征数。

下方采用更小的教学图像。固定图像尺寸并将 patch 边长翻倍,patch 数变成四分之一。稠密注意力分数有 N × N 项,因此项数变成十六分之一。这是分数矩阵规模估计,并非端到端速度实测。

改变参数,查看计算值,再把它与上方的真实模型说明对照。

解析教学模型 · 控件改变的是例子,不是训练后的研究模型。

32 × 32 × 3→ 16 × 192→ 16 × D

patch 投影改变特征宽度,本身不减少 patch 数。

当前例子的计算值
量值
N = (H / P)²16
每 patch 原始值数192

原始 ViT 用监督分类训练,不预测下一个图像 token。高分辨率微调保持 patch 尺寸,并按二维网格插值 patch 位置表。位置表存为一维序列,但插值仍利用空间结构。

要重建像素,还须定义瓶颈、输出 query、像素头和重建目标。TiTok 与 RAE 对这些部分有不同设计。仅把 CNN 编码器换成 ViT,不足以定义完整自编码器。

连续 patch 向量自动意味着自回归 token 吗?

不是。连续性描述取值空间;自回归描述条件分解及训练或采样顺序。

返回学习地图

本页图形与伪代码为教学重绘。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。