无监督学习自我解读
无监督学习(Unsupervised Learning)是一种 不依赖于人工标注数据 的机器学习方法。与监督学习不同,它主要用于 从数据中发现结构、模式或隐藏信息,适用于 聚类、降维、异常检测 等任务。对于我来说,无监督学习 就像是把我丢进一个没有标注信息的迷宫,任务就是从中找到一些潜在的结构或者模式。没有明确的答案指引,只能依靠数据本身的特点。比如说,假设我有一堆图片,但这些图片没有任何标签(像是“狗”、“猫”这样的类别)。在这种情况下,无监督学习的目标 是通过某种方法去挖掘数据的潜在关系。
无监督学习的两种常见任务:
聚类(Clustering):我可能会把类似的图片分到同一组,比如把所有的“猫”图片归为一类,“狗”归为另一类,尽管我没有提前知道每张图片属于哪个类别。
K-Means 就是一个常见的聚类算法,它通过计算样本之间的距离,把相似的样本聚集到一起。
降维(Dimensionality Reduction):如果数据非常复杂、维度很高,像是图片有成千上万的像素值,我可以通过 PCA(主成分分析) 来把数据维度缩小,去掉不重要的部分,从而使得后续的处理更高效。
1. 无监督学习 vs. 监督学习
对比项 | 监督学习 | 无监督学习 |
---|---|---|
训练数据 | 有标签(已分类) | 无标签(仅有特征) |
目标 | 预测类别或数值 | 发现数据结构、模式 |
常见算法 | 逻辑回归、决策树、CNN、RNN | K-Means、PCA、Autoencoder、GAN |
适用场景 | 目标分类、回归 | 数据聚类、特征学习、异常检测 |
2. 无监督学习的主要任务
(1)聚类(Clustering)
定义:将 相似数据点 分为同一类别,而不需要事先知道类别。
典型算法:
- K-Means:将数据划分为
K
个聚类中心,迭代优化。 - DBSCAN:基于密度的聚类,可发现任意形状簇。
- 层次聚类(Hierarchical Clustering):构建树状层级结构。
应用:
- 客户分群(电商、银行)
- 图像分割
- 基因分析
K-Means 工作流程
- 随机选择
K
个初始簇心(中心点)。 - 计算每个数据点到各个簇心的距离,将其分配到最近的簇。
- 更新簇心(计算新簇的均值)。
- 迭代更新,直到收敛(簇心不变)。
公式:
C
i
=
1
∣
S
i
∣
∑
x
∈
S
i
x
C_i = \frac{1}{|S_i|} \sum_{x \in S_i} x
Ci=∣Si∣1x∈Si∑x
其中:
- ( C_i ) 是第 ( i ) 个簇心
- ( S_i ) 是属于第 ( i ) 个簇的数据点集合
🔷 示意图
初始点(随机) → 计算距离 & 归类 → 更新簇心 → 迭代优化
----------------------------------------------------
● ● ● ○ ○ ● ● ○ ○ ● ○ ○
▲ ▲ ▲ → ▲ ▲ ▲ ▲ → ▲ ▲ ▲
簇心1 簇心2 簇心1 簇心2 簇心1 簇心2
(2)降维(Dimensionality Reduction)
定义:将高维数据映射到低维,提高可视化、计算效率。
典型算法
- PCA(主成分分析):找到数据的最重要特征方向,降低维度。
- t-SNE:保留局部数据结构,常用于可视化。
- Autoencoder(自编码器):深度学习的降维方法。
应用:
- 数据可视化
- 特征提取
- 去噪(Noise Reduction)
PCA 公式
- 计算 均值:
μ = 1 N ∑ i = 1 N x i \mu = \frac{1}{N} \sum_{i=1}^{N} x_i μ=N1i=1∑Nxi - 计算 协方差矩阵:
C = 1 N ∑ i = 1 N ( x i − μ ) ( x i − μ ) T C = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)(x_i - \mu)^T C=N1i=1∑N(xi−μ)(xi−μ)T - 计算 特征值和特征向量,选取前
d
个最大特征值对应的向量作为降维矩阵。
(3)异常检测(Anomaly Detection)
定义:识别 与数据模式不同的异常点。
典型算法
- Isolation Forest:基于决策树,异常点更容易被隔离。
- One-Class SVM:找出数据边界,超出边界的数据为异常点。
- Autoencoder:训练模型重构数据,误差大的样本为异常。
应用:
- 信用卡欺诈检测
- 服务器故障预测
- 网络安全入侵检测
Isolation Forest 机制
- 随机选择数据特征,划分数据点。
- 异常点更容易被隔离(少数、远离密集区域)。
- 异常分数:
S ( x ) = 2 − E ( h ( x ) ) c ( n ) S(x) = 2^{-\frac{E(h(x))}{c(n)}} S(x)=2−c(n)E(h(x))- ( E(h(x)) ):平均路径长度
- ( c(n) ):标准化项
(4)生成模型(Generative Models)
定义:学习数据分布,并生成相似的新数据。
典型算法
- GAN(生成对抗网络):两个网络(生成器 vs 判别器)互相博弈。
- VAE(变分自编码器):基于概率分布生成新数据。
应用
- 人脸生成(如 DeepFake)
- 图像风格迁移
- 数据增强
GAN 公式
- 判别器损失:
L D = − E [ log D ( x ) ] − E [ log ( 1 − D ( G ( z ) ) ) ] L_D = - \mathbb{E}[\log D(x)] - \mathbb{E}[\log (1 - D(G(z)))] LD=−E[logD(x)]−E[log(1−D(G(z)))] - 生成器损失:
L G = − E [ log D ( G ( z ) ) ] L_G = - \mathbb{E}[\log D(G(z))] LG=−E[logD(G(z))]
3. 代码示例
1. K-Means 聚类
from sklearn.cluster import KMeans
import numpy as np
# 生成数据
X = np.random.rand(100, 2) # 100个二维点
# K-Means 聚类
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
# 预测类别
labels = kmeans.predict(X)
print("聚类中心:", kmeans.cluster_centers_)
2. PCA 降维
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 生成高维数据
X = np.random.rand(100, 5)
# PCA降维至2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
plt.scatter(X_pca[:, 0], X_pca[:, 1])
plt.title("PCA 降维")
plt.show()
3. GAN 生成图片(PyTorch)
import torch
import torch.nn as nn
# 生成器
class Generator(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(100, 784)
def forward(self, x):
return torch.sigmoid(self.fc(x))
# 生成随机噪声
z = torch.randn((1, 100))
# 生成图片
gen = Generator()
img = gen(z).view(28, 28).detach().numpy()
4. 总结
无监督学习任务 | 代表算法 | 应用场景 |
---|---|---|
聚类 | K-Means、DBSCAN | 客户分群、图像分割 |
降维 | PCA、t-SNE | 数据可视化、特征提取 |
异常检测 | Isolation Forest、One-Class SVM | 欺诈检测、故障预测 |
生成模型 | GAN、VAE | 图像生成、数据增强 |
无监督学习 适用于 数据探索、降维、聚类、生成任务,为 无标注数据的深度学习 提供了重要工具
自监督学习自我解读
自监督学习(Self-Supervised Learning, SSL)是一种 无监督学习的变种,其核心思想是 通过数据本身生成标签 来训练模型。它通过构建任务,使得模型在不需要人工标注的情况下,学习到数据的特征和结构。自监督学习尤其在计算机视觉和自然语言处理(NLP)领域表现突出。
在我了解了无监督学习之后,自监督学习 让我更加兴奋。这种方法结合了 无监督学习 的优势,但它更像是在没有标签数据的情况下,通过给模型设计一种 代理任务(pretext task),让模型 自己创造标签,并通过这个任务来学习数据的特征。在自监督学习中,模型并不依赖于外部的人工标签,而是通过 自己构建任务 来进行训练。举个例子,如果你给我一个图片,并要求我去预测图像的一部分(比如遮住一个区域,要求我预测被遮挡的部分),我就可以通过这样的任务来学习图像的结构和特征。这种方法不需要人工标注,却能帮助我获得数据的有效表示。
1. 自监督学习 vs 无监督学习 vs 监督学习
对比项 | 监督学习 | 无监督学习 | 自监督学习 |
---|---|---|---|
标签需求 | 需要人工标签 | 无标签 | 数据本身生成标签 |
目标 | 分类、回归 | 聚类、降维 | 生成数据的上下文信息、特征表示 |
算法 | 逻辑回归、CNN、SVM | K-means、PCA | SimCLR、BYOL、BERT |
应用领域 | 图像分类、回归预测 | 数据压缩、特征学习 | 图像预训练、语言模型 |
自监督学习的常见方法:
对比学习(Contrastive Learning):我可以通过生成不同的 正样本(positive pairs) 和 负样本(negative pairs),来训练模型。正样本是指同一物体的不同视角或增强版本,负样本则是不同物体。通过训练,模型学会让正样本的特征更接近,负样本的特征更远离。比如,假设我有两张图片,分别是“猫”和“狗”,通过对比学习,模型可以学习到“猫”和“狗”是不同的,而相同物体的不同图像应该有相似的特征。
自编码器(Autoencoder):在这种方法下,我的目标是 压缩 输入数据到一个低维表示(编码),然后 重建 输入数据(解码)。这样,模型就能学到数据的 潜在特征,并且不需要标签。
2. 自监督学习的原理
自监督学习的目标是通过构造 代理任务(pretext task)来 预训练模型,使其学习到数据的有效表示。代理任务的结果是让模型在没有标签的情况下,通过数据本身获取有意义的信息。
(1)通过数据本身创建标签
- 数据增强:将原始数据进行扰动(如旋转、裁剪等),然后通过预测这些扰动的类型来训练模型。
- 自编码器(Autoencoders):通过压缩和重建输入数据,学习数据的低维表示。
- 上下文预测:预测数据中的某些部分,例如语言模型中预测下一个单词,图像中预测被遮挡的区域。
(2)代理任务(Pretext Task)
- 对比学习(Contrastive Learning):构造不同的样本对,目标是通过模型让相似样本的表示更接近,异类样本的表示更远。
- 生成任务(Generative Task):如训练一个网络来生成图像的一部分,或预测图像的缺失部分。
3. 自监督学习的关键技术
(1)对比学习(Contrastive Learning)
对比学习是一种通过训练模型将相似样本的表示拉近、不同样本的表示推远的方法。其核心思想是:
- 通过某种方式产生一对 正样本(positive pair) 和 负样本(negative pair)。
- 通过训练让相似的样本(例如数据增强后的相同图像)在特征空间中更接近,而不相似的样本在特征空间中尽可能远离。
SimCLR(Simple Contrastive Learning)是最流行的对比学习方法之一,工作流程如下:
- 从原始图像生成多个 增强视图(如旋转、裁剪等)。
- 使用神经网络提取每个视图的 特征表示。
- 计算 对比损失,通过最小化 同类视图之间的距离,最大化 异类视图之间的距离。
对比学习的损失函数(NT-Xent Loss):
(2)自编码器(Autoencoders)
自编码器是一种 神经网络,旨在 压缩输入数据到低维表示,然后重建数据。自编码器的目的是 学习数据的潜在表示,而不需要标签。
- 编码器(Encoder):将输入数据映射到一个潜在空间(低维表示)。
- 解码器(Decoder):将低维表示重建回原始数据。
自编码器工作流程:
- 将输入图像通过 编码器 压缩成一个 潜在空间(低维表示)。
- 通过 解码器 尝试重建输入图像。
- 训练目标是最小化 重建误差,即重建图像与原始图像之间的差异。
(3)生成任务(Generative Task)
自监督学习中的生成任务通常是训练一个模型预测数据的缺失部分。生成任务可以帮助模型学习到数据的内在结构。
BERT(Bidirectional Encoder Representations from Transformers):NLP 领域的一种自监督学习模型,目标是通过 遮蔽部分单词 来预测这些被遮蔽的单词,帮助模型学习词语之间的关系和上下文。
BERT 工作流程:
- 将输入文本进行 遮蔽(masking),比如随机选择一些单词用 [MASK] 替换。
- 训练模型预测这些被遮蔽的单词。
- 通过大量文本数据训练,模型可以捕捉到语法、语义等信息。
4. 自监督学习的应用
(1)计算机视觉
- 图像分类:使用无标签图像进行预训练,然后微调分类任务。
- 目标检测:通过自监督学习获得图像的特征表示,用于检测目标。
- 图像生成:如 GAN 和自编码器生成新图像。
(2)自然语言处理(NLP)
- 预训练语言模型:BERT、GPT 等模型通过自监督任务(如遮蔽单词预测)学习大量语言信息。
- 句子表示学习:模型通过上下文信息预测缺失的词或句子。
(3)强化学习
- 状态表示学习:通过自监督学习训练一个代理,从环境中提取有用的状态信息。
5. 自监督学习的优势
- 减少人工标注:无需手动标注大量数据,节省人工成本。
- 适用于无标签数据:能够利用无标签的数据进行有效学习。
- 强大的特征表示:自监督学习方法通常能学习到数据的深层次特征。
7. 代码示例:SimCLR 实现
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torchvision import datasets, models
# 模型:ResNet-18
model = models.resnet18(pretrained=False)
# 数据增强(对比学习)
transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 加载数据
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
# 定义对比学习损失
class ContrastiveLoss(nn.Module):
def forward(self, x1, x2, label):
# 计算相似度损失
pass
总结
自监督学习(SSL)是机器学习领域中一个非常有前景的方向,它通过数据本身生成标签,避免了大量人工标注。自监督学习通过代理任务(如对比学习、生成任务)训练模型,并广泛应用于 计算机视觉、自然语言处理等领域。随着技术的发展,自监督学习将进一步推动 无标签数据的使用,大大提升模型的性能和泛化能力。