资讯详情

资讯详情

自监督学习入门到实战:对比学习与掩码重建全解析

自监督学习这几年的热度不用我多说了。从BERT到GPT系列从SimCLR到MAE几乎所有刷榜的模型背后都有它的影子。很多刚入门的朋友问我自监督学习到底是个啥跟传统监督学习有什么本质区别为什么突然就火了。这篇文章算是我自己学习路线的一个整理把那些绕来绕去的概念用大白话讲清楚把方法分类理清楚也会分享一些我在实际实验中踩过的坑希望能给想入门的同学一个相对完整的参考。1. 自监督学习到底是什么1.1 一个最朴素的理解先说结论自监督学习就是一种不需要人工标注标签直接从数据本身构造监督信号的训练范式。在传统监督学习里你得先花大量人力给数据打标签比如给一万张猫狗图片标注“猫”和“狗”然后模型才能学。自监督学习的思路完全不同——它把数据本身当作老师从数据中自动生成伪标签然后让模型去预测这些伪标签。我举个例子你就明白了。你有一堆文章不需要任何人去标注直接拿一段话的前半句当输入后半句当预测目标让模型学会“续写”。模型为了完成这个任务就必须理解语言的语法、语义、甚至常识知识。这个过程不需要人工标注这就是自监督学习的核心——把无标注数据变成有监督信号。这里的灵魂在于“ pretext task”也就是借口任务或前置任务。你让模型做一件看似简单但实际需要深层理解的任务模型为了做好这个任务被迫学到了通用的特征表示。学完之后这些特征可以直接迁移到下游任务上比如情感分类、目标检测、语义分割等等。1.2 为什么自监督学习现在这么重要说到底还是数据的问题。互联网上有海量的文本、图片、视频但绝大多数是没有标注的。人工标注的成本极高尤其在一些专业领域——比如医学影像标注、自动驾驶场景标注——不仅贵而且需要专家参与根本标不过来。自监督学习恰好解决了这个痛点不需要标注只要能收集到原始数据就能用。另外一个更关键的点是它学到的特征质量在很多时候已经不输甚至超过了有监督预训练。这就让从业者有了新的选择没有标注数据没关系用自监督预训练也能跑出不错的效果。有人会问那这不就是无监督学习吗严格来说不完全一样。传统无监督学习重在发现数据的内在结构比如聚类、降维。自监督学习本质上用的还是监督学习的损失函数和训练框架只是标签来源变了——从人工标注变成了数据自身构造的任务。所以更准确地说它是介于监督学习和无监督学习之间的一种范式有时被归为无监督学习的一个子类但思想和工作方式完全不同。2. 自监督学习的方法体系2.1 四条主要技术路线以我在实际阅读和实践中的理解目前自监督学习的主流方法可以大致分成四大类生成式方法、对比式方法、掩码重建方法和预测式方法。各有各的代表作和适用场景。生成式方法的代表是自编码器、GPT系列的生成式预训练。思路很直接让模型学习把输入压缩成特征再还原回去。如果还原效果好说明特征保留了足够的信息。GPT做的就是在给定上文的情况下预测下一个词本质上也是一个生成任务。这类方法的优势在于任务本身非常自然不需要设计复杂的代理任务而且在大规模数据下扩展性极好。对比式方法是目前视觉领域最主流的一类。核心思想是让模型学会区分“相似对”和“不相似对”。把同一张图片做两次不同的数据增强得到两个“视图”这俩应该被拉近不同图片则应该被推开。SimCLR、MoCo、BYOL都是这条路线的代表。对比学习的优势在于最终学到的特征非常适合用于检索和分类任务。掩码重建方法这两年非常有热度。BERT在文本里做的就是把一部分词挖掉让模型根据上下文预测被挖掉的词。MAEMasked Autoencoder把这个思想搬到了图像领域做法是随机遮盖大部分图像块然后让模型重建整张图。MAE的实验结果很惊人遮住75%的像素再重建模型依然能学到非常有用的特征。这类方法的优势是计算效率高因为只有被保留的小部分图像块参与计算。预测式方法相对小众一些典型的有基于旋转预测让模型判断图像做了什么样的旋转、基于拼图任务让模型判断图像块的相对位置等。这类方法实现简单但最终特征质量普遍不如对比学习和掩码重建方法所以目前更多被用作辅助手段。2.2 为什么方法会分成这么多流派你可能会好奇为什么不能只有一种统一的方法呢原因是不同模态数据的“自然监督信号”是不一样的。文本天生具有顺序性和因果性所以预测下一个词、掩码预测都很自然。图像没有天然的“下一个像素”概念所以设计者开发出了对比学习、图像重建等方式来制造监督信号。视频则有时间维度可以预测未来帧、判断时间顺序。这四类方法在不同的数据模态上各有所长本质上都是在回答一个问题怎么设计一个足够难的借口任务逼着模型学到真正有用的特征。2.3 方法演进背后的两条主线如果仔细看这几年的发展其实有两条清晰的演进主线。一条是从“手工设计借口任务”走向“自动生成任务”。早期的旋转预测、拼图任务需要人来设计任务形式到了对比学习阶段任务变成了“拉近正样本、推开负样本”形式上更统一再到了生成式与掩码重建任务已经简化到“预测被遮挡的部分”几乎不需要任务设计了。另一条主线是从“需要大量负样本”走向“不需要负样本”。早期对比方法严重依赖负样本的数量与质量直到BYOL和后续方法提出了不需要负样本也能防止坍塌的训练策略整个体系才变得更加简洁优雅。3. 对比学习细节与实战中的关键点3.1 核心机制拆解对比学习是目前视觉自监督里关注度最高的方向。以SimCLR为例整个流程大概是这样取一张图片x做两次不同的数据增强得到两个viewx_i和x_j用编码器比如ResNet提取特征得到h_i和h_j经过一个投影头得到z_i和z_j计算这两个向量之间的相似度目标是让来自同一张图的z_i和z_j尽可能相似而跟其他样本的向量尽可能不同核心的损失函数是InfoNCE。这个损失函数本质上是一个多分类问题——把z_i和z_j的匹配看作正样本把所有其他样本看作负样本用交叉熵形式去优化。可以理解为模型要从一堆选项里选出正确的配对选不出来就得学习更好的特征来区分。这里有一个点必须提——负样本很重要。负样本数量越多、难度越大模型学到的特征就越有判别力。这也是为什么很多对比学习框架的论文开头都在卷batch size因为batch越大负样本越多效果越好。MoCo之所以有影响就是因为它提出了动量队列机制可以维护一个很大的负样本队列而不受GPU显存的限制。但是负样本并不完全是在“越难越好”。如果负样本跟正样本是同一类物体你强行把它们推开模型可能会学到不好的先验。这里面的平衡需要靠数据增强设计和实验来调。3.2 数据增强对比学习中隐藏的主角很多新手入门对比学习时有个误区觉得模型结构才是重点。以我自己的实验经验来说数据增强对结果的影响往往比模型结构更大。SimCLR论文里有张图我印象很深单独用随机裁剪特征质量提升就已经非常明显裁剪加颜色失真效果进一步提升但如果你做裁剪后不做颜色失真效果反而会掉。原因在于裁剪本身会造成图像颜色分布的变化。如果模型只做裁剪它可以靠“颜色直方图不一致”这个捷径来区分正负样本那学到的东西就会很差。颜色失真强迫模型不能依赖颜色统计信息必须去理解物体的内容。实际操作中我建议至少包含以下增强组合随机裁剪resize、随机水平翻转、颜色抖动、灰度化、高斯模糊。把强度的控制放到与模型训练同等重要的位置。过程里可以记录每个增强单独作用时的表现再做组合对比能帮你更直观地感受到这个环节的分量。3.3 训练稳定性的那些坑对比学习训练比普通监督训练要敏感得多。同样一份代码换一个随机种子或者换一块GPU效果就可能出现明显波动。几个我反复踩过的坑优化器选择。SimCLR用的是LARS优化器因为大batch下Adam容易不稳定。如果你的资源不够大batch可以用AdamW配上warmup和cosine schedule实测比Adam更稳。温度系数的设置。温度参数控制的是对难负样本的惩罚力度。太小模型过于关注难的负样本容易训练不稳太大所有负样本一视同仁学到的特征判别力不够。一般经验范围是0.05到0.2之间SimCLR论文里0.1左右效果较好但还是要根据你的数据情况调。batch size的下限。对比学习确实吃batch size。我做过一个实验batch size从256降到64ImageNet线性评估的准确率掉了将近5个点。如果你显存不够又想做对比学习优先考虑MoCo那套——它能用更小的batch size实现在线负样本队列。模型的最终特征取哪个输出。SimCLR论文特别强调下游任务评价时用的是编码器输出h而不是投影头输出z。如果你把z拿去做下游评估效果会有明显下降。这个小细节很多没认真读论文的人会忽略一开始我也在这里栽过跟头。4. 掩码重建与生成式自监督4.1 MAE为什么能行MAE的暴力美学在于简单直接——随机遮挡图像大部分区域默认75%让解码器从可见的小部分重建被遮挡的像素。刚开始看到这做法你可能会觉得不可思议都遮掉四分之三了怎么学但论文结果恰恰证明遮得越多特征质量越好。我的理解是任务越难模型就越不能靠局部像素相似性来偷懒必须学到更高层的语义信息——比如知道这是一个轮子、一张脸、一个建筑物的边缘。这才是真正通用的特征表示。值得注意的一点是MAE用的是Transformer结构不对称编解码——编码器只处理可见块解码器处理完整集合。这个设计带来的收益非常直接训练开销大幅下降大约只有对比学习的三分之一到二分之一。对资源有限的朋友来说CV方向的入门其实可以先从MAE入手而不是非得从大规模对比学习开始。4.2 BERT与GPT的启示NLP那边其实已经跑在前面了。BERT用的是掩码语言模型任务GPT用的是自回归语言模型任务。两者都属于自监督学习但学到的特征有差异——BERT学到的特征更适合直接用于理解任务分类、抽取、判断GPT学到的特征更适合生成任务写文章、对话、总结。这个差异后来也激发出了很多结合两者的工作。对于自监督学习的理解来说NLP和CV两条线可以互相参照很多方法论是打通的。4.3 生成式方法在CV里的两条路线图像领域的生成式自监督分成两条路线像素级重建和特征级重建。像素级重建的代表就是MAE、BEiT这类直接重建图像的原始像素或者离散视觉token。特征级重建的思路则更进一步——让模型去预测一个预训练特征提取器给出的特征表示比如CLIP特征或者DINO特征这种做法的收敛速度往往比纯像素重建快很多因为目标本身就包含了语义信息。在做实际项目时如果目标是训练一个特征提取器用于下游任务特征级重建的性价比更高如果目标是做生成相关的工作像素级重建会更自然。这两种路线不冲突具体选哪种看你的下游需求。5. 自监督特征在下游任务里怎么用5.1 线性评估与微调学到的预训练特征到底好不好业界有两个主流评价方式线性评估和全量微调。线性评估是指在预训练特征之上冻结骨干网络只训练一个线性分类头。这个方式直接反映特征本身的质量不受微调过程中重新适应目标数据的干扰。全量微调则是把所有参数带着一起调。一般情况下当一个预训练模型的线性评估结果已经很接近它的微调结果时说明特征质量高、可迁移性强而且不容易过拟合到下游任务的小数据集上。我自己的经验是如果下游数据量只有几千张用冻结特征加分类头的方式往往比全量微调更稳全量微调容易在小数据上过拟合。如果下游数据有几十万张全量微调才能体现出预训练模型的优势。5.2 自监督预训练下游微调的完整流程整个工程链路大致是这样步骤一搜集无标注数据清洗去重做基本过滤。数据量越大越好数据多样性比数量更关键步骤二选择预训练方法。通用领域推荐对比学习或MAE文本用掩码语言模型视频用时间对比步骤三在无标注数据上做大规模预训练。这一步最耗时需要盯住训练曲线和特征质量是否有提升步骤四在下游任务上做线性评估确认特征质量是否达标步骤五决定用冻结特征还是全量微调根据数据量和任务类型选择步骤六必要的时候做知识蒸馏把大模型的能力压缩到适合线上部署的小模型上整个链路看起来很长但每一环都有很成熟的实践方案可以参考。5.3 工业场景中真实的选择逻辑工业环境里很多人会纠结“要不要从零做自监督预训练”。我的建议是能不用就不用优先拿现成的开源模型做个评估。只有开源模型在下游任务上的表现确实没法满足业务指标才值得考虑自己动手预训练。原因是自监督预训练的成本不低需要大量数据和计算资源团队如果只有一两张GPU跑一遍大规模预训练可能得几个月。如果决定自己做千万不要从零随机初始化可以在开源权重基础上继续预训练也就是增量预训练。这种方式既能保留通用常识又能注入领域知识训练时间也会大幅缩短。我做过一个医疗影像的项目用ImageNet预训练权重做自监督继续训练比随机初始化从零开始训练少用了接近一半的时间最终的效果也更好。6. 入门路径与工具推荐6.1 最实用的上手顺序如果你完全没接触过自监督学习我建议按下面的顺序走找一个你已经熟悉的监督学习任务比如CIFAR-10分类用开源库跑通一个简单的自监督预训练流程推荐从SimCLR或MAE入手把预训练得到的特征冻结训练一个线性分类头和端到端监督训练做对比去读2到3篇经典论文重点不是看模型结构而是看实验设计——他们对比了什么、为什么这么对比换一个你手里的真实数据集调整数据增强和温度系数记录效果变化整个过程走下来两周到一个月的时间基本的门就算入了。6.2 常用开源工具速览现在生态已经比三四年前成熟太多。我用过的工具里下面这几个最常用OpenMMLab的MMSelfSup覆盖主流方法配置化实验管理适合做系统对比实验Facebook的VISSL基于PyTorch工业级工程化程度高大模型训练支持好Hugging Face TransformersNLP自监督预训练的首选BERT、GPT系列开箱即用timm库提供了大量预训练视觉骨干模型方便直接做特征提取或微调如果只是想快速验证自监督特征在某个任务上的效果直接在timm里下载预训练权重比重新训练快得多。6.3 学习资料怎么选现在的课程和论文非常多没必要都看。我推荐的顺序是先读一篇综述建立全局认知然后精读SimCLR搞懂对比学习的核心机制再看MoCo理解负样本队列的设计哲学最后看MAE感知一下掩码重建路线。精读论文的时候要重点看三块损失函数的具体形式、实验设置里的评估协议特别是线性评估怎么做的、以及消融实验给了什么结论。把例子里那些看似零散的实验发现连起来理解就会比只看正文部分深入得多。7. 做项目时容易踩的坑7.1 评估方式不一致导致的“假效果”这个坑我已经见过很多人掉进去了。同样一个预训练模型不同论文汇报的准确率对应的评估方式可能完全不同。有人用冻结特征线性分类有人用全量微调后分类有人用了更多训练轮次或不同优化器。有一个朋友问我为什么复现出来的比论文低很多检查半天发现是评估协议不一样。你在对比两个模型效果时务必保证评估流程完全一致——同一份数据划分、同一个分类头结构、同一套超参数。没有这个前提任何结论都不可信。7.2 预训练和下游任务不匹配自监督特征是通用的但通用不等于万能。在自然图像上学出来的特征直接用到医学影像、卫星影像、显微图像上效果通常会打折扣。一个常见的错误是拿ImageNet上预训练的模型直接做医学任务发现还不如从零训练效果好。解决办法通常有两个方向一是用领域内的无标注数据进行增量预训练把特征往领域方向拉一拉二是根据任务感受野差异调整输入图像分辨率或裁剪策略。二选一或者两个结合效果一般都会有明显提升。7.3 盲目堆数据不如合理生成数据有人觉得自监督学习就是无脑堆数据数据越多一定越好。这个认知是片面的。更关键的是数据的多样性和任务的难度。如果一万张图都是同一类物体哪怕再训练一百个epoch特征也不会好到哪里去。反过来如果数据类别足够多样、场景足够丰富哪怕只有几万张也能学到不错的特征。做自监督项目之前先花时间分析数据分布、筛掉重复样本性价比远高于无脑堆数据。8. 我对自监督学习现状的一些看法自监督学习现在确实是深度学习中发展最快的方向之一。从方法体系来看对比学习已经相当成熟掩码重建正在快速收获视觉领域的成果。但从工程角度说最终落地效果仍然极大依赖于你对数据、评估方式、超参数的深入理解。我个人在实际操作中最深的体会是自监督学习不是一个“装好就能跑”的工具它需要你对数据分布有清晰认识对评估协议有严格把握对训练曲线保持敏感判断。它对从业者的要求不再是“会调包跑模型”而是“理解任务本质、能设计实验验证猜想、能定位训练过程中的异常”。正因为它难所以能掌握的人其实没有想象的那么多。我见过很多实验室跑通一遍流程之后就不再深挖后面的效果就差强人意。反而是那些愿意花时间做消融、调增强、换评估方式的人最终能稳定地做出更好的结果。最后再分享一个小技巧如果你发现自监督预训练的效果不如预期不要急着换方法先检查一下数据增强部分再从温度系数、batch size和优化器这些细节入手。很多时候问题不在方法框架本身而是某个看起来微不足道的配置没做对。自监督学习的难度不在于原理复杂而在于“细节决定成败”这件事在这里被放大到了极致。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →