大模型教我成为大模型算法工程师之day5:降维与表示学习
本文聚焦高维数据面临的 “维度灾难” 问题,系统梳理了降维与表示学习的核心方法:从经典线性降维的 PCA(无监督、保全局方差)与 LDA(有监督、强分类区分度),到适配非线性数据的流形学习工具 t-SNE(优可视化)与 UMAP(快且保全局结构),再到基于神经网络的自编码器 / 变分自编码器(复杂数据压缩)和前沿的对比学习(无监督特征学习)。文末结合手写数字数据集实战,对比各类算法效果并给出选型建
Day 5: 降维与表示学习——在低维空间寻找真理
写在前面:在现实世界中,我们面临的数据往往是高维的(例如图像可能有上万像素,文本可能有数万词表)。"维度灾难"不仅让计算量爆炸,更让距离度量失效。降维(Dimensionality Reduction)和表示学习(Representation Learning)的核心目标,就是在压缩数据的同时,尽可能保留关键信息。从经典的 PCA 到现代的对比学习,这不仅是数学变换,更是对数据本质的哲学思考。
目录
- 降维的本质:压缩与去噪
- 线性降维:PCA 与 LDA
- 流形学习:t-SNE 与 UMAP
- 自编码器:神经网络的压缩魔法
- 对比学习:万物皆可对比
- 总结与实战代码
1. 降维的本质:压缩与去噪
为什么我们需要降维?
- 可视化:人类只能理解 2D 或 3D 图像。
- 去噪:高维数据通常包含大量噪声,信号往往集中在低维流形上。
- 计算效率:减少计算量和存储空间。
- 解决过拟合:减少特征数量,降低模型复杂度。
2. 线性降维:PCA 与 LDA
2.1 主成分分析 (PCA) —— 无监督
核心思想:找到一个投影方向,使得数据投影后的方差最大(信息量最大)。
- 数学原理:
- 数据中心化(减去均值)。
- 计算协方差矩阵。
- 对协方差矩阵做特征值分解。
- 取最大的 kkk 个特征值对应的特征向量作为新基底。
- 特点:
- 无监督(不需要标签)。
- 保留全局结构。
- 假设数据是线性的(对非线性流形效果差)。
2.2 线性判别分析 (LDA) —— 有监督
核心思想:投影后,类内方差最小,类间方差最大(让同类数据抱团,不同类数据分开)。
- 对比 PCA:
- PCA 看重"方差"(散得越开越好)。
- LDA 看重"区分度"(分类越准越好)。
- 限制:最多降维到 C−1C-1C−1 维(CCC 为类别数)。
3. 流形学习:t-SNE 与 UMAP
当数据位于非线性曲面上(如瑞士卷形状),PCA 会把数据压扁,导致结构破坏。流形学习旨在展开这些曲面。
3.1 t-SNE (t-Distributed Stochastic Neighbor Embedding)
核心思想:保持数据点之间的局部邻域分布不变。
- 原理:
- 高维空间用高斯分布计算点对相似度。
- 低维空间用 t 分布(长尾,解决拥挤问题)计算点对相似度。
- 最小化两个分布的 KL 散度。
- 优缺点:
- ✅ 可视化效果极佳(族群分明)。
- ❌ 速度慢,无法用于新数据推断,不保留全局距离(簇之间的距离没有意义)。
3.2 UMAP (Uniform Manifold Approximation and Projection)
核心思想:基于拓扑数据分析和黎曼几何。
- 优缺点:
- ✅ 速度比 t-SNE 快得多。
- ✅ 更好地保留了全局结构。
- ✅ 可以用于新数据的转换。
- 🔥 目前最流行的可视化与降维工具。
4. 自编码器:神经网络的压缩魔法
自编码器 (AutoEncoder, AE) 是一种无监督神经网络,目标是 Output≈InputOutput \approx InputOutput≈Input。
4.1 基本结构
- Encoder:压缩数据 z=f(x)z = f(x)z=f(x)。
- Bottleneck:低维编码 zzz(Latent Space)。
- Decoder:重构数据 x^=g(z)\hat{x} = g(z)x^=g(z)。
- Loss:∣∣x−x^∣∣2||x - \hat{x}||^2∣∣x−x^∣∣2 (Reconstruction Loss)。
4.2 变分自编码器 (VAE)
AE 的潜变量 zzz 通常是不连续的,无法用于生成新样本。VAE 强迫 zzz 服从正态分布。
- 核心:Encoder 预测均值 μ\muμ 和方差 σ\sigmaσ,然后采样 z=μ+σ⋅ϵz = \mu + \sigma \cdot \epsilonz=μ+σ⋅ϵ。
- Loss:重构误差 + KL 散度(让 zzz 接近 N(0,I)N(0, I)N(0,I))。
5. 对比学习:万物皆可对比
这是深度学习时代表示学习的前沿(Self-Supervised Learning)。无需人工标注,直接从数据本身学习特征。
5.1 核心思想
“拉近正样本,推开负样本”。
- 一张图 xxx 经过两次不同的增强(裁剪、变色)得到 x1,x2x_1, x_2x1,x2。
- 模型应认为 x1x_1x1 和 x2x_2x2 是相似的(Positive Pair)。
- x1x_1x1 和其他图片的增强结果应该是不同的(Negative Pair)。
5.2 经典算法
- SimCLR:使用简单的 End-to-End 架构,依赖大 Batch Size (如 4096) 或是 Momentum Encoder。
- MoCo (Momentum Contrast):引入队列 (Queue) 存储负样本,解决 Batch Size 限制问题,让普通 GPU 也能跑对比学习。
6. 总结与实战代码
Python 实战:PCA vs t-SNE vs UMAP
我们将使用手写数字数据集 (Digits) 来展示不同降维算法的效果。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap # pip install umap-learn
# 1. 加载数据
digits = load_digits()
data = digits.data
target = digits.target
print(f"原始数据维度: {data.shape}") # (1797, 64)
# 2. 定义绘图函数
def plot_embedding(embedding, title):
plt.figure(figsize=(8, 6))
scatter = plt.scatter(
embedding[:, 0],
embedding[:, 1],
c=target,
cmap='Spectral',
s=5,
alpha=0.8
)
plt.colorbar(scatter)
plt.title(title, fontsize=15)
plt.axis('off')
# 3. PCA 降维
pca = PCA(n_components=2)
data_pca = pca.fit_transform(data)
plot_embedding(data_pca, "PCA Projection")
# 4. t-SNE 降维
# perplexity: 困惑度,大致相当于邻居数量
tsne = TSNE(n_components=2, perplexity=30, random_state=42, init='pca', learning_rate='auto')
data_tsne = tsne.fit_transform(data)
plot_embedding(data_tsne, "t-SNE Projection")
# 5. UMAP 降维
# n_neighbors: 控制局部/全局结构的平衡
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=42)
data_umap = reducer.fit_transform(data)
plot_embedding(data_umap, "UMAP Projection")
plt.show()
核心总结
- PCA 是基准:简单、快、可解释,但处理不了非线性关系。
- 可视化首选 UMAP:比 t-SNE 快,且保留更多全局结构。
- 深度学习用 AE/VAE:处理图像、文本等复杂非结构化数据。
- 无标签用对比学习:在大模型预训练时代,对比学习(如 CLIP)是连接不同模态的桥梁。
更多推荐



所有评论(0)