L3 · 专题文章

自监督学习

无标注数据表示学习预训练对比学习掩码建模

本页只讲 3 条最关键判断,不写百科

3核心点
先记住自监督不是无监督,而是用数据自身构造标签

不掌握任务设计与下游迁移验证,就无法判断预训练是否真正有效。

LIVE
CORE 自监督学习
01 WHAT

是什么

自监督学习是一种利用未标注数据自身结构构造监督信号的训练范式,模型通过预测数据被遮蔽或变换的部分来学习通用表示。

02 WHY

为什么

当人工标注成本过高或数据分布快速变化时,算法工程师与研究者用它从海量无标签数据中提取可迁移特征,降低下游任务对标注的依赖。

03 HOW

怎么做

设计自监督任务(如掩码预测、对比正负样本对),在无标签数据上预训练编码器,再将学到的表示微调或线性探测到具体任务。

04 WHEN

什么时候

适用于标注稀缺、数据量大且存在内在结构(文本、图像、语音)的场景;当已有充足高质量标注或任务极度简单时,直接使用监督学习更高效。

FOCUS

先记住这些

只留最重要的判断,细节见下方实践
01 任务设计

自监督任务必须与数据模态匹配

文本常用掩码语言建模,图像常用对比学习或掩码图像建模;任务设计不当会导致表示空间坍塌或无判别力。

02 迁移验证

预训练效果必须用下游任务验证

仅监控预训练损失无法反映表示质量;需通过线性探测或微调在目标数据集上评估,否则可能学到无用特征。

03 资源与调参

对比学习对批次大小与温度系数极度敏感

小批次易导致负样本不足,温度系数过高会模糊正负样本边界;需配合学习率预热与强数据增强稳定训练。

PROBLEM / POSITION / INTERFACE

先弄清它为什么存在,以及谁在使用

不从历史开始,从真实工作关系开始。
  1. 01 解决的问题

    拥有大量未标注数据但下游任务标注成本极高或标注质量不稳定。

    纯监督学习受限于标注规模,模型泛化差且容易过拟合;无监督学习缺乏明确优化目标,表示难以直接用于下游。

    成功标准
    模型在无标签数据上预训练后,仅需少量标注即可在下游任务达到或超越全监督基线,且表示具备跨任务迁移能力。
  2. 02 AI 生态位

    位于数据预处理与下游微调之间,作为通用特征提取器的预训练阶段,上游依赖原始无标注数据,下游服务于分类、检测、生成等任务。

    上游
    依赖大规模、分布匹配的原始无标注数据与基础编码器架构。
    下游
    为下游任务提供高质量初始化权重或冻结特征提取器,支持线性探测、微调或提示学习。
  3. 03 人的生态位

    人类负责设计自监督任务形式、选择预训练架构与下游验证策略,不参与逐条标注。

    适合使用
    数据量大、标注稀缺、下游任务多样且需要强泛化表示时优先采用。
    不必使用
    标注充足、任务单一明确、计算资源受限或数据缺乏可预测结构时,应直接使用监督学习或简单启发式方法。
  4. 04 独特价值

    无需人工标注即可利用数据内在结构学习通用表示,显著降低标注成本并提升跨任务泛化能力。

    自监督任务设计需与数据模态强匹配;对比学习易受负样本质量与批次大小影响;掩码比例与重建难度需精细调参。

    复杂度判断
    复杂度不是功能数量,而是控制与验证成本。

INTERFACE FLOW

谁在操作,信息怎样流动

  1. WHO OPERATES

    HUMAN设计自监督任务、选择模型架构、评估下游迁移效果

    MODEL执行掩码预测、对比学习或生成式重建,优化表示空间

    BACKEND提供分布式训练、数据增强流水线与评估指标计算

  2. INPUT

    未标注的原始数据(文本序列、图像、音频波形等)及数据增强/变换策略。

  3. CONTROL

    自监督任务类型、对比温度系数、掩码比例、批次大小、学习率调度、增强强度。

  4. OUTPUT

    预训练模型权重与表示向量,供下游任务微调或线性分类器使用,不直接产生业务决策。

FLOW

标准工作流

01设计自监督任务根据数据模态选择掩码预测、对比学习或生成式重建,定义正负样本构造规则。
02大规模预训练在无标签数据上训练编码器与任务头,监控损失曲线与表示空间稳定性。
03下游线性探测冻结编码器,仅训练线性分类器评估表示质量,快速验证迁移能力。
04全量微调或部署若线性探测达标,解冻部分或全部层进行微调,最终部署到业务场景。
CODE / PYTHON最小 Python 调用(对比学习示例)
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}")

最短闭环:构建编码器 → 生成双视图 → 计算对比损失 → 优化。实际需替换为真实数据增强与分布式训练。

JSON / RESPONSE典型训练日志与下游评估结果(示意)
{
  "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自监督学习能替代监督学习吗?

不能。自监督提供通用表示初始化,下游仍需少量标注进行任务适配;两者是互补关系而非替代。

明确技术边界,合理分配标注与计算资源。