Semi-Supervised Learning
半监督学习使用少量带标签样本和大量无标签样本进行训练,从而降低标注成本。涵盖伪标签、一致性训练和代码。
半监督学习将少量有标签样本与大量无标签样本结合起来训练模型,利用无标签数据达到仅靠标签无法实现的更高准确率。它介于监督学习和无监督学习之间:监督学习中的每个训练样本都有标签,而无监督学习中则一个标签都没有。这种方法适合计算机视觉,因为摄像头可以低成本地采集图像,而数据标注(例如绘制框或掩码、记录诊断结果)需要花费人工时间,而且往往需要专业知识。FixMatch在 CIFAR-10 图像基准上仅用每类 4 张有标签图像就达到了 88.61% 的准确率;Noisy Student则通过为 3 亿张无标签图像添加伪标签,将 ImageNet 的 top-1 准确率提高到 88.4%。
半监督学习的工作原理#
无标签数据之所以有用,是因为它展现了数据分布的形态。相关方法假设密集区域内彼此接近的样本具有相同标签,因此类别之间的决策边界应当经过样本稀少的区域。三类方法将这一假设付诸实践。
伪标签,也称为自训练,先用有标签数据训练模型,再让模型处理无标签数据,并将置信度高于置信度阈值的预测保留下来,作为额外的训练数据。在师生式方法中,训练好的模型成为教师,为数据池中的样本生成标签;学生模型通常与教师一样大或更大,使用真实标签和伪标签进行训练,然后成为下一轮的教师:
一致性正则化要求模型对同一张无标签图像的不同扰动给出相同预测,例如应用不同的数据增强。FixMatch 结合了这两种思路:它对弱增强视图生成伪标签,仅在模型置信度足够高时才这样做,并训练模型在同一图像的强增强视图上预测该标签。基于图的方法会将相似样本连接成图,并沿图的边传播已知标签。整个过程的主要风险是确认偏误:错误的伪标签会被用于训练,模型随后又会以更高置信度预测出相同错误。因此,这些方法会使用高阈值、强增强,或采用教师模型;教师模型的权重是学生权重的缓慢移动平均值。
这个 scikit-learn示例仅保留每个数字类别 2 张图像的标签,并将仅用这 20 张图像训练的监督分类器与标签传播进行比较。标签传播是一种基于图的方法,还会利用 1,237 张无标签训练图像:
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.semi_supervised import LabelSpreading
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X / 16, y, test_size=0.3, random_state=0, stratify=y)
# Keep the labels of only 2 training images per digit; -1 marks every other image as unlabeled
labeled = np.concatenate([np.flatnonzero(y_train == digit)[:2] for digit in range(10)])
y_partial = np.full_like(y_train, -1)
y_partial[labeled] = y_train[labeled]
# Supervised baseline trains on the 20 labeled images; label spreading also uses the unlabeled ones
supervised = LogisticRegression(max_iter=5000).fit(X_train[labeled], y_train[labeled])
semi_supervised = LabelSpreading(kernel="knn", n_neighbors=10).fit(X_train, y_partial)
print(f"Supervised, 20 labeled images: {supervised.score(X_test, y_test):.3f}")
print(f"Semi-supervised, 20 labeled + {(y_partial == -1).sum()} unlabeled: {semi_supervised.score(X_test, y_test):.3f}")在 540 张留出的数字图像上,监督分类器的得分为 0.800,标签传播的得分为 0.919,两者使用的标签数量相同,都是 20 个;这是因为无标签图像将每个有标签样本与许多相似的同类数字图像连接了起来。
计算机视觉中的半监督学习#
教师-学生伪标签方法可以扩展到标签绘制成本最高的任务,例如框、实例分割掩码和深度图。半监督目标检测方法(例如 Unbiased Teacher)会保留教师模型生成的高置信度伪框;Depth Anything则使用教师模型自动标注的约 6,200 万张无标签图像训练单目深度估计模型。Ultralytics YOLO26深度模型也通过相同方法进行预训练:Depth Anything 3 教师模型为1,281,167 张 ImageNet 训练图像生成伪深度图;这些图像没有深度真值,约占 219 万张图像混合数据的 58%,其余数据包括真实深度真值数据集。视觉语言模型也可以充当教师,只根据类别名称标注对象;VLM Leaderboard会比较它们标注真实世界检测数据集的准确度。对于检测,大型 YOLO26 模型可以充当教师,将高置信度预测写入 YOLO 格式的标签文件,这是一种简单的自动标注方式:
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# 大型预训练 YOLO26 模型充当教师
teacher = YOLO("yolo26x.pt")
# 为文件夹中的无标签图像生成标签;只有置信度高于 0.5 的检测结果会成为伪标签
# save_txt=True 会为每张图像写入一个 YOLO 格式的 .txt 标签文件,可直接用于训练学生模型
results = teacher.predict(source=ASSETS, conf=0.5, save_txt=True)半监督学习与相关术语的比较#
- 主动学习:选择信息量最大的无标签图像并交给人工标注员。半监督学习会自动为数据池中的样本生成标签,而许多标注流程会结合使用这两种方法。
- 自监督学习:只用无标签数据进行预训练,目标由数据本身生成,之后才使用标签进行微调。半监督学习则在同一次训练中使用有标签和无标签数据。
- 迁移学习:从在另一个数据集上预训练的模型开始。迁移学习可以与半监督学习结合,因为预训练模型能成为更好的初始教师。
- 知识蒸馏:训练学生模型匹配教师模型的输出,通常用于压缩模型。伪标签使用相同的师生架构来增加训练数据。Noisy Student 训练出的学生模型与教师一样大或更大,并在训练时添加噪声;它比此前最佳的 ImageNet 模型高出 2.0%,而此前的模型曾使用 35 亿张弱标注 Instagram 图像进行预训练。










