视觉特征提取器-训练范式02-自监督-掩码图像建模01:MAE的Mask Vector【所有遮挡块复制同一个共享可学习向量】【初始化完全相同,预训练后仍为同一个参数向量】【各位置差异仅由位置编码提供】
2026/8/9 20:53:39 网站建设 项目流程

MAE 中的 Mask Vector:从形状、初始化到预训练与推理

1. Mask Vector 到底是什么?

论文《Masked Autoencoders Are Scalable Vision Learners》的核心任务是:

随机删除图片中的大量 patch,只让 Encoder 观察剩余 patch,再让 Decoder 重建被删除的 patch。

MAE 使用一个特殊的掩码向量(mask vector)来告诉 Decoder:

“这个位置原本存在一个 patch,但它的内容现在未知,需要预测。”

论文将每个掩码标记(mask token)描述为共享的、通过学习得到的向量。同时,MAE 的 Encoder 只处理真实的可见图像块(visible patches),mask token 只在 Decoder 中出现。

因此,首先要建立最重要的概念:

mask vector 不是缺失 patch 的内容,而是缺失 patch 的可学习占位符。\boxed{\text{mask vector 不是缺失 patch 的内容,而是缺失 patch 的可学习占位符。}}mask vector 不是缺失 patch 的内容,而是缺失 patch 的可学习占位符。


2. Masked Patch、Mask Token 和 Mask Vector 的区别

这三个概念不能混淆。

被掩码图像块(masked patch)是原始图片中真实存在、后来被随机删除的 patch。

例如原始图片有:

[P0,P1,P2,P3,P4,P5,P6,P7][P_0,P_1,P_2,P_3,P_4,P_5,P_6,P_7][P0,P1,P2,P3,P4,P5,P6,P7]

假设只保留P1P_1P1P3P_3P3,那么其他 6 个 patch 都属于 masked patches。

但在 Encoder 中,它们不是被替换成某个特殊向量,而是直接被删除。论文明确说明 Encoder 不使用 mask tokens。

掩码向量(mask vector)则是模型真正保存的一个可训练参数,记为:

m\mathbf mm

掩码标记(mask token)可以理解为把这个m\mathbf mm复制到某个缺失位置后得到的 token。

因此:

一个 mask vector→复制出很多 mask tokens\boxed{\text{一个 mask vector}\rightarrow\text{复制出很多 mask tokens}}一个 mask vector复制出很多 mask tokens

而不是每个 masked patch 都拥有自己独立的 mask vector。


3. Mask Vector 的形状

假设 Decoder 的隐藏维度为:

DDD_DDD

那么从数学上看:

m∈RDD\mathbf m\in\mathbb R^{D_D}mRDD

官方 MAE PyTorch 实现将它保存为:

self.mask_token=nn.Parameter(torch.zeros(1,1,decoder_embed_dim))

所以张量形状是:

1×1×DD\boxed{1\times1\times D_D}1×1×DD

官方 MAE 的 ViT-Base、ViT-Large 和 ViT-Huge 配置都采用 512 维 Decoder,因此这些默认模型中的 mask token 参数形状为:

1×1×512\boxed{1\times1\times512}1×1×512

官方代码同时表明,ViT-Large 的 Encoder 维度为 1024,而 Decoder 维度为 512;Encoder 输出首先通过线性层映射到 Decoder 维度,然后才加入 mask tokens。

这说明一个重要事实:

mask vector 属于 Decoder 表示空间,而不是 Encoder 表示空间。\boxed{\text{mask vector 属于 Decoder 表示空间,而不是 Encoder 表示空间。}}mask vector 属于 Decoder 表示空间,而不是 Encoder 表示空间。


4. 为什么形状是[1, 1, 512]

可以把它拆成:

[1, 1, 512] │ │ │ │ │ └── 一个 token 含 512 个特征 │ └────── 只有一个 mask token 参数 └───────── batch 维

真正需要模型学习的是:

m=[m1,m2,…,m512]\mathbf m=[m_1,m_2,\ldots,m_{512}]m=[m1,m2,,m512]

也就是 512 个标量。

如果一张图片有 147 个 masked patches,并不意味着模型学习:

147×512147\times512147×512

套独立参数。

它只学习一个:

m\mathbf mm

然后重复使用。


5. “Shared” 到底是什么意思?

假设一张224×224224\times224224×224图片使用16×1616\times1616×16patch。

patch 总数:

L=22416×22416=14×14=196L=\frac{224}{16}\times\frac{224}{16}=14\times14=196L=16224×16224=14×14=196

MAE 的典型 masking ratio 为 75%,因此:

Lvisible=196×0.25=49L_{\text{visible}}=196\times0.25=49Lvisible=196×0.25=49

Lmasked=196−49=147L_{\text{masked}}=196-49=147Lmasked=19649=147

论文的默认设置就是 75% masking ratio,并使用 512 维 Decoder。

对于这 147 个缺失位置,模型不是学习:

m1,m2,…,m147\mathbf m_1,\mathbf m_2,\ldots,\mathbf m_{147}m1,m2,,m147

而是使用:

m,m,…,m⏟147 次\underbrace{\mathbf m,\mathbf m,\ldots,\mathbf m}_{147\text{ 次}}147 m,m,,m

所以共享(shared)的准确含义是:

同一张图片的所有 masked positions、不同图片的 masked positions,都使用同一个可训练参数m\mathbf mm


6. Mask Vector 如何初始化?

这里要区分“论文描述”和“官方代码实现”。

论文说明它是可学习向量(learned vector),但方法部分并没有指定它必须按照什么概率分布初始化。

官方 PyTorch 实现首先创建全零参数张量:

self.mask_token=nn.Parameter(torch.zeros(1,1,decoder_embed_dim))

随后在模型初始化函数中执行:

torch.nn.init.normal_(self.mask_token,std=.02)

因此真正开始训练时,每个维度近似满足:

mj∼N(0,0.022)m_j\sim\mathcal N(0,0.02^2)mjN(0,0.022)

也就是说:

创建时先是零张量,正式训练前再用标准差 0.02 的正态随机数初始化。\boxed{\text{创建时先是零张量,正式训练前再用标准差 0.02 的正态随机数初始化。}}创建时先是零张量,正式训练前再用标准差 0.02 的正态随机数初始化。

刚初始化时,这些数字没有“狗”“天空”“汽车”等视觉语义,它只是一个待优化的小随机向量。


7. Mask Vector 在 Encoder 中出现吗?

不出现。

这是 MAE 与很多容易产生的直觉最不一样的地方。

假设:

[P0,P1,P2,P3,P4,P5,P6,P7][P_0,P_1,P_2,P_3,P_4,P_5,P_6,P_7][P0,P1,P2,P3,P4,P5,P6,P7]

只保留:

P1,P3P_1,P_3P1,P3

Encoder 实际处理的是:

[P1,P3][P_1,P_3][P1,P3]

而不是:

[m,P1,m,P3,m,m,m,m][\mathbf m,P_1,\mathbf m,P_3,\mathbf m,\mathbf m,\mathbf m,\mathbf m][m,P1,m,P3,m,m,m,m]

论文明确采用非对称编码器—解码器(asymmetric encoder-decoder):Encoder 只处理 visible patches,而完整 token 集合只交给较轻量的 Decoder。这样既减少计算量,也避免 Encoder 在预训练阶段依赖下游完整图片中不存在的 mask tokens。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询