是什么
为什么
当人工标注成本过高或数据分布快速变化时,算法工程师与研究者用它从海量无标签数据中提取可迁移特征,降低下游任务对标注的依赖。
怎么做
设计自监督任务(如掩码预测、对比正负样本对),在无标签数据上预训练编码器,再将学到的表示微调或线性探测到具体任务。
什么时候
适用于标注稀缺、数据量大且存在内在结构(文本、图像、语音)的场景;当已有充足高质量标注或任务极度简单时,直接使用监督学习更高效。
FOCUS
先记住这些
自监督任务必须与数据模态匹配
文本常用掩码语言建模,图像常用对比学习或掩码图像建模;任务设计不当会导致表示空间坍塌或无判别力。
预训练效果必须用下游任务验证
仅监控预训练损失无法反映表示质量;需通过线性探测或微调在目标数据集上评估,否则可能学到无用特征。
对比学习对批次大小与温度系数极度敏感
小批次易导致负样本不足,温度系数过高会模糊正负样本边界;需配合学习率预热与强数据增强稳定训练。
PROBLEM / POSITION / INTERFACE
先弄清它为什么存在,以及谁在使用
-
01 解决的问题
拥有大量未标注数据但下游任务标注成本极高或标注质量不稳定。
纯监督学习受限于标注规模,模型泛化差且容易过拟合;无监督学习缺乏明确优化目标,表示难以直接用于下游。
- 成功标准
- 模型在无标签数据上预训练后,仅需少量标注即可在下游任务达到或超越全监督基线,且表示具备跨任务迁移能力。
-
02 AI 生态位
位于数据预处理与下游微调之间,作为通用特征提取器的预训练阶段,上游依赖原始无标注数据,下游服务于分类、检测、生成等任务。
- 上游
- 依赖大规模、分布匹配的原始无标注数据与基础编码器架构。
- 下游
- 为下游任务提供高质量初始化权重或冻结特征提取器,支持线性探测、微调或提示学习。
-
03 人的生态位
人类负责设计自监督任务形式、选择预训练架构与下游验证策略,不参与逐条标注。
- 适合使用
- 数据量大、标注稀缺、下游任务多样且需要强泛化表示时优先采用。
- 不必使用
- 标注充足、任务单一明确、计算资源受限或数据缺乏可预测结构时,应直接使用监督学习或简单启发式方法。
-
04 独特价值
无需人工标注即可利用数据内在结构学习通用表示,显著降低标注成本并提升跨任务泛化能力。
自监督任务设计需与数据模态强匹配;对比学习易受负样本质量与批次大小影响;掩码比例与重建难度需精细调参。
- 复杂度判断
- 复杂度不是功能数量,而是控制与验证成本。
INTERFACE FLOW
谁在操作,信息怎样流动
-
WHO OPERATES
HUMAN设计自监督任务、选择模型架构、评估下游迁移效果
MODEL执行掩码预测、对比学习或生成式重建,优化表示空间
BACKEND提供分布式训练、数据增强流水线与评估指标计算
-
INPUT
未标注的原始数据(文本序列、图像、音频波形等)及数据增强/变换策略。
-
CONTROL
自监督任务类型、对比温度系数、掩码比例、批次大小、学习率调度、增强强度。
-
OUTPUT
预训练模型权重与表示向量,供下游任务微调或线性分类器使用,不直接产生业务决策。
FLOW
标准工作流
import torch
import torch.nn as nn
from torchvision import transforms
from lightly.loss import NTXentLoss
from lightly.models import ResNetGenerator
# 1. 构建编码器与投影头
encoder = ResNetGenerator('resnet-18')
model = nn.Sequential(encoder, nn.Linear(512, 128))
# 2. 定义对比损失与优化器
criterion = NTXentLoss(temperature=0.5)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
# 3. 模拟双视图输入(实际应来自数据增强)
x1 = torch.randn(32, 3, 224, 224)
x2 = torch.randn(32, 3, 224, 224)
# 4. 前向传播与损失计算
z1 = model(x1)
z2 = model(x2)
loss = criterion(z1, z2)
# 5. 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"对比损失: {loss.item():.4f}")最短闭环:构建编码器 → 生成双视图 → 计算对比损失 → 优化。实际需替换为真实数据增强与分布式训练。
{
"pretraining": {
"epoch": 50,
"loss": 0.412,
"learning_rate": 0.0008,
"batch_size": 256
},
"downstream_linear_probe": {
"dataset": "CIFAR-10",
"accuracy": 0.891,
"frozen_encoder": true,
"trainable_params": "linear_head_only"
},
"downstream_finetune": {
"dataset": "CIFAR-10",
"accuracy": 0.934,
"frozen_encoder": false,
"trainable_params": "all_layers"
}
}PRACTICE
自监督训练验证清单
FAQ
常见问题
01自监督学习与无监督学习、监督学习的本质区别是什么?+
无监督学习无明确优化目标(如聚类),监督学习依赖人工标注,自监督学习用数据自身结构自动生成标签,兼具两者优势。
避免概念混淆导致错误选型,自监督是预训练表示学习的专用范式。02最小可用方式是什么?+
选择成熟框架(如 lightly、timm),用默认对比任务在子集上预训练,随后在目标数据集做线性探测验证。
快速验证表示质量,避免盲目投入大规模计算资源。03什么时候不需要自监督学习?+
当标注数据充足、任务单一明确、计算预算有限或数据缺乏可预测结构时,直接使用监督学习或简单特征工程更高效。
控制系统成本与工程复杂度,避免过度设计。04预训练后下游效果差,如何排查?+
检查数据增强是否引入分布偏移、对比温度系数是否合理、预训练是否充分、下游微调学习率是否过高破坏表示。
定位表示学习失败环节,避免盲目调整下游模型结构。05自监督学习能替代监督学习吗?+
不能。自监督提供通用表示初始化,下游仍需少量标注进行任务适配;两者是互补关系而非替代。
明确技术边界,合理分配标注与计算资源。