Courses
几乎每个机器学习项目最终都会走到需要标注数据的阶段,而数据标注所需的时间和资金往往超出大多数团队所能承担的范围。
雇用团队给一百万张图片打标签或转写一百万段音频,成本可能高达六位数。与此同时,互联网上充斥着未标注的文本、图像、音频和视频。ML 团队拥有远多于其可用的原始数据,但几乎没有任何数据自带训练模型所需的标签。
自监督学习不需要标注这一步。它将数据自身的结构转化成训练信息。与其付费让人来说明图像里有什么或一句话是什么意思,不如设定一个数据自己就能回答的任务——例如遮住一个词,让模型根据上下文来猜。
本文将拆解自监督学习的工作原理,梳理其主要技术,并展示它与监督学习、无监督学习以及半监督学习的比较。
什么是自监督学习?
自监督学习是一种在无需人工先为数据打标签的情况下训练模型的方法。
与由人给每个样本打标签不同,数据自带答案。模型查看输入的一部分,隐藏另一部分,并通过尝试填补空缺来学习。完全不需要人工干预。
例如,您可以取一句话,遮住一个词,让模型根据上下文来猜。“The engineer pushed the ___ to the main branch”(工程师将___推送到主分支)这句话给了模型足够的上下文,让它无需任何人告知正确答案也能猜到“code”或“changes”。句子本身就是标签。
自监督学习介于两类方法之间。其训练目标看起来像监督学习——有明确的输入、明确的目标,以及用来衡量预测误差的损失函数。但由于这些目标并非由人创建,人们通常将其归入无监督学习,因为它同样在处理原始的未标注数据。自监督学习借用了前者的训练机制和后者的数据来源。
自监督学习如何工作?
无论处理何种数据,流程都遵循一个可复用的模式。步骤如下:
- 从未标注数据开始: 文本、图像、音频、视频都可以,只要量足够大。
- 从数据本身构造学习任务: 这被称为前置任务(pretext task)。它不是您真正关心的任务;而是一个人为设计的问题,目的是迫使模型学习有用的东西。遮住一个词并预测它就是一个例子。
- 训练模型来解决该任务: 模型做出预测、与真实值对比并进行调整。
- 学习有用的表示: 在解决前置任务的过程中,模型会构建对数据结构的内部理解,如语法、上下文、形状和模式等。
- 将这些表示用于下游任务: 一旦模型学到了扎实的表示,您就把它用于真正想解决的任务。这就是下游任务(downstream task)。
前置任务只是训练练习。没有人会为了好玩而部署一个“预测隐藏词”的模型——其价值来自过程中学到的表示,这些表示可以迁移到真实问题上。
自监督学习与其他学习方法对比
理解自监督学习最简单的方式,就是看它与其他训练范式的重叠与差异。
自监督 vs. 监督学习
监督学习需要为每个输入提供一个带标签的示例,如被标注为“dog”的图片,或被标注为“negative”的评论。有人必须手工创建这些标签,这意味着成本、时间,以及您在现实中可用数据量的上限。
在自监督学习中,模型仍要预测一个目标,但该目标来自数据本身——比如隐藏词或序列中的下一个 token。无需人工标注即可生成训练信号。
自监督 vs. 无监督学习
两者都处理未标注数据,因此常被混淆。区别在于目标不同。
无监督学习在没有明确预测目标的情况下寻找结构,例如对相似客户进行聚类或降低数据集的维度。自监督学习则从数据中构造出一个明确的预测任务,再训练模型去解决它。这个预测目标让自监督学习拥有类似监督学习的训练循环,尽管标签是自生成的。
自监督 vs. 半监督学习
半监督学习会有意将一小部分带标签数据与更大规模的未标注数据混合,同时使用二者来提升模型效果。
自监督预训练一开始完全不需要任何标签。It 可以完全在未标注数据上进行预训练,然后可选地在后续使用带标签数据进行微调。如果出现标签,也是预训练之后的事。
| 是否需要标签 | 学习信号来源 | 典型用途 | |
|---|---|---|---|
| 监督学习 | 需要,每个样本都要 | 人工创建的标签 | 在目标任务上直接训练模型 |
| 无监督学习 | 不需要 | 数据中的结构(聚类、模式) | 分组、降维 |
| 半监督学习 | 部分,需要与未标注数据混合 | 带标签样本 + 未标注数据中的模式 | 在带标签数据不足时提升准确率 |
| 自监督学习 | 预训练阶段不需要 | 由数据本身构造的前置任务 | 在下游任务微调前的预训练 |
自监督学习与其他方法的比较
自监督学习的类型
自监督方法大致分为几个家族,每一类都围绕不同的前置任务构建。
对比学习
对比学习训练模型去区分相关与不相关的样本。它将相似样本的表示拉近,将不相似样本的表示推远,而无需使用人工标签来定义“相似”。
同一张图像的两个增强版本视为相关;图像及其匹配的标题也视为相关。SimCLR将这一思想应用于单一模态,在同一图像的不同裁剪或变换之间进行比较。CLIP则跨模态应用,将图像与描述它们的文本对齐。
掩码建模
掩码建模会隐藏输入的一部分并训练模型来重建它。这与前文的“填空”示例相同,只是应用得更广泛。
在语言中,这体现为掩码语言建模,即在句子中隐藏少量词语并从其余部分进行预测。在视觉中,这体现为掩码图像建模,即隐藏图像块并让模型重建缺失像素或其底层表示。
自回归学习
自回归学习利用前面的一切来预测序列中的下一个元素。给定句子的开头,模型预测下一个词;得到那个词后,再预测后一个,依此类推。
这是多数现代语言模型预训练背后的目标。它与文本天然契合,因为语言本就是从左到右的序列,并且可以无需额外设置就扩展到超大规模语料。
自蒸馏
自蒸馏使用模型自身的预测作为目标来训练,而不是使用隐藏在数据中的固定答案。
一种常见设置是让两个版本的同一网络——“学生”和“教师”——在同一输入的不同视图上运行。学生学习去匹配教师的输出,而教师以学生的滑动平均进行慢更新。DINO和BYOL是代表性方法。无需负样本或掩码输入,模型通过跨视图的一致性自举出监督信号。
自监督学习在大语言模型中的应用
自监督几乎覆盖了大语言模型的整个预训练阶段。您用过的每个主流 LLM 都是在没有任何人工标签的情况下,单纯通过在原始文本上的自监督前置任务来学习语言结构、事实和推理模式的。
下一个 token 预测
大多数现代 LLM 在预训练中使用下一个 token 预测:给定一段 token 序列,预测其后出现的那个。模型读取某位置之前的所有内容,猜测接下来是什么,与真实的下一个 token 对比并进行调整。
如果在从网站和代码仓库抓取的数万亿 token 上运行这一过程,模型会逐步建立起对语法、事实,甚至推理模式的有效表征。这就是前文所述自回归目标在大规模上的应用。
掩码语言建模
在自回归预训练占据主流之前,像BERT这样的模型使用的是另一种前置任务。BERT 不是预测接下来是什么,而是在句子中随机遮住 token,并利用双向上下文来预测它们。
这种双向上下文让掩码语言模型在分类、问答等理解类任务上表现出色,尽管它们不像下一个 token 预测模型那样用于生成文本。
从大型文本语料中学习
没有数据规模,这一切都无从谈起。预训练数据来自网页、书籍、代码仓库和论坛,经过筛选与去重汇总成包含数十亿乃至数万亿 token 的语料。语料越大、越多样,得到的表示就越通用。
预训练是自监督发挥作用的阶段,但并非最后一步。通过微调使模型学会遵循指令;而如 RLHF 或 DPO 之类的偏好优化方法则利用排序的人类偏好来塑造其回答。这两个后续阶段都需要带标签数据。唯有自监督预训练阶段不需要。
自监督学习在计算机视觉中的应用
计算机视觉是一个典型的标注数据短缺领域。绘制边界框和分割掩码比给一段文本打一个标签要耗时得多,这使自监督方法在此领域尤为重要。
对比图像学习应用了前文“拉近-推远”的思想,包括取同一张照片的两个增强版本(裁剪或翻转),训练模型识别它们为相关,同时将同一批次中的其他图像视为不相关。SimCLR是这一方法在图像上的知名案例。
掩码图像建模将语言中的“填空”思想迁移到像素层面。思路是隐藏图像块并训练模型重建缺失内容,可以是原始像素,也可以是学习到的特征表示。这就是MAE(掩码自编码器)背后的目标。
图文对齐训练模型将图像与描述它们的标题匹配,在共享嵌入空间中拉近匹配对、分离不匹配对。CLIP是最知名的例子,这也是为何用这种方式训练的模型支持零样本分类——它们无需显式训练某类别,也能仅通过将图像与文字描述进行比较来识别类别。
超越文本与图像的自监督学习
前置任务始终与数据形态相契合,因此只要您拥有大量未标注数据,通常就能围绕它设计一个自监督任务。
在语音与音频中,模型会预测被掩码的音频片段,或像视觉模型对比图像裁剪那样对比不同音频片段,从而学习对语音识别等任务有用的表示,而无需一开始就提供转写过的训练数据。
在视频中,前置任务可以涉及预测未来帧或匹配来自同一源视频的片段,让模型获得单帧图像无法提供的运动与时间结构感知。
多模态模型会一次性结合以上两种或多种思路,在共享表示空间中对齐文本、图像、音频与视频,类似于 CLIP 对齐图像与文本,但扩展到了更多数据类型。
自监督甚至出现在科学与传感器数据中——如基因序列或时间序列传感器读数——通过掩码或预测信号的一部分,让模型从原本并非“为标注而生”的测量数据中学习结构。
自监督模型的下游使用方式
预训练产出的是一个擅长解决前置任务的模型。没人真正关心这一点,关键在于接下来如何使用它。
微调
微调会在您真正想要的带标签任务上继续训练预训练模型的全部权重。由于模型已经理解了该领域的结构,微调通常需要的标注数据远少于从零开始训练一个模型。
线性探测
线性探测会将预训练模型完全冻结,只在其输出之上训练一个线性层。如果一个简单的线性分类器就能用这些冻结特征把类别分开,说明预训练表示捕捉到了真实结构。因此,线性探测常用于单独评估表示质量,而不受完整模型可微调程度的影响。
特征提取
特征提取与线性探测类似,但不包括线性层。您取用冻结的表示并将其输入任意下游算法。预训练模型的唯一工作是生成良好的嵌入,其后的所有内容由您决定。
零样本与小样本使用
某些表示好到无需任何下游训练即可使用。CLIP通过将图像与一组候选文本标签嵌入到同一空间,然后选择与图像最近的标签来实现这一点。小样本学习在此基础上加入少量带标签样本,这往往已足够,因为表示本身已承载了模型所需的大部分结构。
通过自监督学习,您获得的是可复用的表示。预训练一次,然后可在尽可能多的下游任务上进行微调、探测、特征提取或直接查询。同样昂贵的工作主要集中在一次性的预训练阶段,而不是每个任务都重复进行。
用 Python 进行自监督学习
这里给出一个使用预训练模型的轻量示例,而不是从零搭建自监督系统——只是为了让您感受一下工作流程。
all-MiniLM-L6-v2可通过 sentence-transformers 包获取,先用掩码语言建模目标进行预训练,再在句子对上用对比目标进行进一步训练。自监督部分已经替您完成——您只需将得到的表示投入使用即可。
首先,请确保安装依赖:
pip install sentence-transformers scikit-learn
接下来是代码:
from sentence_transformers import SentenceTransformer
from sklearn.linear_model import LogisticRegression
# Create unlabeled data
support_tickets = [
"My order arrived damaged and I need a replacement.",
"The app crashes every time I try to upload a photo.",
"I love how fast the checkout process is now.",
"Can you tell me when my refund will be processed?",
"The new dashboard layout is so much easier to use.",
"I can't log in, it keeps saying my password is wrong.",
]
# Load a model pretrained with a self-supervised objective
model = SentenceTransformer("all-MiniLM-L6-v2")
# Obtain learned representations
embeddings = model.encode(support_tickets)
print(embeddings.shape)

嵌入向量形状
.encode() 方法将每条工单输入预训练模型,并返回表示其语义的稠密向量。从这里开始,下游任务只需要少量带标签示例,因为嵌入已经承载了大部分结构:
# Use the representations for a downstream task, 1 = complaint, 0 = positive feedback
labels = [1, 1, 0, 1, 0, 1]
clf = LogisticRegression()
clf.fit(embeddings, labels)
new_ticket = ["The delivery was late and no one responded to my email."]
new_embedding = model.encode(new_ticket)
print(clf.predict(new_embedding))

逻辑回归预测
这里六条带标签工单配合一个 LogisticRegression 分类器就足够了,因为大部分工作由表示而非分类器完成。
自监督学习的优势与局限
下面来看看自监督学习的优缺点。
优势
- 降低对人工标注数据的依赖: 前置任务自生成目标,因此标注预算不再成为可训练数据量的硬性上限
- 充分利用超大规模数据集: 互联网规模的文本与音频集合都可用于训练,而不仅是团队负担得起标注的小子集
- 产出可迁移的表示: 单个预训练模型即可支持在多个不同下游任务上的微调、线性探测、特征提取与零样本使用
- 支持大规模预训练: 这是当今基础模型之所以成为可能的根本原因。
局限
- 显著的算力需求: 在互联网规模数据上的预训练需要强大的硬件与时间,远超多数团队的能力范围
- 前置任务设计至关重要: 设计不当的前置任务会产出难以迁移的表示,无论数据量多大都无济于事
- 学到的表示可能继承偏见: 训练数据中的模式、缺失或偏斜会在表示中体现出来,因为预训练阶段没有任何机制去过滤它们
- 强劲的预训练表现并不保证下游成功: 一个在前置任务上表现优秀的模型,仍可能在其未被直接优化的特定下游任务上表现不佳
自监督学习为何对现代 AI 至关重要
自监督学习正是基础模型成为可能的原因。
若依赖人工标签,现代模型所需规模的预训练将遥不可及。Nobody 会手工标注一万亿个文本 token 或十亿张图像。自监督让在互联网规模数据集上的预训练变得可行,然后将这一单一模型复用于众多下游任务,而非为每个任务单独训练一个模型。
从多个特定任务模型转向一个通用预训练模型并适配多种用途,这是现代 AI 的总体方向。自监督学习是促成这一转变的机制。
结语
自监督学习不是依赖人工撰写的标签,而是从未标注数据的结构中自生成监督。典型模式是遮住一个词或预测下一个 token。数据自己提出问题并给出答案,模型通过尽量答对来学习。
主要方法都在这一思想上以不同方式构建:对比学习将相关样本拉近、无关样本推远;掩码建模隐藏输入的一部分并训练模型重建;自回归学习根据前文预测序列中的下一个元素。机制各异,但都遵循让数据自身结构提供训练信号这一共同原则。
正因这一原则,您已经在使用的大多数语言、视觉和多模态模型都以自监督为基础。下一个 token 预测预训练了当今的 LLM;对比与掩码目标预训练了视觉模型;图文对齐预训练了将二者结合的多模态模型。
如果您想从零学习如何创建 LLM,欢迎报名我们的Developing Large Language Models 学习路径,观看 PyTorch、Hugging Face 与前沿 NLP 技术的实战演示。
FAQs
什么是自监督学习?
自监督学习是一种无需人工创建标签就能训练模型的方法。模型查看输入的一部分,隐藏另一部分,并通过尝试预测缺失部分来学习。数据自行提供训练信号,这正是其“自监督”的含义。
自监督学习与无监督学习有何不同?
二者都处理未标注数据,但方法不同。无监督学习在没有明确预测目标的情况下寻找结构,例如将相似客户分到一组。自监督学习则从数据本身构造出一个明确的预测任务,然后训练模型去解决它。
自监督学习为何对现代 AI 重要?
它是基础模型之所以成为可能的根本原因。若依赖人工标注,今天这种规模的预训练根本无法实现——没人会手工标注一万亿个文本 token。自监督让一个预训练模型可以复用于多个不同下游任务,而不必为每个任务单独训练模型。
前置任务与下游任务有何区别?
前置任务是在预训练期间让模型解决的人为设定问题,例如预测被遮住的词。它不是您真正关心的任务——它只是迫使模型学习有用的表示。下游任务是在之后将这些表示应用到的真实问题,比如分类或搜索。
自监督学习能在零标签的情况下工作吗?
可以,预训练本身完全不需要标签。模型学到表示之后,某些下游用法(如 CLIP 的零样本分类)在运行时仍不需要任何标签。其他方法(如微调或小样本学习)只在后续阶段引入少量带标签数据。