ViT:图像变成序列
交互教程
patch 是一组像素;token 是表示它的向量。ViT 明确建立了这层接口。
之前已经能做什么
Section titled “之前已经能做什么”CNN 已能用共享局部滤波器学习视觉特征;Transformer 已能用注意力混合序列元素。问题是:基本标准的 Transformer 能否在大规模数据下学习图像特征?
改变了什么,为什么
Section titled “改变了什么,为什么”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])逐步理解机制
Section titled “逐步理解机制”224 × 224 RGB 图像采用 16 × 16 patch 时,N=196。每个原始 patch 有 768 个值,经矩阵映射到 D 维特征。注意力在包含 class token 的 197 个位置间混合信息。N 是位置数,D 是每个位置的特征数。
下方采用更小的教学图像。固定图像尺寸并将 patch 边长翻倍,patch 数变成四分之一。稠密注意力分数有 N × N 项,因此项数变成十六分之一。这是分数矩阵规模估计,并非端到端速度实测。
改变参数,查看计算值,再把它与上方的真实模型说明对照。
解析教学模型 · 控件改变的是例子,不是训练后的研究模型。
patch 投影改变特征宽度,本身不减少 patch 数。
| 量 | 值 |
|---|---|
| N = (H / P)² | 16 |
| 每 patch 原始值数 | 192 |
训练与采样的区别
Section titled “训练与采样的区别”原始 ViT 用监督分类训练,不预测下一个图像 token。高分辨率微调保持 patch 尺寸,并按二维网格插值 patch 位置表。位置表存为一维序列,但插值仍利用空间结构。
这些结果不能证明什么
Section titled “这些结果不能证明什么”要重建像素,还须定义瓶颈、输出 query、像素头和重建目标。TiTok 与 RAE 对这些部分有不同设计。仅把 CNN 编码器换成 ViT,不足以定义完整自编码器。
连续 patch 向量自动意味着自回归 token 吗?
不是。连续性描述取值空间;自回归描述条件分解及训练或采样顺序。
来源与后续阅读
Section titled “来源与后续阅读”本页图形与伪代码为教学重绘。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。