在介绍t-SNE之前,要从流形开始讲起。
流形Manifold
将流形引入到机器学习领域主要有两个用途:
- 改进原本欧式空间中的算法,使它能作用到流形上,直接或者间接地利用和流行的性质和构造。
- 将流形映射到欧式空间中,令欧式空间中的算法能对流形起作用。
eg. Isomap就是一个典型的将原本存在于欧式空间的算法进行改造,将流形映射到欧式空间的算法。
测地线 vs. 直线
欧式空间中用线段(直线)测量两点之间的距离;流形中也一样,不过这条“直线”就不是直的了,称为测地线。
另一方面是改造现有算法使其适合流形结构甚至专门针对流形的特点来设计新的算法,比较典型的是 graph regularized semi-supervised learning 。当然,所有的这些都是基于同一个假设,那就是数据是分布在一个流形上的(部分算法可能会有稍微宽松一些的假设),然而 real world 的数据,究竟哪些是分别在流形上的呢?这个却是很难说。不过,除了典型的 face 和 hand written digit 之外,大家也有把基于流形的算法直接用在诸如 text 看起来好像也流形没有什么关系的数据上,效果似乎也还不错。
在实际应用中,获取测地距离是比较困难的,一般通过构造kNN图,在图中寻找最短路径距离作为真实的测地距离。
kNN图
构建kNN图的常见方法一般有三类:第一类是空间分割树(space-partitioning trees)算法,第二类是局部敏感哈希(locality sensitive hashing)算法,第三类是邻居搜索(neighbor exploring techniques)算法。其中k-d(Random Projection Tree)树和随机投影树均属于第一类算法。
SNE
核心思想很简单,在高维空间中相似的数据点,在映射后的低维空间中也相似。常规做法是将欧式距离作为相似度度量。考虑高维空间中的两个数据点xi和xj,xi以条件概率pj∣i选择xj作为它的邻近点。
![请添加图片描述](https://img-blog.csdnimg.cn/0b673e6b38d24460a0cc8685a80855bc.png =2
77x))
假设高维数据点xi和xj在低维空间的映射点分别为yi和yj。类似的,低维空间中的条件概率用qj∣i表示
)
可推。若考虑xi与其他所有点之间的条件概率,则可构成一个条件概率分布Pi,同理在低维空间存在一个条件概率分布Qi且应该与Pi一致。那么,如何衡量两个分布之间的相似性…?
KL距离!(Kullback-Leibler Divergence)。SNE算法的目的就是最小化这个目标函数。优化算法可以使用梯度下降法。
)
似乎到这里问题就解决了,但是注意观察目标函数,当pj∣i较小而qj∣i较大时,函数的代价居然也较小。为什么说“居然”呢,刚才讲了pj∣i较小表示两个数据点在高维空间中距离较远,qj∣i较大表示两个数据点在映射的低维空间中距离较近,这个时候得到的代价居然偏小,这就有问题了。也就是说,SNE只关注到全局数据,而忽略了局部数据。
对称SNE
关键在于,它解决了SNE存在的不对称问题。
在原始的SNE中,pi∣j与pj∣i是不相等的,低维空间中qi∣j与qj∣i也是不相等的。所以如果能得出一个更加通用的联合概率分布更加合理,即分别在高维和低维空间构造联合概率分布P和Q,使得对任意i,j,均有pij=pji,qij=qji。
相应地,将pij和qij定义为:
)
)
?是这样吗。
由于KL散度的不对称性,这样定义的分布又会遇到跟SNE一样的问题。因此这里采用一个更简单直接的定义:
)
相应地,目标函数写成:
)
相比刚才定义的公式,这个梯度更加简化,计算效率更高。但是别高兴的太早,虽然我们解决了SNE中的不对称问题,得到了一个更为简单的梯度公式,但是Maaten指出,对称SNE的效果只是略微优于原始SNE的效果,依然没有从根本上解决问题。
拥挤问题 The Crowding Problem
由于我们生活在一个低维的世界中,我们对于数据可视化的接受程度最多不超过三维,超过这个维度的可视化我们便难以理解了。这也是为什么在讨论流行的时候,总喜欢以“Swiss roll”为例,这不过是将二维流形嵌入到三维空间而已。实际上,流形的实际应用远比它要复杂得多。举个例子,在10维流形上可以存在11个点且两两之间距离相等。在二维空间中呢?我们最多只能使三个点两两之间距离相等,想将高维空间中的距离关系完整保留到低维空间是不可能的。随着维度的不断增大,定会存在数据点拥挤问题。
t分布
t分布是典型的长尾分布。在稳定分布中,除了正态分布,其他均为长尾分布。长尾分布在处理小样本和异常点具有良好的效果。
使用自由度为1的t分布重新定义qij:
依然用KL距离衡量两个分布之间的相似性,此时梯度变为:
这就是最终的t-SNE算法,它相比最初的SNE做了两个改进:1)SNE改为对称的SNE;2)t分布代替高斯分布。
t-SNE v.s. 其他降维算法
优点
除了t-SNE以外的大多数非线性降维方法,都没办法同时保留局部和全局的结构。尤其是对局部的隐藏结构更加敏感。对于处理存在多个流形的高维数据很有效果。
缺点
- 时间复杂度和空间复杂度均为O(n^2),导致其无法高效处理大型数据集;
- 升级版Barnes-Hut t-SNE可以让复杂度降为O(nlogn),但只限于获得二维和三维的嵌入;
- 由于代价函数非凸,多次执行算法的结果是随机的,需要多次运行选取最好的结果;
- 全局结构不能很清楚的保留。这个问题可以通过先用PCA降维到一个合理的维度(如50)后再用t-SNE来缓解,前置的PCA步骤也可以起到去除噪声等功能。(sklearn中可以直接使用参数init=‘pca’)
回到Manifold
对于t-SNE在获取数据在流形空间中相似性的方法,有很多中改进方法。以及对于测度度量的方法,也能有很多改进。
当然,本文只是浅谈流形,对于其测地线、距离度量方法都有很多值得我们深究探讨的地方。
参考:
[1]: https://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis/
[2]: https://blog.pluskid.org/archives/533
[3]: https://www.jianshu.com/p/a24a1cabb553