本文主要介绍一种用于降维和可视化的算法t-SNE,并且对其原理与使用进行讲解,本篇为第一部分
t-SNE与SNE
SNE
t-SNE的全称是t-Distributed Stochastic Neighbor Embedding,SNE就是 Stochastic Neighbor Embedding,所以要想了解t-SNE势必要先对SNE有所了解
SNE algorithm:
在高维空间中,我们如何考虑两个点之间的相似性呢,SNE选取的方法是使用一个条件概率来表示,首先选取一个中心点
x
i
x_i
xi,假设以
x
i
x_i
xi为中心存在一个高斯分布,样本集中任意一点
x
j
x_j
xj所在之处的相对概率密度的高低就是该点与
x
i
x_i
xi的相似性,即
p
j
∣
i
=
e
x
p
(
−
∣
∣
x
i
−
x
j
∣
∣
2
/
2
σ
i
2
)
Σ
k
≠
i
e
x
p
(
−
∣
∣
x
i
−
x
k
∣
∣
2
/
2
σ
i
2
)
p_{j|i} = \frac{exp(-||x_i-x_j||^2/2\sigma_i^2)}{\Sigma_{k\neq i}exp(-||x_i-x_k||^2/2\sigma_i^2)}
pj∣i=Σk=iexp(−∣∣xi−xk∣∣2/2σi2)exp(−∣∣xi−xj∣∣2/2σi2),规定
p
i
∣
i
=
0
p_{i|i}=0
pi∣i=0.
当降维之后, x i x_i xi与 x j x_j xj在低维空间内对应的点是 y i y_i yi与 y j y_j yj,在低维空间内两个点之间的相似性用 q j ∣ i q_{j|i} qj∣i来表示,具体表示为 q j ∣ i = e x p ( − ∣ ∣ y i − y j ∣ ∣ 2 ) Σ k ≠ i e x p ( − ∣ ∣ y i − y k ∣ ∣ 2 ) q_{j|i} = \frac{exp(-||y_i-y_j||^2)}{\Sigma_{k\neq i}exp(-||y_i-y_k||^2)} qj∣i=Σk=iexp(−∣∣yi−yk∣∣2)exp(−∣∣yi−yj∣∣2),相当于设定了 σ \sigma σ为 1 / 2 1/\sqrt2 1/2,和上面一样,规定 q i ∣ i = 0 q_{i|i}=0 qi∣i=0
SNE认为如果我是一个比较好的降维方法,那我就应该做到能够在降维之后比较好的保留两个点之间的相似性,也就是应该让
p
j
∣
i
p_{j|i}
pj∣i和
q
j
∣
i
q_{j|i}
qj∣i尽可能相近。那么对于整个样本集而言,SNE就是希望能够找个一个好的数据的低维表示,使任意两点之间的相似性保持降维前后尽可能相近,所以SNE设置了如下的
c
o
s
t
f
u
n
c
t
i
o
n
cost \ function
cost function,然后用梯度下降去优化
C
=
Σ
i
K
L
(
P
i
∣
∣
Q
i
)
=
Σ
i
Σ
j
p
j
∣
i
l
o
g
p
j
∣
i
q
j
∣
i
C = \Sigma_{i}KL(P_i||Q_i) = \Sigma_i\Sigma_jp_{j|i}log\frac{p_{j|i}}{q_{j|i}}
C=ΣiKL(Pi∣∣Qi)=ΣiΣjpj∣ilogqj∣ipj∣i
K L KL KL表示KL散度,上面式子的意义是,对于每一个 i i i,都有一个降维前的相似性分布后降维后的相似性分布,所以我要做的是对每个 i i i的前后分布的KL散度求和,然后最小化这个式子。
那么接下来的问题就是 p j ∣ i p_{j|i} pj∣i里面的 σ i \sigma_i σi怎么搞呢?对于不同的 x i x_i xi最适合的 σ i \sigma_i σi显然不同,以一维高斯分布为例,大部分周围的点都集中在 x i x_i xi附近的话, σ i \sigma_i σi应该比较小,如果分布较分散则相反。SNE就把决定权交给了我们,由使用者指定一个数值 P e r p Perp Perp(一般取5-50),SNE通过调整 σ i \sigma_i σi的值,使得 2 − Σ j p j ∣ i l o g 2 p j ∣ i = P e r p 2^{-\Sigma_{j}p_{j|i}log_2p_{j|i}} = Perp 2−Σjpj∣ilog2pj∣i=Perp,指数上的式子大家熟悉决策树的应该会感觉熟悉,可以用来描述混乱度或者纯度。
确定了损失函数的表示之后,接着使用梯度下降优化,
∂
C
∂
y
i
=
2
Σ
j
(
p
j
∣
i
−
q
j
∣
i
−
p
i
∣
j
−
q
i
∣
j
)
(
y
i
−
y
j
)
\frac{\partial C}{\partial y_i} = 2\Sigma_{j}(p_{j|i}-q_{j|i}-p_{i|j}-q_{i|j})(y_i-y_j)
∂yi∂C=2Σj(pj∣i−qj∣i−pi∣j−qi∣j)(yi−yj)
t-SNE
由于SNE的 c o s t f u n c t i o n cost \ function cost function不好优化,并且降维后的点有可能会聚集,为改善这些缺点,t-SNE出现了。那么t-SNE具体做了哪些改进呢?
对称SNE
首先,因为SNE的
K
L
KL
KL散度使用的
p
p
p不对称,即
p
i
∣
j
≠
p
j
∣
i
p_{i|j} \neq p_{j|i}
pi∣j=pj∣i,对称SNE提出了一种对称的形式,
C
=
Σ
i
K
L
(
P
i
∣
∣
Q
i
)
=
Σ
i
Σ
j
p
i
j
l
o
g
p
i
j
q
i
j
C = \Sigma_{i}KL(P_i||Q_i) = \Sigma_i\Sigma_jp_{ij}log\frac{p_{ij}}{q_{ij}}
C=ΣiKL(Pi∣∣Qi)=ΣiΣjpijlogqijpij
p i j = e x p ( − ∣ ∣ x i − x j ∣ ∣ 2 / 2 σ 2 ) Σ k ≠ l e x p ( − ∣ ∣ x l − x k ∣ ∣ 2 / 2 σ 2 ) p_{ij} = \frac{exp(-||x_i-x_j||^2/2\sigma^2)}{\Sigma_{k\neq l}exp(-||x_l-x_k||^2/2\sigma^2)} pij=Σk=lexp(−∣∣xl−xk∣∣2/2σ2)exp(−∣∣xi−xj∣∣2/2σ2) , q i j = e x p ( − ∣ ∣ y i − y j ∣ ∣ 2 ) Σ k ≠ l e x p ( − ∣ ∣ y l − y k ∣ ∣ 2 ) q_{ij} = \frac{exp(-||y_i-y_j||^2)}{\Sigma_{k\neq l}exp(-||y_l-y_k||^2)} qij=Σk=lexp(−∣∣yl−yk∣∣2)exp(−∣∣yi−yj∣∣2) ,同时规定 p i i p_{ii} pii和 q i i q_{ii} qii为0,在原文中提到,如果 x i x_i xi是离群值,导致所有的 ∣ ∣ x i − x j ∣ ∣ 2 ||x_i-x_j||^2 ∣∣xi−xj∣∣2都很大,那么所有的 p i j p_{ij} pij就都很小,那么可能会导致 y i y_i yi对 c o s t f u n c t i o n cost \ function cost function影响很小,导致 x i x_i xi无法被很好的降维,所以最终采取的方式是 p i j = p i ∣ j + p j ∣ i 2 n p_{ij}=\frac{p_{i|j}+p_{j|i}}{2n} pij=2npi∣j+pj∣i,这样可以保证 Σ j p i j = Σ j p i ∣ j + Σ j p j ∣ i 2 n = 1 + Σ j p j ∣ i 2 n > 1 2 n \Sigma_{j}p_{ij}=\frac{\Sigma_jp_{i|j}+\Sigma_jp_{j|i}}{2n}=\frac{1+\Sigma_jp_{j|i}}{2n}>\frac{1}{2n} Σjpij=2nΣjpi∣j+Σjpj∣i=2n1+Σjpj∣i>2n1,所以保证了 x i x_i xi对于损失函数的贡献是有一席之地的。
在低维空间使用
t
t
t分布(具体是标准柯西分布)代替高斯分布
此时,
q
i
j
=
(
1
+
∣
∣
y
i
−
y
j
∣
∣
2
)
−
1
Σ
k
≠
l
(
1
+
∣
∣
y
l
−
y
k
∣
∣
2
)
−
1
q_{ij} = \frac{(1 + ||y_i-y_j||^2)^{-1}}{\Sigma_{k\neq l}(1+||y_l-y_k||^2)^{-1}}
qij=Σk=l(1+∣∣yl−yk∣∣2)−1(1+∣∣yi−yj∣∣2)−1
在这两点的改动下,此时
∂
C
∂
y
i
=
4
Σ
j
(
p
i
j
−
q
i
j
)
(
y
i
−
y
j
)
(
1
+
∣
∣
y
i
−
y
j
∣
∣
2
)
−
1
\frac{\partial C}{\partial y_i} = 4\Sigma_{j}(p_{ij}-q_{ij})(y_i-y_j)(1+||y_i-y_j||^2)^{-1}
∂yi∂C=4Σj(pij−qij)(yi−yj)(1+∣∣yi−yj∣∣2)−1
(具体推导过程可以看原文的附录)
t-SNE伪代码
下篇文章将会具体介绍t-SNE算法的代码实现细节
参考资料:Visualizing Data using t-SNE