人工智能之核心基础 机器学习
第十四章 半监督与自监督学习总结归纳
文章目录
- [人工智能之核心基础 机器学习](#人工智能之核心基础 机器学习)
- [14.1 半监督 vs 自监督:核心区别与联系](#14.1 半监督 vs 自监督:核心区别与联系)
- 对比
- [🔗 联系:可以协同使用!](#🔗 联系:可以协同使用!)
- [14.2 与其他学习范式的全景关系](#14.2 与其他学习范式的全景关系)
- [🧠 四大学习范式比喻(教育场景)](#🧠 四大学习范式比喻(教育场景))
- [14.3 学习要点与实践建议](#14.3 学习要点与实践建议)
- [✅ 入门优先掌握两大基础方法](#✅ 入门优先掌握两大基础方法)
- [1. **半监督:伪标签法(Pseudo-Labeling)**](#1. 半监督:伪标签法(Pseudo-Labeling))
- [2. **自监督:自编码器(Autoencoder)**](#2. 自监督:自编码器(Autoencoder))
- [🔑 实践关键:两大验证步骤](#🔑 实践关键:两大验证步骤)
- [14.4 进阶方向预告](#14.4 进阶方向预告)
- [🚀 三大融合方向](#🚀 三大融合方向)
- [14.5 综合代码实战:半监督 + 自监督协同流程](#14.5 综合代码实战:半监督 + 自监督协同流程)
- [场景:少量标注新闻 + 大量无标注新闻 → 高精度分类](#场景:少量标注新闻 + 大量无标注新闻 → 高精度分类)
- [🎯 本章总结](#🎯 本章总结)
- [💡 实践:](#💡 实践:)
- 资料关注
14.1 半监督 vs 自监督:核心区别与联系
对比
| 维度 | 半监督学习 | 自监督学习 |
|---|---|---|
| 是否需要标签 | ✅ 需要少量真实标签 | ❌ 完全不需要标签 |
| 学习目标 | 提升特定任务的预测性能 | 学习通用特征表示 |
| 训练方式 | 利用标签+无标签数据联合优化 | 通过前置任务生成伪监督信号 |
| 输出形式 | 直接用于分类/回归的模型 | 一个特征提取器(需微调) |
💡 共同点:
- 都面对大量无标签数据 + 标注成本高的现实问题
- 都依赖数据内在结构(聚类性、流形性)
🔗 联系:可以协同使用!
大量无标签数据
自监督预训练
通用特征提取器
少量标签数据
半监督微调
高性能下游模型
✅ 最佳实践 :
先用自监督 从海量数据中学通用特征,再用半监督在少量标签上精调 ------ 双剑合璧!
14.2 与其他学习范式的全景关系
🧠 四大学习范式比喻(教育场景)
| 范式 | 比喻 | 数据形式 | 典型算法 |
|---|---|---|---|
| 监督学习 | 有老师手把手教 | ( x , y ) (x, y) (x,y) 全标注 | 逻辑回归、ResNet |
| 无监督学习 | 自己逛博物馆看展品 | x x x 无标签 | K-Means、PCA |
| 半监督学习 | 老师讲几道例题,其余自己悟 | 少量 ( x , y ) (x,y) (x,y) + 大量 x x x | 伪标签、Label Spreading |
| 自监督学习 | 自己出题自己做(如拼图) | x x x 无标签(但可构造任务) | 自编码器、SimSiam、BERT |
🎯 演进逻辑 :
监督 → 半监督 → 自监督 是应对标注瓶颈的自然升级路径!
14.3 学习要点与实践建议
✅ 入门优先掌握两大基础方法
1. 半监督:伪标签法(Pseudo-Labeling)
- 为什么简单:只需一个分类器 + 置信度过滤
- 何时有效:数据有清晰聚类结构,初始模型不太差
2. 自监督:自编码器(Autoencoder)
- 为什么直观:输入=输出,损失=重建误差
- 能做什么:降维、去噪、特征提取
🔑 实践关键:两大验证步骤
步骤1:验证数据分布假设
python
# 用t-SNE可视化,看是否有聚类结构
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
X_embed = TSNE(n_components=2).fit_transform(X_scaled)
plt.scatter(X_embed[:, 0], X_embed[:, 1], alpha=0.6)
plt.title("t-SNE可视化:检查聚类假设")
plt.show()
✅ 如果点自然成簇 → 半监督/自监督可能有效
❌ 如果完全混杂 → 谨慎使用
步骤2:前置任务适配领域
| 数据类型 | 推荐前置任务 |
|---|---|
| 图像 | 掩码重建(MAE)、对比学习(SimSiam) |
| 文本 | 掩码语言建模(MLM)、下一句预测 |
| 时序数据 | 未来值预测、窗口打乱还原 |
| 表格数据 | 特征掩码重建、列打乱预测 |
14.4 进阶方向预告
🚀 三大融合方向
| 方向 | 核心思想 | 应用场景 |
|---|---|---|
| + 迁移学习 | 在源域自监督预训练 → 目标域半监督微调 | 医疗影像(公开数据预训练 + 医院小样本微调) |
| + 小样本学习 | 自监督提供强先验 → 仅需1~5个样本分类 | 工业缺陷检测(新缺陷类型极少样本) |
| + 主动学习 | 半监督筛选不确定样本 → 人工标注最有价值样本 | 智能标注系统闭环 |
💡 未来趋势 :
"自监督预训练 + 半监督/小样本微调" 已成为工业界标准范式!
14.5 综合代码实战:半监督 + 自监督协同流程
场景:少量标注新闻 + 大量无标注新闻 → 高精度分类
python
import numpy as np
import torch
import torch.nn as nn
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.semi_supervised import LabelSpreading
# ========================
# 步骤1: 数据准备
# ========================
categories = ['comp.graphics', 'sci.med', 'rec.sport.baseball', 'talk.politics.guns']
news = fetch_20newsgroups(subset='all', categories=categories, remove=('headers', 'footers'))
X_text, y_true = news.data, news.target
# 向量化(作为自监督的"特征")
vectorizer = TfidfVectorizer(max_features=2000, stop_words='english')
X = vectorizer.fit_transform(X_text).toarray()
# 模拟:仅2%有标签
np.random.seed(42)
n_total = len(y_true)
n_labeled = int(0.02 * n_total)
labeled_idx = np.random.choice(n_total, size=n_labeled, replace=False)
y_semi = np.full(n_total, -1)
y_semi[labeled_idx] = y_true[labeled_idx]
# ========================
# 步骤2: 自监督预训练(简化版:用自编码器学特征)
# ========================
class SimpleAutoencoder(nn.Module):
def __init__(self, input_dim, latent_dim=128):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, 256),
nn.ReLU(),
nn.Linear(256, latent_dim)
)
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 256),
nn.ReLU(),
nn.Linear(256, input_dim)
)
def forward(self, x):
z = self.encoder(x)
recon = self.decoder(z)
return recon, z
# 训练自编码器(仅用无标签数据)
device = 'cpu' # 小数据可用CPU
ae = SimpleAutoencoder(X.shape[1], latent_dim=128)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(ae.parameters(), lr=1e-3)
X_tensor = torch.FloatTensor(X)
for epoch in range(20):
optimizer.zero_grad()
recon, _ = ae(X_tensor)
loss = criterion(recon, X_tensor)
loss.backward()
optimizer.step()
if epoch % 5 == 0:
print(f"AE Epoch {epoch}, Loss: {loss.item():.4f}")
# 提取自监督特征
with torch.no_grad():
_, X_ae = ae(X_tensor)
X_ae = X_ae.numpy() # 自监督学到的128维特征
# ========================
# 步骤3: 半监督微调(用自监督特征 + 少量标签)
# ========================
# 方法A: 伪标签法
lr = LogisticRegression(max_iter=1000)
lr.fit(X_ae[labeled_idx], y_true[labeled_idx])
proba = lr.predict_proba(X_ae)
pseudo_labels = lr.predict(X_ae)
high_conf = np.max(proba, axis=1) > 0.9
# 构建增强训练集
train_idx = np.concatenate([labeled_idx, np.where(high_conf)[0]])
y_train = np.concatenate([y_true[labeled_idx], pseudo_labels[high_conf]])
lr_final = LogisticRegression(max_iter=1000)
lr_final.fit(X_ae[train_idx], y_train)
# 方法B: Label Spreading(直接用自监督特征)
ls = LabelSpreading(kernel='knn', n_neighbors=7, max_iter=100)
ls.fit(X_ae, y_semi)
# ========================
# 步骤4: 评估
# ========================
test_idx = np.setdiff1d(np.arange(n_total), labeled_idx)
y_test = y_true[test_idx]
acc_pseudo = accuracy_score(y_test, lr_final.predict(X_ae[test_idx]))
acc_ls = accuracy_score(y_test, ls.predict(X_ae[test_idx]))
# 对比基线:仅用2%标签的监督学习
lr_baseline = LogisticRegression(max_iter=1000)
lr_baseline.fit(X[labeled_idx], y_true[labeled_idx])
acc_baseline = accuracy_score(y_test, lr_baseline.predict(X[test_idx]))
print(f"\n=== 结果对比 ===")
print(f"纯监督 (2%标签): {acc_baseline:.2%}")
print(f"自监督+伪标签: {acc_pseudo:.2%}")
print(f"自监督+LabelSpreading: {acc_ls:.2%}")
📊 典型输出:
纯监督 (2%标签): 68.50%
自监督+伪标签: 82.30%
自监督+LabelSpreading: 84.10%
💡 关键 :
自监督特征(128维)比原始TF-IDF(2000维)更紧凑、更具语义,大幅提升半监督效果!
🎯 本章总结
| 问题 | 解决方案 | 推荐工具 |
|---|---|---|
| 只有少量标签 | 半监督学习 | Scikit-learn (LabelSpreading, 伪标签) |
| 完全没有标签 | 自监督学习 | PyTorch/TensorFlow(自编码器、SimSiam) |
| 想最大化利用数据 | 自监督预训练 + 半监督微调 | Hugging Face + Sklearn |
💡 实践:
"先看分布,再选任务;
自监督打底,半监督精修;
少量标签,也能大有作为!"
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》