t-SNE数据降维可视化 – 潘登同学的Machine Learning笔记
文章目录
是最近遇到了bertopic中,使用的UMAP降维ie方法,说是能吊打t-SNE,但之前我做Word2Vec的时候也是用的t-SNE,所以学习一下,并且做一下两者的对比
t-SNE的基本思想
t-SNE是一种非常常用的数据降维(数据可视化),基本思想是
- 在高维空间构建一个概率分布拟合高维样本点间的相对位置
- 在低维空间,也构建一个概率分布拟合高维样本点之间的位置关系
- 通过学习,调整低维数据点,令两个分布接近
SNE(Stochastic Neighbor Embedding)
SNE直译过来是随机邻域嵌入;
为了衡量高维数据的相似性,用条件概率表示高维样本点间的位置关系:
p
j
∣
i
=
e
−
∣
∣
x
i
−
x
j
∣
∣
2
2
σ
i
2
∑
k
≠
i
e
−
∣
∣
x
i
−
x
k
∣
∣
2
2
σ
i
2
p_{j|i} = \frac{e^{-\frac{||x_i-x_j||^2}{2\sigma_i^2}}}{\sum_{k\neq i} e^{-\frac{||x_i-x_k||^2}{2\sigma_i^2}}}
pj∣i=∑k=ie−2σi2∣∣xi−xk∣∣2e−2σi2∣∣xi−xj∣∣2
当然地,当点
i
i
i与点
j
j
j的距离越近,
p
j
∣
i
p_{j|i}
pj∣i就越大;
我们要考虑映射后的低维空间的数据分布,同样可以用条件概率来表示:
q
j
∣
i
=
e
−
∣
∣
y
i
−
y
j
∣
∣
2
∑
k
≠
i
e
−
∣
∣
y
i
−
y
k
∣
∣
2
q_{j|i} = \frac{e^{-||y_i-y_j||^2}}{\sum_{k\neq i} e^{-||y_i-y_k||^2}}
qj∣i=∑k=ie−∣∣yi−yk∣∣2e−∣∣yi−yj∣∣2
为了让两个分布更相近,采用KL散度对其进行衡量
C
=
∑
i
K
L
(
P
i
∣
∣
Q
i
)
=
∑
i
∑
j
p
j
∣
i
log
p
j
∣
i
q
j
∣
i
C = \sum_i KL(P_i||Q_i) = \sum_i\sum_jp_{j|i}\log{\frac{p_{j|i}}{q_{j|i}}}
C=i∑KL(Pi∣∣Qi)=i∑j∑pj∣ilogqj∣ipj∣i
调整
y
y
y最小化C,实现降维
SNE的主要缺点
距离不对称
根据上面的公式会得到
p
j
∣
i
≠
p
i
∣
j
p_{j|i} \neq p_{i|j}
pj∣i=pi∣j,改进方法
p
i
j
=
e
−
∣
∣
x
i
−
x
j
∣
∣
2
2
σ
i
2
∑
k
≠
l
e
−
∣
∣
x
l
−
x
k
∣
∣
2
2
σ
i
2
q
i
j
=
e
−
∣
∣
y
i
−
y
j
∣
∣
2
∑
k
≠
l
e
−
∣
∣
y
l
−
y
k
∣
∣
2
p_{ij} = \frac{e^{-\frac{||x_i-x_j||^2}{2\sigma_i^2}}}{\sum_{k\neq l} e^{-\frac{||x_l-x_k||^2}{2\sigma_i^2}}} \\ q_{ij} = \frac{e^{-||y_i-y_j||^2}}{\sum_{k\neq l} e^{-||y_l-y_k||^2}}
pij=∑k=le−2σi2∣∣xl−xk∣∣2e−2σi2∣∣xi−xj∣∣2qij=∑k=le−∣∣yl−yk∣∣2e−∣∣yi−yj∣∣2
简单来说就是把分母变成所有点两两距离之和;
但是会有更好的方法保证对称:
p
i
j
=
p
i
∣
j
+
p
j
∣
i
(保证对称)
p
i
j
=
p
i
j
∑
i
∑
j
p
i
j
(保证归一化)
p_{ij} = p_{i|j} + p_{j|i} \text{(保证对称)}\\ p_{ij} = \frac{p_{ij}}{\sum_i\sum_jp_{ij}} \text{(保证归一化)}\\
pij=pi∣j+pj∣i(保证对称)pij=∑i∑jpijpij(保证归一化)
存在拥挤现象
从高维到低维进行转换的过程中,低维点的距离无法建模高维点之间的位置关系,有可能高维空间中距离较大的点,在低维空间距离会变得较小;
换言之,哪怕高维空间中离得较远的点,在低维空间中留不出这么多空间来映射。于是到最后高维空间中的点,尤其是远距离和中等距离的点,在低维空间中统统被塞在了一起,这就叫做“拥挤问题(Crowding Problem)
高维空间保持高斯分布不变,将低维空间的分布做调整,使得两边尾巴比高维空间的高斯分布更高,即可缓解拥挤问题;
q
i
j
=
(
1
+
∣
∣
y
i
−
y
j
∣
∣
2
)
−
1
∑
k
≠
l
(
1
+
∣
∣
y
k
−
y
l
∣
∣
2
)
−
1
q_{ij} = \frac{(1+||y_i-y_j||^2)^{-1}}{\sum_{k\neq l}(1+||y_k-y_l||^2)^{-1}}
qij=∑k=l(1+∣∣yk−yl∣∣2)−1(1+∣∣yi−yj∣∣2)−1
假设我们的低维数据分布对高维数据分布已经拟合完毕,则可以认为对于高维数据点 x i 、 x j x_i、x_j xi、xj和低维映射点 y i 、 y j y_i、y_j yi、yj,有 p i j = q i j p_{ij}=q_{ij} pij=qij。我们用图中两条红线表示两种情况:
- 上面的红线表示:当两个点相距相对近的时候,低维空间中比高维空间中相对更近。
- 下面的红线表示:当两个点相距相对远的时候,低维空间中比高维空间中相对更远。
如何确定 σ \sigma σ
设置一个固定的参数: Perplexity表示分布的熵,设法调节每个
σ
i
\sigma_i
σi,使得
log
(
P
e
r
)
=
−
∑
j
p
j
∣
i
log
(
p
j
∣
i
)
\log(Per) = -\sum_j p_{j|i}\log(p_{j|i})
log(Per)=−j∑pj∣ilog(pj∣i)
根据
p
j
∣
i
p_{j|i}
pj∣i的计算公式,距离
x
i
x_i
xi小于
2
σ
2\sigma
2σ的点对p的计算起主要作用,故
- 当 x i x_i xi临近点较多的时候: 减少 σ \sigma σ
- 当 x i x_i xi临近点较多=少的时候: 增大 σ \sigma σ
总结t-sne
- 计算
p
j
∣
i
p_{j|i}
pj∣i,利用结果,计算
p
i
j
p_{ij}
pij
p j ∣ i = e − ∣ ∣ x i − x j ∣ ∣ 2 2 σ i 2 ∑ k ≠ i e − ∣ ∣ x i − x k ∣ ∣ 2 2 σ i 2 p_{j|i} = \frac{e^{-\frac{||x_i-x_j||^2}{2\sigma_i^2}}}{\sum_{k\neq i} e^{-\frac{||x_i-x_k||^2}{2\sigma_i^2}}} pj∣i=∑k=ie−2σi2∣∣xi−xk∣∣2e−2σi2∣∣xi−xj∣∣2
p i j = p i ∣ j + p j ∣ i , p i j = p i j ∑ i ∑ j p i j p_{ij} = p_{i|j} + p_{j|i}, p_{ij} = \frac{p_{ij}}{\sum_i\sum_j p_{ij}} pij=pi∣j+pj∣i,pij=∑i∑jpijpij - 随机生成低维随机数并计算:
q i j = ( 1 + ∣ ∣ y i − y j ∣ ∣ 2 ) − 1 ∑ k ≠ l ( 1 + ∣ ∣ y k − y l ∣ ∣ 2 ) − 1 q_{ij} = \frac{(1+||y_i-y_j||^2)^{-1}}{\sum_{k\neq l}(1+||y_k-y_l||^2)^{-1}} qij=∑k=l(1+∣∣yk−yl∣∣2)−1(1+∣∣yi−yj∣∣2)−1 - 利用梯度下降法令C最小
C = K L ( P ∣ ∣ Q ) = ∑ i ∑ j p i j log p i j q i j C = KL(P||Q) = \sum_i\sum_jp_{ij}\log{p_{ij}{q_{ij}}} C=KL(P∣∣Q)=i∑j∑pijlogpijqij
代码实现
对mnist手写数据集做t-sne数据降维
初始化结果
第100次迭代
算法收敛
对比t-sne与UMAP
t-sne有以下缺点
- tSNE实际上只能嵌入到2维或3维中,即只能用于可视化的目的,所以很难将tSNE作为一般的降维技术;
- tSNE不能直接处理高维数据,通常使用Autoencoder或PCA进行降维处理,然后将降维的结果输入tsne做可视化。
t-sne与UMAP的对比
- UMAP是一种新颖且有趣的降维技术,与纯机器学习半经验算法tSNE截然不同,它基于可靠的数学原理。
- UMAP使用高维度上的指数概率分布,但不一定要像tSNE那样使用欧几里得距离,而是可以插入任何距离。
- UMAP在计算 p j ∣ i p_{j|i} pj∣i的时候只考虑K个近邻点的距离,而且无需归一化,极大减少计算量; 除此之外 , 在计算距离的时候减去了一个 ρ i \rho_i ρi,确保了流型的连通性;
- UMAP在低维的概率表示也是使用欧式距离,但是不再使用t分布,转而使用一个曲线拟合的方式(但是与t分布比较相似),再次提到,这里也不用归一化;
- UMAP的Loss函数采用的是交叉熵,无论高维数据距离很大还是很小,都很容易调整低维数据(因为Loss函数的梯度在极端处很大(UMAP处说到过))
- 与tSNE使用的随机法线初始化相反,UMAP使用Graph Laplacian分配初始低维坐标。(但是对结果影响不大,可能能减少计算量)