Day 5: 降维与表示学习——在低维空间寻找真理

写在前面:在现实世界中,我们面临的数据往往是高维的(例如图像可能有上万像素,文本可能有数万词表)。"维度灾难"不仅让计算量爆炸,更让距离度量失效。降维(Dimensionality Reduction)表示学习(Representation Learning)的核心目标,就是在压缩数据的同时,尽可能保留关键信息。从经典的 PCA 到现代的对比学习,这不仅是数学变换,更是对数据本质的哲学思考。


目录

  1. 降维的本质:压缩与去噪
  2. 线性降维:PCA 与 LDA
  3. 流形学习:t-SNE 与 UMAP
  4. 自编码器:神经网络的压缩魔法
  5. 对比学习:万物皆可对比
  6. 总结与实战代码

1. 降维的本质:压缩与去噪

为什么我们需要降维?

  1. 可视化:人类只能理解 2D 或 3D 图像。
  2. 去噪:高维数据通常包含大量噪声,信号往往集中在低维流形上。
  3. 计算效率:减少计算量和存储空间。
  4. 解决过拟合:减少特征数量,降低模型复杂度。

2. 线性降维:PCA 与 LDA

2.1 主成分分析 (PCA) —— 无监督

核心思想:找到一个投影方向,使得数据投影后的方差最大(信息量最大)。

  • 数学原理
    1. 数据中心化(减去均值)。
    2. 计算协方差矩阵。
    3. 对协方差矩阵做特征值分解。
    4. 取最大的 kkk 个特征值对应的特征向量作为新基底。
  • 特点
    • 无监督(不需要标签)。
    • 保留全局结构。
    • 假设数据是线性的(对非线性流形效果差)。

2.2 线性判别分析 (LDA) —— 有监督

核心思想:投影后,类内方差最小,类间方差最大(让同类数据抱团,不同类数据分开)。

  • 对比 PCA
    • PCA 看重"方差"(散得越开越好)。
    • LDA 看重"区分度"(分类越准越好)。
  • 限制:最多降维到 C−1C-1C1 维(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 InputOutputInput

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∣∣xx^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_1x1x2x_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()

核心总结

  1. PCA 是基准:简单、快、可解释,但处理不了非线性关系。
  2. 可视化首选 UMAP:比 t-SNE 快,且保留更多全局结构。
  3. 深度学习用 AE/VAE:处理图像、文本等复杂非结构化数据。
  4. 无标签用对比学习:在大模型预训练时代,对比学习(如 CLIP)是连接不同模态的桥梁。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐