视觉表征基础
ViT (Vision Transformer)
Transformer 本质上只能处理序列(Sequence)。ViT 的核心贡献在于:它找到了一种不破坏图像空间结构、又能让其变成序列的方法。
第一步:Patch 化 (Patch Partition)
假设图像大小是 \(224 \times 224\)。ViT 不会一个像素一个像素去读(那样序列太长了,Attention 算不动)。
- 它把图像切成固定大小的方块(Patch),比如 \(16 \times 16\)。
- 这样一张图就变成了 \(14 \times 14 = 196\) 个小方块。
第二步:线性投影 (Linear Projection)
每个 \(16 \times 16 \times 3\)(RGB通道)的小方块会被展平为一个长向量,然后通过一个线性层映射到一个固定维度(比如 768 维)。
这就像是 NLP 里的 Word Embedding。每一个 Patch 现在就是一个“视觉单词”。
第三步:[CLS] Token 的作用
既然我们把图像变成了 196 个 Patch,那么最后我们要拿哪个向量去做分类或者提取全局特征呢?
- ViT 模仿了 BERT,在 196 个 Patch 向量最前面强行插入一个虚构的向量,叫
[CLS](Classification)。 - 原理: 由于 Self-Attention 是全局互动的,这个
[CLS]Token 会在多层计算中不断“吸收”其他 196 个 Patch 的特征。最后,我们只需要拿这个[CLS]对应的输出向量,就能代表整张图的语义。
第四步:Transformer Encoder
接下来的部分和 Transformer Encoder 完全一致:
- 多头自注意力 (Multi-Head Attention):让每个 Patch 观察其他 Patch(比如猫的耳朵 Patch 会关注猫的尾巴 Patch)。
- 层归一化 (LayerNorm) 与 残差连接。
- 前馈网络 (MLP)。
MAE (Masked Autoencoders)
核心思想:视觉版的“完形填空”
在 NLP 领域,BERT 通过遮盖(Mask)一部分单词来学习语言规律。MAE 把这个思路带到了视觉领域:
- Masking(遮盖): 将图片切成 Patches 后,随机遮住绝大部分(通常是 75%)。
- Encoding(编码): 只把剩下的 25% 未遮住的 Patches 丢进 ViT Encoder。
- Decoding(解码): 在 Encoder 的输出后面,补上刚才被遮掉的“空白占位符”,然后由一个轻量级的 Decoder 把整张图的像素还原出来。
为什么 MAE 这么强?为什么要遮掉 75% 这么高比例?BERT 才遮 15% 啊。
原因 A:消除冗余 (Information Redundancy)
- 语言: 每一个词(Token)都包含极高的信息密度。遮掉一个词,周围的线索有限。
- 视觉: 图像像素高度冗余。如果你只遮掉一个小角,模型通过旁边的像素稍微插值一下就猜出来了,根本不需要“动脑子”理解语义。
- MAE 的对策: 只有遮掉绝大部分,迫使模型去学习物体的结构、形状和全局概念(比如:这里有半个耳朵,那被遮住的地方一定有另外半个)。
原因 B:非对称架构 (Asymmetric Design)
- Encoder 很重: 处理的是少量的(25%)可见块。
- Decoder 很轻: 只在预训练阶段负责还原像素。
- 优势: 这种设计极大地减少了预训练的计算量和内存消耗,使得 MAE 可以训练非常大的模型。
原因 C:重建的是像素,学到的是特征
- 虽然训练目标是让像素对齐,但为了完成这个任务,Encoder 必须学会提取高层的抽象特征。
MAE 的工作流程
- 输入: 图像 \(\rightarrow\) Patch Embedding \(\rightarrow\) 196 个 Tokens。
- 采样: 随机选 49 个 Token(25%)留着,剩下 147 个(75%)扔掉。
- 编码: 49 个 Token 加上位置编码,进入 ViT Encoder \(\rightarrow\) 得到特征向量。
- 填充: 把丢掉的 147 个位置用特殊的共享向量(Mask Token)补回来。
- 解码: 完整的 196 个 Token(含特征和占位符)进入 Decoder。
- 重建: Decoder 输出 196 个 Patch 的像素值,计算与原图的 MSE Loss(均方误差)。
MAE 证明了“自监督预训练”在视觉领域的巨大威力。它产生的预训练权重(Weight),现在是很多多模态模型(如图像理解、目标检测)的首选初始化参数。
TODO:
特征金字塔 (Feature Pyramid): 如何同时处理不同大小的物体?
数据增强 (Data Augmentation): 为什么翻转、裁剪、变色对视觉表征这么重要?
视觉 Token 的演进: 除了 Patch 化,还有没有更高级的方法?(如 Perceiver Resampler,常用于把几百个视觉 Token 压缩成几十个)。
为什么图像需要 2D Position Embedding?
在 Transformer 看来,输入进来的 196 个 Patch 就像一袋子弹珠,它不知道谁在谁的左边。图像是有行列结构的。如果只用 1D 编码(1, 2, 3...196),模型很难学习到“第一行的最后一个”和“第二行的第一个”其实在空间上是很近的。2D Position Embedding(或正交的横纵坐标编码)能显式地为模型提供空间拓扑信息,帮助模型理解物体的几何形状和相对位置关系。
为什么 ViT 在大规模数据下才强于 CNN?
因为CNN建立在图形“平移不变性”和“局部相关性”的先验知识上,即使只用小数据训练,也能很快获得较好的效果。而ViT没有任何对于图像的鲜艳假设,他不许通过海量数据来学习空间上的关系,但是能学到比卷积更复杂的全局关系。