↓ 跳过正文
  1. Posts/

训练信号从哪里来:重新理解有监督、无监督、半监督与自监督学习

·3989 字·8 分钟

起因
#

我过去一直把机器学习里的学习范式简单理解成两类:

  • Supervised Learning(有监督学习):每个样本有 label,训练时知道正确答案。
  • Unsupervised Learning(无监督学习):只有样本,没有 label。

这个分法一直挺好用。分类、回归是 supervised,聚类是 unsupervised,清清楚楚。

直到开始接触 Self-supervised Learning(自监督学习)。

它没有人工标注。按"有没有 label"的标准,应该归到 unsupervised 那一边。但看它的训练过程——有 input,有 target,有 loss,有 backprop——跟 supervised learning 长得一模一样。

然后又遇到了 Semi-supervised Learning(半监督学习)。名字和 self-supervised 只差一个词,它们是一回事吗?

我发现自己回答不上来。

回头想,问题出在我用来分类的那个维度太粗了。“有没有 label"能区分最经典的 supervised 和 unsupervised,但碰到 self-supervised 和 semi-supervised 就开始打架。后来换了一个问法,很多东西就顺了。

换一个问法
#

训练一个模型,不管用什么 architecture,核心流程大致是:

1data → model → prediction → ??? → loss → gradient → update

之前写 training loop 的那篇理过这条链路。这里关注的是中间那个 ???——prediction 出来之后,模型凭什么知道自己做得对不对?

它需要某种信号告诉它:你的输出离目标有多远,参数应该往哪个方向调。

这个信号可能来自人工标注的 target,可能来自数据自身的结构,也可能来自少量标注加大量未标注数据的组合,甚至可能不存在显式的预测目标而是在优化某种结构性目标。

与其先问"有没有 label”,一个更有解释力的问题是:模型优化所依赖的训练信号,究竟来自哪里?

Supervised Learning:target 来自外部
#

Supervised learning 最直接。训练数据的形态是 \( (x, y) \)——\( x \) 是输入,\( y \) 是外部提供的训练目标。模型输出 \( \hat{y} \),和真实的 \( y \) 比较,算 loss,更新参数。

supervised signal flow

这里有一个容易被忽视的点:target 不一定是分类标签。

最典型的例子当然是分类——图片是猫还是狗。但回归任务的 target 是连续值,序列任务的 target 可以是一整段文本。我现在做量化,历史特征预测未来收益率——如果未来收益率在训练时已经被算出来作为 target,那本质上也是 supervised。

所以 supervised 说的是训练信号的来源:存在一个外部提供的 target。它不限于分类,也不描述模型结构。

Unsupervised Learning:没有 target,寻找数据中的结构
#

Unsupervised learning 的训练数据只有 \( x \),没有 \( y \)。

最常见的例子是聚类。给算法一堆用户数据,它按照某种相似性度量把用户分成几组。但 cluster 不是真实的 label——聚类算法不会告诉你"这个用户属于类别 A"。它只是在当前特征空间和相似性定义下,把相近的数据点归到了一起。换一种特征或换一种距离度量,聚出来的结果可能完全不同。

无监督学习寻找的是数据中的结构——可能是聚类,可能是低维表示,可能是概率分布——但它没有一个外部标准说"对"或"不对"。

需要说一句:unsupervised 不代表没有优化目标。K-Means 有最小化簇内方差的目标,PCA 有最大化方差方向的目标。它们有 optimization objective,但没有外部提供的 per-sample target。

到这里,supervised 和 unsupervised 的区别还是清楚的:前者有外部给的答案,模型学着去逼近;后者没有答案,直接从数据中发现结构。

Semi-supervised Learning:label 太贵了
#

分到这里都还挺顺。现实问题来了。

实际场景中经常碰到一种情况:raw data 有 100 万条,但人工标注只覆盖了 1 万条。标注需要领域专家,需要时间,需要钱。剩下 99 万条没标注的数据,真的一点价值都没有吗?

Semi-supervised Learning(半监督学习)就是在处理这个问题:

1少量 labeled data (x, y)  +  大量 unlabeled data (x)

一个典型的思路是 pseudo-label:先用少量标注数据训练一个初始模型,然后让这个模型去预测未标注数据的 label,把置信度高的预测当作伪标签加入训练集,继续迭代。还有一类方法是 consistency regularization——对同一个未标注样本做不同的增强,要求模型输出保持一致——但具体方法不是这篇的重点。

我觉得 semi-supervised 最值得记住的一点是它要解决的问题:不是"没有监督",而是"真实监督太贵"。它试图用少量真实标注撬动大量未标注数据的价值。

Self-supervised Learning:从数据自身构造 target
#

到了让我困惑最久的部分。

Self-supervised learning 没有人工 label,但训练过程看起来和 supervised 一模一样——有 input,有 target,有 loss,有 gradient。

后来想通了:target 是从数据自身构造出来的。

最直接的例子是 next-token prediction。拿一段原始文本:

1I love machine learning

没有任何人工标注。但可以自动构造训练任务:

1input:  I love machine
2target: learning

input 是前面的 token,target 就是紧跟着的下一个 token。不需要有人逐条标注"这里正确答案是 learning"。之前写 NTP 的那篇从条件概率到 chain rule 把这条链路展开过,这里不重复了。

另一个例子是 masked modeling。一句话 “The capital of France is Paris”,把 Paris 遮住变成 “[MASK]",target 就是 Paris。没有人专门标注"这里应该填 Paris”,答案本来就在数据里。

图像领域也有类似做法:把图片遮住一块,让模型预测被遮住的部分。Target 来自原图本身。

self-supervised construction

说到底就是一件事:self-supervised 就是让数据自己给自己出题——从 raw data 出发,通过某种规则自动构造出 (input, target) 对,然后用和 supervised 完全相同的方式训练。

需要说明一点:next-token prediction 和 masked modeling 不是 self-supervised 的全部。对比学习(contrastive learning)也属于自监督范畴,它不直接预测具体的 target 值,而是通过拉近相似样本、推远不相似样本来学习表示。但核心逻辑一样:训练信号来自数据自身的结构,不依赖人工标注。

那 self-supervised 到底算 supervised 还是 unsupervised
#

这个问题我卡了一段时间。

从数据来源看,self-supervised 没有人工 label。按这个标准应该归到 unsupervised 那一边。很多教材和综述确实把它放在广义 unsupervised learning 的范畴下。

从训练机制看,它又有明确的 target、有 loss、有 backprop,整个训练循环和 supervised 没有区别。

不同的资料分法不完全一致,因为它们在用不同的维度做切分——有的按"是否有人工标注",有的按"训练时是否有明确 target"。

后来我觉得纠结归属意义不大。更实用的做法是直接问:这个训练过程的监督信号是谁产生的?人标注的就是 supervised,程序从数据里自动生成的就是 self-supervised,根本没有 per-sample target 而是优化数据整体的结构性目标就是 unsupervised。

Semi-supervised 和 Self-supervised 到底差在哪
#

这两个名字只差一个词,但解决的是不同的问题。

semi-supervised vs self-supervised

Semi-supervised 的出发点是:我有少量真实标注,但大部分数据没有标注,怎么把没标注的数据也利用起来?

Self-supervised 的出发点是:我根本没有人工标注(或者先不用人工标注),能不能让数据自身产生训练信号?

Semi 是标注配比问题,Self 是信号构造问题。 两者可以组合使用,但概念上是正交的。

Self-supervised 到底解决了什么问题
#

传统 supervised learning 有一个瓶颈:互联网上的 raw data 几乎无限,但人工标注的成本限制了可训练数据的上限。

Self-supervised 绕过了这个瓶颈。Raw data 本身就是训练信号的来源——不需要标注,每个 token 位置、每个被遮住的图像块都能产生训练目标。这是大规模预训练能够利用海量数据的前提之一。

但这里还有一层东西值得想。

预测被 mask 的词、预测下一个 token——这些任务本身没有直接的业务价值。没有哪个线上系统的核心功能是"给一句话补全被遮住的词"。

那为什么要训练这个?因为模型要完成这些任务,就被迫去学习数据中有用的结构。要预测 “The capital of France is [MASK]” 里被遮住的词,模型得理解语言结构、上下文关系、实体知识。这些东西沉淀在参数里,形成通用的 representation。

所以 self-supervised pretraining 真正产出的不是"填空能力",而是 representation。拿到它之后,再用少量标注数据做 fine-tuning,迁移到具体的下游任务。

1大量 raw data → self-supervised pretraining → representation
2                                                    ↓
3                            少量 labeled data → fine-tuning → 下游任务

学习范式不是模型架构
#

还有一个容易混淆的地方值得单独说。

Transformer 既不是 supervised 的,也不是 self-supervised 的。它是一种 architecture。

同一个 Transformer,做文本分类加人工 label 就是 supervised,做 next-token prediction 就是 self-supervised。MLP、CNN 同理。

Supervised、self-supervised、semi-supervised 描述的是"怎么训练",不是"模型长什么样"。 一个模型结构可以搭配不同的训练范式,取决于数据的组织方式和 target 的来源。

写在最后
#

回到最初的问题:“有没有 label?”

这是一个不错的入门问法。但更有解释力的问法是:模型训练时,究竟从哪里得到"应该往哪个方向优化"的信号?

学习方式数据形态Training signal 来源典型例子
Supervised\( (x, y) \)外部提供的 target分类、回归
Unsupervised\( x \)数据结构本身(无 per-sample target)聚类、降维
Semi-supervised少量 \( (x, y) \) + 大量 \( x \)少量真实监督 + unlabeled datapseudo-label
Self-supervised\( x \)从 \( x \) 自动构造 targetmasked modeling、NTP

这张表不是为了建立一个绝对严格的分类体系。这些术语来自不同的历史语境,有的在描述信号来源,有的在描述数据组合方式。硬要把它们塞进一棵完全对称、严格互斥的分类树,反而会制造新的困惑。

training signal taxonomy

以后再遇到不确定归属的训练方法时,我会先问自己一句:这里的训练信号,到底来自哪里?

这个问题通常比死记术语更好用。

参考资料
#

相关文章