概述
t分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding, t-SNE)是一种用于高维数据可视化的非线性降维技术,由van der Maaten和Hinton于2008年提出。1
t-SNE的核心思想是:在高维空间中相似的点在低维空间中也应该保持相似。与线性方法(如PCA)不同,t-SNE能够保留数据的局部结构,非常适合用于探索性数据分析和深度学习模型特征的可视化。
1. 从SNE到t-SNE
1.1 随机邻域嵌入(SNE)
SNE的基本思想是将高维数据点之间的相似性转换为概率分布,然后试图在低维空间中找到与该分布相似的分布。
高维空间的概率分布:
对于高维空间中的任意两个点 和 ,定义条件概率:
其中 是以点 为中心的高斯分布的标准差,困惑度(perplexity)与其相关:
其中 是熵。
低维空间的概率分布:
在低维空间(通常为2维或3维)中,对应的点 和 的相似性定义为:
优化目标:通过最小化高维和低维分布之间的KL散度来找到最优的低维表示:
1.2 对称SNE
原始SNE的梯度计算复杂,对称SNE通过使用联合概率简化了这一过程:
1.3 t-SNE的创新
t-SNE相比SNE做出了两个关键改进:
- 使用t分布代替高斯分布:低维空间使用自由度为1的t分布(柯西分布)
- 对称形式:使用联合概率的简化形式
2. t-SNE核心算法
2.1 低维空间的t分布
t-SNE使用Student t分布(自由度为1)定义低维空间的相似性:
为什么使用t分布?
- 重尾性质:t分布的尾部比高斯分布更重,这意味着相距较远的点在低维空间中可以相距更远
- 解决拥挤问题:在高维空间中,相似的点之间存在大量”中间距离”的点,这些点在低维空间中会相互挤压,t分布的重尾性质有效缓解了这一问题
2.2 梯度推导
KL散度关于 的梯度为:
这个梯度可以理解为排斥力和吸引力的组合:
- 当 时,梯度指向 (吸引)
- 当 时,梯度远离 (排斥)
2.3 算法流程
输入:高维数据 X = {x_1, ..., x_n},困惑度 Perp,迭代次数 T,学习率 η
输出:低维表示 Y = {y_1, ..., y_n}
1. 计算高维空间的成对距离和条件概率 p_{j|i}
2. 使用二分搜索找到满足困惑度要求的 σ_i
3. 令 p_{ij} = (p_{j|i} + p_{i|j}) / (2n)
4. 初始化 Y(使用小的随机值或PCA结果)
5. 对 t = 1, 2, ..., T:
a. 计算 q_{ij}(使用t分布)
b. 计算梯度 ∂C/∂y_i
c. 更新 y_i ← y_i - η ∂C/∂y_i
d. (可选)应用动量
6. 返回 Y
3. 关键参数分析
3.1 困惑度(Perplexity)
困惑度控制每个点的有效邻居数,公式为:
经验法则:
- 困惑度5-50适用于大多数数据集
- 较大的困惑度会考虑更多的全局结构
- 建议从30开始尝试
3.2 学习率
- 默认值通常为200-1000
- 学习率过低会导致陷入局部最优
- 学习率过高会导致低维空间中的点”飞散”
3.3 早期夸大(Early Exaggeration)
在训练初期,将 乘以一个大于1的因子(如4或12),使得高维空间中的相似点在早期就能聚集在一起,加速聚类结构的形成。
3.4 Barnes-Hut优化
当数据规模较大时(),可以使用Barnes-Hut算法将计算复杂度从 降低到 :
- 使用四叉树/八叉树近似计算梯度
- 仅考虑距离小于阈值 的邻居
- 权衡精度与速度
4. 与深度学习的结合
t-SNE在深度学习中有广泛的应用场景:
4.1 CNN特征可视化
t-SNE可以将预训练CNN(如ResNet、VGG)提取的特征投影到2D空间,用于:
- 分析不同类别的特征分布
- 发现潜在的聚类结构
- 检测异常样本
import numpy as np
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# 假设 features 是CNN提取的特征矩阵 (n_samples, n_features)
# labels 是对应的类别标签
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
features_2d = tsne.fit_transform(features)
plt.scatter(features_2d[:, 0], features_2d[:, 1], c=labels)
plt.colorbar()
plt.title('CNN Features Visualized with t-SNE')
plt.show()4.2 Transformer注意力可视化
在Transformer模型中,可以使用t-SNE分析:
- 注意力权重的分布模式
- 不同头(head)捕获的关系类型
- 层与层之间的表示变化
4.3 自编码器潜在空间分析
变分自编码器(VAE)或普通自编码器的潜在空间可以通过t-SNE可视化:
- 验证潜在空间的正则化效果
- 分析生成样本的多样性
- 检测潜在空间中的异常区域
5. 实践指南
5.1 参数选择建议
| 参数 | 推荐范围 | 说明 |
|---|---|---|
| perplexity | 5-50 | 通常30是一个好起点 |
| n_components | 2或3 | 可视化通常用2 |
| learning_rate | 200-1000 | 或”auto” |
| n_iter | 1000-5000 | 通常足够收敛 |
| early_exaggeration | 12 | 帮助聚类形成 |
5.2 常见问题与解决方案
问题1:拥挤问题
- 表现:不同类别在中心区域重叠
- 解决:尝试不同的perplexity,增加迭代次数
问题2:类内结构消失
- 表现:同一类别的点分散
- 解决:减小perplexity,增加迭代
问题3:随机种子敏感
- 解决:多次运行取稳定结果
问题4:大数据集运行慢
- 解决:先PCA降维到50维,或使用Barnes-Hut优化
5.3 sklearn实现
from sklearn.manifold import TSNE
# 基本用法
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X)
# 大数据集优化
tsne = TSNE(n_components=2, perplexity=30, method='barnes_hut', angle=0.5)
X_tsne = tsne.fit_transform(X)6. 理论局限
6.1 理论基础薄弱
t-SNE缺乏像PCA那样坚实的理论基础,其优化目标是启发式的。
6.2 无法保留全局结构
t-SNE主要保留局部结构,类与类之间的全局距离关系可能失真。
6.3 随机性
每次运行结果不同(除非固定随机种子)。
6.4 无法处理新数据
t-SNE不提供将新数据映射到低维空间的函数(无out-of-sample extension)。
6.5 对称性假设
对称SNE简化了原始SNE,但可能丢失某些结构信息。
7. 相关方法
参考资料
Footnotes
-
van der Maaten, L., & Hinton, G. (2008). Visualizing Data using t-SNE. Journal of Machine Learning Research, 9, 2579-2605. ↩