从前有个叫“小Ne”的学生,他的学习方法很扎实,但只会照着“带标准答案的练习册”刷题(有监督训练)——老师给什么答案,他就背什么。后来班上来了一位转学生“小Win”(Swin Transformer),小Win的笔记方式很特别:先整体分块浏览课本,再精简出重点。小Ne把这种好方法融入自己的笔记体系,把自己升级成了一个“现代化”的学霸,名字从此叫 ConvNeXt。 更精彩的是,小Ne学会了两项不需要标准答案的练习。第一项叫“完形填空”(MAE 掩码重建):老师把一页内容随机挖掉四分之三,让他凭上下文补全;第二项叫“找相似”(MoCo 对比学习):老师发一堆同一事物在不同光线角度下的卡片,让他把本质相同的归到一起。这两种练习完全不需要人工标注答案,只靠大量观察数据本身,小Ne就练出了一双能提取“通用视觉特征”的火眼金睛。 学成之后,不管考图像分类、目标检测还是语义分割,小Ne都能快速迁移上手。这就是 ConvNeXt 自监督预训练的故事。本文沿着这条学习路线,带你从零看懂它。
对 AI 从业者的价值:掌握自监督预训练如何用无标注数据把 ConvNeXt 练成“通用特征提取器”,在实际项目里大幅降低标注成本、提升小样本场景的上限。
可视化演示
展示ConvNeXt在自监督预训练中的应用流程,包括MAE掩码重建、MoCo对比学习、预训练迁移与有监督对比,直观理解视觉自监督表示学习。
本节配有交互动效(进入视口后自动加载,约 3KB)。
ConvNeXt自监督预训练 MAE掩码重建:随机掩码图像patch,ConvNeXt编码可见区域后重建掩码部分 MoCo对比学习:动量编码器+队列构建负样本,学习区分性视觉表示 迁移学习:预训练权重迁移到下游任务,微调获得通用视觉表示 Pretrain = MAE(reconstruct) ∪ MoCo(contrast) ConvNeXt自监督预训练学习通用视觉表示
主干现代化改造
老师发下一摞历代学霸的笔记。其中老牌学霸 ResNet 的笔记非常经典:整本都是 3×3 的小方格卷积反复堆叠,扎实但略显呆板。转学生小Win(Swin Transformer)的笔记则完全不同:他把内容先切成一块块的窗口,每块内部精读,块与块之间再互相交流(窗口注意力),还擅长把笔记先扩写再精简。小Ne(ConvNeXt)是个聪明的孩子,他拿起小Win的笔记对照着自己的抄了一遍——保留了自己“卷积走天下”的看家本领,吸收了对方的分块、大核、精简记录等优秀习惯。这个“抄作业再重构”的过程,就是 ConvNeXt 的现代化改造。
ConvNeXt 是 2022 年提出的纯卷积架构,它的口号很朴素:“把 Transformer 的设计哲学搬进 CNN”。改造不是发明全新算子,而是逐项升级 ResNet 中的经典设计:首先,把输入端原来的 7×7 大卷积替换成 4×4、步长为 4 的 patch 化卷积,模仿 ViT 把图像切成 token 的效果;其次,把模块里的大卷积换成 7×7 深度卷积(depthwise convolution),每个通道独立做空间卷积,大幅降低参数和计算量;再次,模块内部采用“逆瓶颈”结构——先升维再降维,让信息在更宽的通道空间里流动;最后,每个 stage 之间的下采样不再用池化,而改用步长为 2 的 3×3 卷积。训练配置方面也全面对标 Transformer:AdamW 优化器、GELU 激活、更强的数据增强。
改完笔记的小Ne,看书速度快了、重点记得牢了,而且还能同时吸收“窗口浏览”和“全局视野”两种模式的优点。正是这套现代化笔记法,为后面两项“不带答案的自学练习”打下了坚实的底子——没有好用的骨干,再好的自学方法也施展不开。
- 通道升维(逆瓶颈的第一步)把输入通道数
C_in放大到4 × C_in,相当于把笔记先“扩写”一遍,让后续卷积在更宽的信息空间里工作,特征表达能力更强。 - 深度卷积(大核空间感知)对每个通道独立做 7×7 卷积,感受野比 3×3 更大,同时参数只和通道数成正比。
- 非线性激活(引入表达能力)
σ代表 GELU 激活函数,它给线性变换引入非线性,让网络能拟合更复杂的映射关系。 - 降维与残差(精简并保护梯度)用 1×1 卷积把通道从 4 倍降回
C_in,再与输入x逐元素相加。残差连接让梯度在深层网络中顺畅回传,训练更稳定。
MAE掩码重建
新学期,老师开始训练小Ne的“上下文理解力”,方式很特别:完形填空。老师递给他一篇文章,随手用修正带盖住四分之三的字词,只留四分之一给他看,然后要求他凭这些零星的线索猜测被盖住的内容。刚开始小Ne全靠瞎猜,练了成千上万篇之后,他渐渐发现:“被盖住的部分其实藏在没被盖住的排列规律里。”这种从局部推断整体的能力,就是自监督学习中“重建式”任务的精髓。
MAE(Masked AutoEncoder,掩码自编码器)是 2021 年何恺明团队提出的生成式自监督方法。它把一张图像随机遮盖大部分 patch(图像块),让模型从可见 patch 重建被遮住的内容。MAE 最初搭配 ViT 使用效果惊艳,很多人以为“重建式自监督是 Transformer 的专利”,但 ConvNeXt 用行动证明:纯卷积网络只要做好 patch 化和残差设计,同样能把“完形填空”玩得转。
具体流程分为四步:第一步,用 patch 化卷积把图像切成 16×16 的 token;第二步,按 75% 的比例随机遮盖 patch;第三步,编码器只处理可见的 25% patch——这可是省计算量的关键,相当于做完形填空时只读保留的句子,不浪费时间盯着修正带;第四步,把编码结果交给一个很轻的解码器,让它还原出完整的图像。损失函数只在被遮盖的位置计算均方误差(MSE),没被遮的地方不参与监督,因为那些信息编码器“看得到”,不需要猜。
日积月累的完形填空,让小Ne的“上下文推理”能力大幅增强:他不再只盯着局部像素看,而是理解了图像整体的结构与纹理规律。这种对数据分布的深刻感知,正是后续做各类视觉任务时最重要的基础素养。
x_i 与重建结果 x̂_i 的差平方,再用掩码 M_i 只保留被遮盖的位置,最后求平均,得到整个重建任务的损失。- 统计范围(所有 patch)
N表示图像被划分出的 patch 总数,i从 1 遍历到 N,逐个 patch 计算误差。 - 掩码指示(只算被盖住的)
M_i是一个 0/1 掩码向量,被遮盖的位置为 1,可见位置为 0。⊙是逐元素相乘,让损失只惩罚那些“预测被遮内容”产生的误差。 - 逐 patch 误差平方(惩罚偏离)
(x_i - x̂_i)²衡量真实 patch 与重建 patch 的差异,平方项让偏差大的位置得到更大惩罚,训练时模型会优先修正严重错误的部分。 - 平均化(归一化损失)把总误差除以 N,得到平均每个 patch 的重建误差。这样不同尺寸图像的损失可以相互比较。
MoCo对比学习
除了完形填空,小Ne还喜欢玩一种叫“找相似”的卡牌游戏。老师发给他一沓卡片,每张卡片拍的是同一个物体在不同光线、不同角度下的样子,混在一起后还有别的物体混进来。小Ne的任务是:把同一物体不同视角的卡片归成一堆,其他物体的卡片踢出去。为了赢下游戏,他必须学会抓住每个物体的“本质特征”——而不是死记硬背某一张照片的光影。这种通过比较“谁和谁更像”来学习的方法,正是对比学习(contrastive learning)的思路。
MoCo(Momentum Contrast,动量对比)是对比学习的里程碑方法。它的具体玩法是:一张图片随机做两次数据增强,得到两个不同视角,视为正样本对;其他任意图片的增强结果就是负样本。模型要学一个特征空间,让正样本对在空间里靠得近,负样本对离得远。ConvNeXt 在这里的角色很自然——它可以无缝地作为 MoCo 的编码器骨干(backbone),负责把图片“翻译”成特征向量。
MoCo 的技术精髓在于两个设计:一是动量编码器(momentum encoder)。它用两套网络,一套叫 query 编码器,一套叫 key 编码器;key 编码器的参数不用梯度下降更新,而是由 query 编码器的参数做指数滑动平均(momentum update)慢慢“跟”出来。这样 key 特征在训练过程中保持稳定,不像孪生网络那样容易崩溃。二是大容量负样本队列。MoCo 维护一个存放历史负样本特征的队列,让每个 query 可以和上千个负样本比较,突破显卡显存的限制。最后用 InfoNCE 损失函数推动这种“拉近正样本、推远负样本”的学习。
经过千百次“找相似”游戏,小Ne心里渐渐浮现出一张高维的“语义地图”:同一类物体的特征彼此靠近,不同类物体互相远离。即便没有标签,他也对“事物之间的关系”有了敏锐的感觉——这是分类任务之外的一种更通用的能力。
- 正样本分子(相似度拉开)
sim(q, k₊)是 query 与正样本的余弦相似度,τ是温度系数。指数函数把相似度映射成正数并放大差异,相似度越高分子越大。 - 负样本分母(对比基数)对队列中 K 个负样本的相似度逐一取指数再求和。K 越大,对比越充分,模型学到的特征越能区分细微差别。
- 余弦相似度(特征夹角)
sim(q,k)=q·k/(‖q‖‖k‖),衡量两个特征向量的方向是否一致,数值范围在 -1 到 1。它只关心方向、不关心模长,天然适合特征相似度比较。 - 负对数(转化为损失)前面是一个概率值——正样本在各样本中的“相对突出程度”。加上负号取对数后,概率越接近 1,损失越接近 0,模型目标明确。
双轨预训练对比
班里有两个同学代表两种学习路线。小Surf代表“有监督”,他每天抱着带标准答案的习题册刷题——每道题旁边都写着明确答案(人工标注);小Self代表“自监督”,他没有答案册,只有一堆没写答案的百科全书,通过完形填空和找相似自己总结规律。两个人月考谁分数高?答案是:要看出题范围、题量和是否超纲。
有监督预训练的代表是 ImageNet-1K 上的分类任务,它需要 128 万张人工标注的图片,标注成本按“人·小时”计算。自监督预训练则只需要原始图像文件,标注成本几乎为零。研究者用两种标准协议来检验两者的差距:线性评估(linear probing)和端到端微调。线性评估是把预训练骨干完全冻结,只在特征之上训练一个线性分类头,用来衡量特征本身的线性可分性;微调则是放开全部参数,用下游任务数据继续训练。
从实验结果看,ConvNeXt 配合 MAE/MoCo 的自监督预训练,在线性评估上已经能逼近甚至追平有监督预训练;而在数据量较小的下游任务上,自监督往往更稳健。原因在于:有监督的分类目标会让特征偏向“区分类别专属的判别信息”,自监督的重建/对比目标则迫使模型保留更多通用结构信息。此外,自监督还有一个隐藏优势——数据效率。当你有 1000 万张无标签遥感图时,自监督可以放心地全量训练,而有监督只能望着标注预算叹气。
月考成绩揭晓:小Surf在训练过的题型上表现优异,但一遇到新科目、新题型立刻打折扣;小Self虽然开始慢热,却建立了一套更通用的认知框架,在没见过的题上反而更稳。这恰好点出自监督预训练的核心价值——它不追求在某一本练习册上拿满分,而要打造一个能应对各种新任务的通用大脑。
f 完全冻结,只有线性层权重 W 可学习。用交叉熵衡量线性分类头的预测与真实标签的差异,得分越高说明预训练特征越“线性可分”、质量越好。- 冻结特征提取(验收通用的关键一步)
f(x)是预训练好的特征提取器(如 ConvNeXt),评估时参数不再更新,只把输入图像变成特征向量,用它来检验特征本身好不好用。 - 线性分类头(只允许一条直线切分)
W^T是一个矩阵乘,把特征向量投影到类别数维度。它只能做线性变换,不能实现复杂的非线性拟合——因此结果好坏完全取决于特征的分布质量。 - Softmax 归一(变成类别概率)把线性输出转成总和为 1 的概率分布,每个类别对应一个 0 到 1 之间的概率值。
- 交叉熵损失(衡量预测与真实差异)
CE(p, y)计算预测分布和真实标签的交叉熵,值越小说明预测越准。整个公式就是“给冻结特征装一个临时线性头来打分”。
迁移下游任务
学完一个学期的通识课后,小Ne要参加分科考试了:数学考图像分类、物理考目标检测、生物考语义分割。如果每门课都从零开始翻课本,他得累死;聪明的做法是带着已经形成的“通用认知框架”,只花少量时间熟悉每个科目的出题套路。这个过程,在深度学习里叫迁移学习——把预训练阶段学到的通用视觉表示,适配到具体下游任务。
为什么 ConvNeXt 的自监督预训练模型能迁移得这么好?关键在于 MVCo/MAE 学到的是“图像的通用语法”:边缘怎么组织、纹理怎么分布、物体与背景怎么区分——这些都是所有视觉任务共享的基础。下游任务通常只有少量标注数据(几千张),如果从头训练大模型非常容易过拟合;而从预训练权重出发,模型只需要在已有基础上做小幅修改,就能用少量数据学好。
实际操作中有两种常用策略:冻结骨干 + 轻量头和全量微调。冻结骨干适合标注极少的场景,特征提取器完全不动,只训练一个简单的分类头或检测头,训练快、不易过拟合;全量微调适合数据比较充足的情况,让预训练权重在下游数据上继续适应,上限更高。ConvNeXt 自监督预训练模型在 Faster R-CNN 目标检测、U-Net 语义分割等任务上都表现不错,有力地证明了纯卷积骨干同样能通过自监督获得通用表示,而不是只有 Transformer 才能做到。
小Ne把通识课学到的思维框架迁移到每门分科考试后,每门课都轻松进入了班级前列。这说明预训练的价值不在于“记住了多少题”,而在于建立了可以复用的底层能力——这也是自监督预训练如今成为计算机视觉标配流程的根本原因。
f_θ 和任务头 Head 一起参与训练,目标是在下游任务数据集 D_task 上最小化交叉熵损失,得到最终参数 θ^*。- 任务头(适配不同科目)
Head是下游任务特有的输出头——分类任务用线性层,检测任务用检测头。它负责把通用特征翻译成具体任务需要的输出格式。 - 预训练骨干(继承通用知识)
f_θ是带着预训练权重的 ConvNeXt,初始参数来自 MAE/MoCo 自监督训练。它提供了对图像的底层理解,是迁移的“本金”。 - 任务数据集求和(围绕下游数据优化)对下游任务的每个标注样本
(x, y)计算损失并求和,表示微调的优化方向完全由具体任务决定。 - 参数寻优(找到最优解)
arg min θ表示我们要找到一组能让损失最小的参数组合。微调就是在这个目标引导下,把“通识能力”调整成“专科能力”。
预训练设置评估
小Ne能在月考中稳定发挥,除了天赋和方法,还离不开一份科学的训练计划表。老师每天给他规定学几个小时(训练轮数)、用什么题本(数据增强)、多久自测一次(评估协议)。自监督预训练也一样:方法对了还不够,配置没跟上,再好的模型也练不出理想效果。ConvNeXt 在自监督预训练时的种种“学习计划”细节,直接决定了最终特征质量的上限。
先看优化器。自监督预训练普遍采用 AdamW 优化器——它在 Adam 的基础上加入了权重衰减(weight decay),能有效抑制过拟合。学习率通常在 1e-4 量级,配合余弦退火策略逐步降低;batch size 则大胆用到 4096 甚至更大,因为对比学习特别需要足够多的负样本,重建任务也受益于大批量的稳定梯度。训练轮数方面,自监督普遍需要 300 到 800 甚至 1600 个 epoch——毕竟没有标签,模型要从数据里自己找规律,得多刷几遍才学得透。
数据增强策略同样关键。自监督训练通常采用 RandomResizedCrop(随机裁剪缩放)、RandAugment(自动增强)等强增强手段,迫使模型学习到对变形、遮挡、光照变化鲁棒的特征。预训练完成后,用两种协议验收:先做线性评估——冻结骨干训线性头,快速判断特征质量;再做端到端微调——看模型在具体下游任务上的最终表现。两个指标配合着看:线性评估反映特征的“通用度”,微调结果反映“可用度”,只有都达标才算真正合格的预训练模型。
有了科学的训练计划,小Ne的成绩单既稳定又可靠。这份“计划表”也提醒我们:自监督预训练不是简单地“拿去训练就行”,从优化器到数据增强、从轮数到评估协议,每一个环节都值得仔细调试——而这正是工程师发挥价值的地方。
m̂_t 和 v̂_t 分别是一阶、二阶动量估计,η 是学习率,λ 是权重衰减系数。更新时不仅按梯度方向下降,还额外减去一小部分权重自身,起到正则化作用。- 一阶动量(带动量的梯度方向)
m̂_t是梯度的一阶矩估计,相当于对历史梯度做指数平均,能抑制震荡、加速收敛。它决定了参数往哪个大方向移动。 - 二阶动量(自适应步长)
v̂_t是梯度的二阶矩估计,反映了各个参数的梯度变化幅度。梯度大的方向更新步长会被压缩,梯度小的方向步长相对放大,让每个参数都有适配自己的学习节奏。 - 学习率(整体步长尺度)
η控制每次更新的整体幅度。配合余弦衰减在训练后期缩小步长,帮助模型稳定收敛到最优区域。 - 权重衰减(防止过拟合的“罚款”)
-ηλθ_{t-1}把参数值本身向 0 拉一点点,相当于在损失函数里加了 L2 正则,避免模型的某些权重变得过大、过于依赖训练集中的噪声。
AI 应用场景
医学影像自监督预训练
阶段:预训练阶段
解决的问题:CT、MRI 影像的病灶标注必须由资深放射科医生逐张完成,成本极高,一家三甲医院一年也难攒出足够的高质量标注数据。传统“拿少量标注直接训”的方式容易过拟合,泛化能力差。
具体案例:某医院积累了 5 万张未标注的肺部 CT 切片,算法团队用 ConvNeXt 配合 MAE 掩码重建做自监督预训练,让模型先学会 CT 影像的通用结构特征;之后只标注了其中 2000 张用于微调,训练出的肺结节检测模型 F1 分数超过了直接用 1 万张标注数据从零训练的模型——标注量减少 80%,效果反而更好。
工业质检小样本迁移
阶段:迁移微调阶段
解决的问题:工厂产线上新品类产品的缺陷样本非常稀少(每种只有几十张),而特殊材质表面(金属拉丝、玻璃反光)与 ImageNet 自然图像差异巨大,传统有监督预训练权重迁移效果差。
具体案例:某电子厂把 ConvNeXt 作为骨干,先用 MoCo 对比学习在自己的无标签产线图像上预训练,再在每种新产品缺陷样本上做冻结骨干 + 轻量头微调。结果显示,漏检率比直接使用 ImageNet 有监督预训练权重降低约 30%,新品上线周期从两周缩短到两天。
遥感影像通用特征提取
阶段:通用特征提取阶段
解决的问题:遥感卫星图像与自然图像分布差异极大,且土地分类、目标检测、变化检测等多个任务需要的特征高度重叠,重复训练浪费算力。
具体案例:某地理信息团队用 ConvNeXt 自监督预训练在一大批无标注遥感影像上训练出通用特征提取器,之后冻结骨干,仅训练不同任务的轻量输出头。多个项目共享同一个特征提取器,土地覆盖分类、建筑物变化检测、道路提取任务全部受益,整体训练成本下降约 60%。
Python 演示
import torchimport torch.nn as nnfrom torch.utils.data import DataLoaderfrom torchvision import datasets, transforms class ConvNeXtBlock(nn.Module): def __init__(self, dim, kernel=7): super().__init__() self.dw = nn.Conv2d(dim, dim, kernel, padding=kernel // 2, groups=dim) self.ln = nn.LayerNorm(dim) self.fc1 = nn.Linear(dim, 4 * dim) self.fc2 = nn.Linear(4 * dim, dim) self.act = nn.GELU() def forward(self, x): identity = x x = self.dw(x) x = x.permute(0, 2, 3, 1) x = self.ln(x) x = self.fc1(x) x = self.act(x) x = self.fc2(x) x = x.permute(0, 3, 1, 2) return x + identity class SimpleMAE(nn.Module): def __init__(self, dim=64, mask_ratio=0.75): super().__init__() self.patchify = nn.Conv2d(3, dim, kernel_size=4, stride=4) self.encoder = nn.Sequential(*[ConvNeXtBlock(dim) for _ in range(4)]) self.unpatchify = nn.ConvTranspose2d(dim, 3, kernel_size=4, stride=4) def forward(self, x, mask_ratio=0.75): tokens = self.patchify(x) B, C, H, W = tokens.shape N = H * W tokens = tokens.flatten(2).transpose(1, 2) num_keep = int(N * (1 - mask_ratio)) noise = torch.rand(B, N, device=x.device) keep_idx = noise.topk(num_keep, dim=1).indices keep = torch.gather(tokens, 1, keep_idx.unsqueeze(-1).expand(-1, -1, C)) enc = self.encoder(keep) out = torch.zeros_like(tokens) out.scatter_(1, keep_idx.unsqueeze(-1).expand(-1, -1, C), enc) out = out.transpose(1, 2).view(B, C, H, W) return self.unpatchify(out) def train_one_epoch(model, loader, opt, device): model.train() total = 0.0 for x, _ in loader: x = x.to(device) pred = model(x) loss = ((pred - x) ** 2).mean() opt.zero_grad() loss.backward() opt.step() total += loss.item() return total / len(loader) def main(): device = "cuda" if torch.cuda.is_available() else "cpu" model = SimpleMAE(dim=64).to(device) opt = torch.optim.AdamW(model.parameters(), lr=1e-3) ds = datasets.CIFAR10( root="./data", train=True, download=True, transform=transforms.ToTensor()) loader = DataLoader(ds, batch_size=64, shuffle=True) for ep in range(3): loss = train_one_epoch(model, loader, opt, device) print(f"epoch {ep+1}: mse={loss:.4f}") if __name__ == "__main__": main()
self.dw = nn.Conv2d(dim, dim, kernel, padding=kernel // 2, groups=dim)深度卷积:每个通道独立做 7×7 空间卷积,是 ConvNeXt 大核感受野的基础,参数却只有普通卷积的 1/通道数。x = x.permute(0, 2, 3, 1)把通道维度移到最后一位,这是为了配合 LayerNorm 在特征维度上做归一化。self.fc1 = nn.Linear(dim, 4 * dim)逆瓶颈的升维层:把通道数放大 4 倍,给特征更多表达空间。keep_idx = noise.topk(num_keep, dim=1).indices随机生成噪声并取前 k 个索引,实现“随机保留可见 patch”的掩码策略,对应 MAE 保留 25% 可见块。out.scatter_(1, keep_idx.unsqueeze(-1).expand(-1, -1, C), enc)把编码器输出的可见 patch 特征“放回”完整序列的对应位置,其余位置保持为 0,供解码器补齐。loss = ((pred - x) ** 2).mean()在整张图像上计算 MSE 重建损失。真实 MAE 会额外用掩码矩阵只统计被遮盖区域,这里做全局平均是简化版本。
常见误区
误区很多同学看到自监督不依赖人工标注,第一反应是“没有标准答案凭什么学得好?有监督预训练肯定天花板更高。”
正解自监督的目标不是任务标签,而是数据本身的结构。MAE 让模型还原被遮盖的像素,是“数据自己当老师”;MoCo 让同源特征靠近、异源特征远离,也是从数据内在关系里挖监督信号。在 ImageNet 线性评估上,ConvNeXt 自监督预训练已经能逼近甚至追平有监督预训练;在下游小数据场景中,自监督的通用特征往往更稳健。
为何常见:容易把“监督信号”等同于“人工标签”,忽略了像素重建和特征对比本身就是强大的监督信号。人类“刷题”的经验让我们低估了“在观察中发现规律”的学习效率。
误区因为 MAE 论文大火时用的是 ViT 架构,不少初学者认为重建式自监督是 Transformer 的专属能力,纯 CNN 做不了掩码重建。
正解ConvNeXt 通过无 padding 设计和轻量解码器,同样能用 75% 掩码重建训练,相关方案称为 FCMAE(全卷积掩码自编码器)。ConvNeXtBlock 的 7×7 深度卷积提供了大感受野,patchify 卷积完成了 token 化,两者结合完全满足重建任务的需求。卷积模型的局部归纳偏置在某些数据集上反而更稳定。
为何常见:对架构的认知被经典论文“绑定”了,把某个具体实现当作理论边界,忽略了架构设计的通用性。
误区提到自监督预训练,很多初学者把 MAE 和 MoCo 混为一谈,认为两者都在“生成数据”,只是生成方式不同。
正解MAE 学习“还原像素”,是生成式自监督,损失在像素空间计算;MoCo 学习“特征亲疏”,是对比式自监督,损失在特征空间计算。一个回答“被盖住的图像长什么样”,一个回答“哪些图像本质相同”,目标空间完全不同。两者可以互补,但不能互相替代。
为何常见:自监督是总称,生成式和对比式是两个并列子类。初学者只记住了“不用标签”这个共同点,忽略了任务目标上的根本分歧。
误区拿到预训练权重后习惯性地全网络更新,觉得“冻结骨干就浪费了预训练模型的潜力,效果肯定不好”。
正解线性评估协议就是“冻结骨干 + 训练线性头”的典型用法。在标注极少的下游任务中,冻结 ConvNeXt 骨干再加一个轻量检测头/分类头,训练快、不易过拟合,往往是比全量微调更稳妥的选择。全量微调虽然上限更高,但需要足够的数据支撑,否则容易灾难性遗忘预训练学到的通用特征。
为何常见:日常训练习惯“端到端”思维,忽略了对特征质量的单独测量方式。线性评估正是为了隔离“特征好不好”和“适配好不好”这两个问题而设计的。
误区做自监督预训练时,直接把 ImageNet 有监督分类的轮数、学习率、数据增强设置复制过来,觉得“反正都是训练网络”。
正解自监督任务的优化难度远大于有监督分类。MAE/MoCo 通常需要 300 到 800 甚至更多 epoch,batch size 要大(对比学习尤其需要足够负样本),数据增强要更强(RandomResizedCrop、RandAugment 几乎是标配),学习率和 weight decay 也需要专门调整。照搬有监督配置轻则收敛慢,重则训练崩溃。
为何常见:两者表面共享“预训练”这个名称,实际优化目标完全不同。有监督有明确的类别信号指引,自监督要靠海量数据和精心配置才能从无标注数据中稳定提取结构信息。
面试题
Q1. ConvNeXt 中最核心的模块改造借鉴自哪种架构?
- A.Swin Transformer 的分层窗口设计← 正确答案
- B.VGG 网络的深层堆叠全卷积
- C.GoogLeNet 的 Inception 多分支
- D.SENet 的通道注意力门控机制
答案:A。ConvNeXt 的口号是“把 Transformer 设计哲学搬进 CNN”,核心改造包括 patch 化 stem、逆瓶颈、大核深度卷积,这些都直接借鉴了 Swin Transformer 的设计思路。VGG 的堆叠是全卷积思路,Inception 是多分支,SENet 是通道注意力,都不是 ConvNeXt 的核心灵感来源。
Q2. 逆瓶颈结构中中间层通道数通常是输入通道的几倍?
- A.二倍
- B.四倍← 正确答案
- C.八倍
- D.十六倍
答案:B。ConvNeXt 的逆瓶颈模块先用 1×1 卷积把通道升到输入的 4 倍,让特征在更宽的空间里流动,再用 1×1 卷积降回原通道数。这个“先扩写再精简”的比例沿用了 Transformer FFN 中常见的 4 倍设置,过大则参数爆炸,过小则表达能力不足。
Q3. 自监督预训练相比有监督预训练,核心优势是?
- A.完全不需要人工标注数据← 正确答案
- B.损失函数一定降得更低
- C.推理速度会比原来更快
- D.模型参数量自动更小
答案:A。自监督预训练直接用原始图像做训练信号——MAE 重建像素、MoCo 对比特征,全程不需要人工标注。损失高低、推理速度、参数量都与预训练方式无必然联系。省掉标注成本、利用海量无标注数据,这是自监督最大的竞争力。
Q4. MAE 的掩码策略通常遮盖多少比例的图像块?
- A.四分之一左右
- B.二分之一左右
- C.四分之三左右← 正确答案
- D.全部图像不留空白
答案:C。MAE 默认遮盖 75% 的 patch,只保留 25% 给编码器处理。遮盖比例太高任务过难无法收敛,太低则任务太简单学不到深层结构。75% 是经过实验验证的甜点值,同时也让编码器的计算量减少约 3 倍——因为只处理可见的 25%。
Q5. 关于 MoCo 对比学习,下列哪些描述是正确的?
- A.同图两次增强构成正样本对← 正确答案
- B.动量编码器由滑动平均更新← 正确答案
- C.负样本稳定来自大容量队列← 正确答案
- D.InfoNCE 推近负样本距离
答案:ABC。MoCo 中同一张图做两次随机增强得到正样本对;key 编码器的参数由 query 编码器做指数滑动平均得到,保证负样本特征稳定;负样本队列保存历史特征,容量可达数千,突破显存限制。InfoNCE 的作用恰恰相反——它推远负样本、拉近正样本,所以 D 错误。
Q6. ConvNeXt 在下采样阶段采用哪种方式?
- A.步长为二的 3×3 普通卷积← 正确答案
- B.步长为一的空洞卷积堆叠
- C.最大池化配合 1×1 卷积
- D.转置卷积上采样再下采样
答案:A。ConvNeXt 在每个 stage 之间的下采样层使用步长为 2 的 3×3 卷积,同时通道数翻倍。相较传统 ResNet 的分支式下采样,这种直接卷积方式结构更简洁。空洞卷积不改变分辨率,池化是 ResNet 的旧方案,转置卷积用于上采样,均不符合。
Q7. 自监督预训练与有监督预训练对比,正确结论是?
- A.有监督需要大规模人工标注← 正确答案
- B.自监督特征在下游更通用← 正确答案
- C.自监督无法迁移到检测任务
- D.线性评估可追平有监督水平← 正确答案
答案:ABD。有监督预训练依赖 ImageNet 等大型标注集,自监督只用原始图像。自监督的重建/对比目标迫使模型保留更多通用结构信息,下游迁移时更稳健;线性评估协议下自监督已逼近甚至追平有监督。C 错误——ConvNeXt 自监督预训练在 Faster R-CNN 等检测任务中迁移表现良好。
Q8. InfoNCE 损失中的温度系数 τ 主要调节什么?
- A.负样本梯度的平滑分配程度← 正确答案
- B.正样本余弦相似度的阈值
- C.掩码比例的固定常数
- D.动量编码器的更新速度
答案:A。温度系数 τ 控制相似度分布的锐利程度:τ 越小,分布越尖锐,模型对难负样本的惩罚越集中;τ 越大,分布越平滑,各负样本的梯度贡献越均匀。它不设阈值、与掩码无关、也不影响动量更新速度,只调节对比学习的“注意力分配”。
Q9. 冻结骨干只训练线性层的评估方式叫作?
- A.线性探测评估← 正确答案
- B.端到端全量微调
- C.半精度量化评估
- D.知识蒸馏压缩评估
答案:A。线性评估(linear probing)把预训练骨干完全冻结,只训练一个线性分类头,用来衡量特征本身的线性可分性。全量微调会更新骨干参数,量化是压缩模型精度,蒸馏是师生模型迁移,都与“冻结骨干测特征”无关。
Q10. 关于 ConvNeXt 自监督训练配置,正确的有?
- A.使用 AdamW 优化器配置← 正确答案
- B.训练轮数通常达到数百轮← 正确答案
- C.随机裁剪与 RandAugment 有效← 正确答案
- D.学习率必须使用 1e-3 起步
答案:ABC。ConvNeXt 自监督预训练普遍采用 AdamW、训练 300 到 800 甚至更多 epoch、配合 RandomResizedCrop 与 RandAugment 等强增强。学习率通常在 1e-4 量级,而非必须 1e-3 起步,D 错误。自监督任务需要长时间、大批量、强增强才能从无标注数据中稳定提取通用特征。