Courses
为数据打标既昂贵又缓慢,还高度依赖领域知识,而且大多数团队都没有足够的标注数据。
训练模型始终需要标注数据,但要正确标注往往既耗时又需要领域专家。例如,医学影像需要放射科医师,法律文书需要律师。即便是情感分析这类看似简单的任务,也需要有人逐条手工标注。结果就是,大多数机器学习团队只有一小撮标注数据,以及大量无法利用的无标签数据。
半监督学习通过同时利用二者来解决这个问题。它把您少量的标注数据与海量无标签数据结合起来,让模型去学习其中的模式。
在本文中,我将拆解半监督学习的工作原理,介绍最常见的技术,并说明何时值得采用它。
不过,监督式机器学习到底是什么?阅读我们的博文,了解关键的监督学习算法如何工作。
什么是半监督学习?
半监督学习是一种同时利用有标签与无标签数据进行训练的机器学习方法。
顾名思义,它介于监督学习与无监督学习之间。监督学习要求每个样本都有标签;无监督学习完全不使用标签。半监督学习则使用一小部分带标签的样本,配合规模更大的无标签样本。
标注数据告诉模型要找什么;无标签数据让模型理解数据的结构。两者结合,为模型提供了比单独任一类型更多的可学习信息。
半监督学习如何工作
流程从一个小型标注数据集开始——也许只有几百个明确了正确输出的样本。
随后引入一个更大的无标签数据集,可能是成千上万甚至数百万条未附带标签的样本。模型利用这些无标签数据来学习数据点之间的底层模式与关系。
然后由标注样本将这种结构引导至正确答案。模型已从无标签样本中掌握了数据的组织方式,标签再告诉它结构中的哪些区域对应哪些输出。
下面是一个简单示例。
假设您要把电子邮件分成垃圾邮件和非垃圾邮件。您有100封带标签邮件和1万封无标签邮件。模型先根据词汇模式和结构学习邮件的聚类方式,然后利用这100个标注样本判断哪些组是垃圾邮件、哪些不是。最终得到的模型会比仅用那100封标注邮件训练出来的效果更好。
半监督 vs 监督 vs 无监督学习
我们逐一看这三种学习方式,了解半监督学习相对于另外两者所处的位置。
监督学习
监督学习在完全标注的数据上训练。数据集中每个样本都包含输入和已知输出,模型学习二者之间的映射关系。
当有足够标注样本时,这很有效。但“足够”视任务而定,可能需要成千上万甚至数百万个样本。这既昂贵,有时也根本不可能实现。
无监督学习
无监督学习完全不使用标签。模型直接查看原始数据,自行发现结构。经典示例包括聚类与降维。
优点是无需任何标注数据;缺点是模型并不知道您真正关心的是什么。它确实会找到模式,但这些模式可能与您要解决的问题并不匹配。
半监督学习
半监督学习结合了两者的优点。您用一小部分标注数据来明确任务,再用大量无标签数据来学习数据结构。
标注数据为模型指明方向;无标签数据展示样本之间的关系。这种组合通常会在相同的小型标注集上优于监督学习,因为模型能借助无标签数据发现原本会错过的模式。
下面是三者的快速对比:

机器学习方法对比表
总结一下,当标注过于耗时而无标签数据很多时,就值得考虑半监督。接下来我将介绍一些常见技术。
常见的半监督学习技术
实现半监督学习有多种方式。每种技术对“标注-无标签”的划分处理方式不同,下面来看最常见的几类。
自训练(Self-training)
这是最简单的方法。先用标注数据训练一个模型,然后用它为无标签样本预测标签。将置信度最高的预测加入标注集作为伪标签(pseudo-labels),再在扩充后的数据集上重新训练模型。
重复此流程,直到模型不再提升或无标签数据用尽。实现容易,但若模型在早期做出了错误预测,该错误就会进入您的数据集。
协同训练(Co-training)
协同训练使用两个模型而非一个。每个模型在数据的不同“视角”上训练,可理解为不同的特征子集。
例如,做网页分类时,一个模型关注页面文本,另一个模型关注指向该页面的链接锚文本。两个模型互相为对方标注无标签样本,经过多轮彼此教学。
其理念是让一个模型的优势弥补另一个的短板。若两种视角各自都包含足够信息,协同训练可能优于自训练,因为一个模型的错误会被另一个纠正。
标签传播(Label propagation)
该方法构建一个图,将每个数据点作为节点,以边连接相似的点。随后标签会从带标签的节点“传播”到它们的邻居。
假设是相似的数据点应共享相同标签。若某个带标签样本靠近一簇无标签样本,那么这些无标签样本很可能属于同一类。标签会沿图传播,直到每个节点都有标签。
当数据具有清晰的聚类结构时,这种方法效果很好;但当类间边界模糊时,可能失效。
半监督神经网络
深度学习也有自己的一套半监督技术。以下是两种最常见的方法:
- 一致性正则化: 促使模型对同一输入在经过噪声或增强等小扰动后仍输出一致结果。核心思想是,好的模型不应因为输入被轻微改变就改变预测
- 神经网络中的伪标签: 类似自训练,但在批次级别进行。模型在训练过程中为无标签样本生成标签,并与真实标签一起用于损失函数
如 FixMatch 和 MixMatch 这类方法整合了这些思路,并在仅有极少标注样本的基准上取得了不错的结果。
为何半监督学习重要
关注半监督学习的首要原因是成本。
数据标注需要数据、领域专家、时间与资金。半监督学习通过用更少的标签获取更多价值,来降低成本。
其次是性能。用500个标注样本加上5万条无标签样本训练的模型,往往会优于仅用这500个标注样本训练的同款模型。无标签数据让模型对数据分布有更全面的认识,从而带来更好的预测。
再者是数据现实。无标签数据随处可见。每家公司手里都有日志、图像、文档和录音,但没人有时间去标注。半监督学习让您能从这些数据中产出有用的结果。
半监督学习的应用
半监督学习常见于难以获得标签的领域。
图像分类是最常见的用例之一。为成千上万张图像打标十分繁琐,而收集无标签图像则很容易。半监督方法可以仅用几百张带标签图像就训练出准确的分类器。
文本分类同理。您可能拥有数百万条客户评价或工单,但只有一小部分有人为标注。半监督学习可帮助构建能在完整数据集上泛化的分类器。
语音识别也是一个有趣方向。手工转写音频非常耗力,但原始音频极为丰富。无标签录音帮助模型学习声学模式,带转写的样本则教它正确的映射关系。
医疗数据分析是一个很典型的领域特定任务。请医生为影像或病历打标既昂贵又缓慢,他们还有更重要的工作要做。但医院拥有海量未标注的临床数据。半监督方法能在无需完全标注数据集的情况下构建诊断模型。
半监督学习的优势
以下这些特性让半监督学习适配许多项目:
- 需要更少标注数据: 相比完全监督的方法,您只需一小部分标签就能取得不错的结果
- 提升泛化能力: 无标签数据让模型接触更广泛的样本,有助于在未见数据上表现更好
- 性价比高: 当标注昂贵或耗时——通常确实如此——半监督学习通过最大化利用现有数据来节省时间与预算
因此,如果您的数据远多于标签,就该考虑半监督学习了。
半监督学习的局限
半监督学习存在一些需要了解的权衡。
- 无标签数据的质量很重要: 如果无标签数据与标注数据不来自同一分布,模型会学到错误的模式
- 错误的伪标签: 在自训练等方法中,高置信但错误的预测会被当作真值,模型据此训练会强化错误,使后续预测更糟
- 比监督学习更复杂: 需要调更多超参数、做更多设计选择、也更容易出错。监督模型更易构建与解释。半监督方法增加的复杂性并非总是值得——尤其当您的标注数据集已经足够大时
这些都不是致命问题,但在上手前需要心中有数。
半监督学习实战(Python 示例)
我们用一个简单的 Python 示例演示半监督学习,采用 scikit-learn 的 LabelSpreading 算法。
我将创建一个数据集,只标注其中一小部分,其余交给模型来推断。
数据准备
首先,生成一个数据集,并将大部分标签掩盖,以模拟半监督场景:
import numpy as np
from sklearn.datasets import make_moons
from sklearn.semi_supervised import LabelSpreading
from sklearn.metrics import accuracy_score
# Generate a dataset with 500 samples
X, y_true = make_moons(n_samples=500, noise=0.2, random_state=42)
# Keep only 10%, mask the rest as -1
rng = np.random.RandomState(42)
labeled_idx = rng.choice(500, size=50, replace=False)
y_train = np.full(500, -1) # -1 means unlabeled in scikit-learn
y_train[labeled_idx] = y_true[labeled_idx]
print(f"Labeled samples: {np.sum(y_train != -1)}")
print(f"Unlabeled samples: {np.sum(y_train == -1)}")

带标签与无标签样本数量
在 scikit-learn 中,-1 表示样本为无标签。500 个样本中只有 50 个带标签,模型需要推断剩余的 450 个。
训练与预测
现在我将训练一个 LabelSpreading 模型,并看看它对无标签数据的标注效果:
model = LabelSpreading(kernel="knn", n_neighbors=7)
model.fit(X, y_train)
y_pred = model.transduction_
# Check accuracy on the originally unlabeled samples
unlabeled_mask = y_train == -1
accuracy = accuracy_score(y_true[unlabeled_mask], y_pred[unlabeled_mask])
print(f"Accuracy on unlabeled samples: {accuracy:.2%}")

无标签样本的准确率
仅用 10% 的数据作为标注样本,模型就正确标注了大多数无标签样本。核心思想就在这里。
结果可视化
准确率很高——接近 96%——但我们也直观查看哪些样本被误分类:

真实与预测标签
预测标签与真实标签高度一致,尽管模型只看到了 500 个样本中的 50 个带标签样本。右图中以红色标出的就是被误分类的样本。
半监督学习中的常见错误
您已经看到半监督学习的强大之处,但它并非适用于所有场景。以下是最常见的错误及其规避方法。
- 假设无标签数据总是有益:并非如此。如果无标签数据与标注数据来自不同分布,模型会学到与实际任务无关的模式。务必检查标注与无标签数据是否来自同一来源并代表同一问题
- 糟糕的模型初始化:半监督方法是在初始监督模型之上构建的。若第一个模型较弱——因为样本太少或超参不佳——后续每一步都会继承这些问题。在加入无标签数据前,先训练出尽可能强的监督基线
- 过度依赖伪标签:伪标签的质量取决于生成它的模型。若盲目信任所有伪标签,错误会在训练轮次间不断累积。设定较高的置信阈值,只使用模型把握足够大的伪标签,其他丢弃
- 忽视数据分布:半监督方法假设无标签数据的结构对标签具有指示意义。若数据没有清晰的簇或平滑的决策边界,这一假设就不成立
要规避上述四类错误,请从强监督基线出发,循序渐进地加入无标签数据,并在每一步验证性能是否确实提升。
何时使用半监督学习
以下三种情形适合采用半监督学习:
- 当标注数据有限时:如果您的标注数据集很小,而获取更多标签既昂贵又缓慢,半监督学习能帮助挤出额外的准确率提升
- 当无标签数据充足时:需要大量无标签数据才能奏效。若无标签数据只有少量,模型学不到足够的结构信息以带来变化。标注与无标签数据规模差距越大,半监督方法的效果通常越好
- 当数据具有清晰结构时:当相似数据点共享相同标签时,半监督学习效果最佳。若数据形成聚类或类间边界平滑,无标签数据会让这些模式更加明显。若各类混杂且无清晰分隔,无标签数据的帮助就有限。
若以上三点同时满足,半监督学习值得一试。
结语
通俗地说,半监督学习让您无需为所有数据打标也能训练出更好的模型。您把一个小型标注数据集与一个大型无标签数据集合并,让模型同时从两者中学习。
其优势很明确:更少的标注时间、更快的上市节奏、更低的成本,以及优于仅用有限标签训练的性能。在医疗、法律和 NLP 等需要领域专家打标的领域,这尤为重要。
如果您拥有海量无标签数据,不妨尝试半监督学习。先建立一个良好的监督基线,选择契合数据结构的技术,并衡量无标签数据是否真的带来帮助。scikit-learn 的 LabelSpreading 是一个不错的起点,同时也可以尝试 FixMatch 和 MixMatch 等方法。
如果您希望在 2026 年具备就业竞争力,欢迎学习我们的机器学习工程师学习路径。内容涵盖从基础到 MLOps。
FAQs
什么是半监督学习?
半监督学习是一种机器学习方法,使用一小部分带标签数据和大量无标签数据来训练模型。带标签数据告诉模型要关注什么,无标签数据帮助模型理解数据的整体结构。这样往往能比仅用带标签数据训练获得更好的结果。
半监督学习与监督/无监督学习有何不同?
监督学习只使用带标签数据,每个样本都有已知输出。无监督学习只使用无标签数据,模型自行发现模式。半监督学习使用小规模标注数据来定义任务,并使用大规模无标签数据来学习数据结构。
我何时该使用半监督学习?
当您只有少量标注数据、大量无标签数据,且数据具有清晰结构(如自然聚类或平滑的类间边界)时,应考虑使用。若标注昂贵或需要领域专家(如医学影像或法律文本分析),半监督学习可以在不为所有数据打标的情况下构建准确模型。
什么是半监督学习中的自训练?
自训练是一种技术,先在标注数据上训练模型,再用其为无标签样本预测标签。将置信度最高的预测加入标注集作为伪标签,并在扩充后的数据集上重新训练。风险在于早期的错误预测会在后续轮次被强化,因此应设置较高的置信阈值。