可视化的降维是否应该被视为一个“封闭”问题,由 t-SNE 解决?
当然不。
我同意 t-SNE 是一种了不起的算法,效果非常好,这在当时是一个真正的突破。然而:
- 它确实有严重的缺点;
- 一些缺点必须是可以解决的;
- 已经有一些算法在某些情况下表现得更好;
- 许多 t-SNE 的特性仍然知之甚少。
有人链接到这个非常流行的关于 t-SNE 的一些缺点的帐户:https ://distill.pub/2016/misread-tsne/ (+1),但它只讨论了非常简单的玩具数据集,我发现它不对应非常好地解决了在实际数据中使用 t-SNE 和相关算法时所面临的问题。例如:
- t-SNE 经常无法保留数据集的全局结构;
- 当 t-SNE 出现“过度拥挤”时增长超过~100k;
- Barnes-Hut 运行时对于大型.
我将在下面简要讨论所有三个。
t-SNE 通常无法保留数据集的全局结构。
考虑一下来自艾伦研究所(小鼠皮层细胞)的单细胞 RNA-seq 数据集:http: //celltypes.brain-map.org/rnaseq/mouse。它有大约 23k 个细胞。我们先验地知道这个数据集有很多有意义的层次结构,这通过层次聚类得到证实。有神经元和非神经细胞(神经胶质细胞、星形胶质细胞等)。在神经元中,有兴奋性和抑制性神经元——两个非常不同的组。在例如抑制性神经元中,有几个主要组:表达Pvalb、表达SSt、表达VIP。在这些组中的任何一个中,似乎都有多个进一步的集群。这反映在层次聚类树中。但这里是 t-SNE,取自上面的链接:
非神经细胞呈灰色/棕色/黑色。兴奋性神经元呈蓝色/蓝绿色/绿色。抑制性神经元呈橙色/红色/紫色。人们会希望这些主要群体粘在一起,但这不会发生:一旦 t-SNE 将一个群体分成几个集群,它们最终可能会被任意定位。数据集的层次结构丢失。
我认为这应该是一个可以解决的问题,但我不知道有什么好的原则性发展,尽管最近在这个方向上做了一些工作(包括我自己的)。
当 t-SNE 出现“过度拥挤”时增长超过~100k
t-SNE 在 MNIST 数据上效果很好。但是考虑一下(取自这篇论文):
拥有 100 万个数据点,所有集群都聚集在一起(确切原因还不是很清楚),唯一已知的平衡方法是使用一些肮脏的 hack,如上所示。我从经验中知道,其他类似的大型数据集也会发生这种情况。
可以说,通过 MNIST 本身(N=70k)可以看到这一点。看一看:
右边是 t-SNE。左边是UMAP ,一种正在积极开发中的令人兴奋的新方法,它与旧的largeVis非常相似。UMAP/largeVis 将集群拉得更远。恕我直言,其确切原因尚不清楚;我想说这里还有很多东西要理解,可能还有很多需要改进的地方。
Barnes-Hut 运行时对于大型
香草 t-SNE 无法用于超过~10k。直到最近,标准解决方案是 Barnes-Hut t-SNE,但是对于接近 100 万,它变得非常缓慢。这是 UMAP 的一大卖点,但实际上最近的一篇论文提出了FFT 加速 t-SNE (FIt-SNE),它的工作速度比 Barnes-Hut t-SNE 快得多,并且至少与 UMAP 一样快。我建议大家从现在开始使用这个实现。
所以这可能不再是一个开放的问题,但它直到最近才出现,我想在运行时还有进一步改进的空间。因此,工作当然可以继续朝这个方向发展。
我仍然很想听听其他评论,但我现在会发布我自己的答案,因为我看到了。当我在寻找更“实用”的答案时,t-sne 有两个理论上的“缺点”值得一提;第一个问题较少,第二个绝对应该考虑:
t-sne 成本函数不是凸的,因此我们不能保证达到全局最优:其他降维技术(Isomap、LLE)具有凸成本函数。在 t-sne 中情况并非如此,因此需要有效调整一些优化参数才能达到“好的”解决方案。然而,尽管存在潜在的理论缺陷,但值得一提的是,在实践中这并不是一个失败,因为似乎即使 t-sne 算法的“局部最小值”也优于其他方法的全局最小值(创建更好的可视化) .
内在维度诅咒:使用 t-sne 时要记住的重要一点是,它本质上是一种流形学习算法。从本质上讲,这意味着 t-sne(和其他此类方法)旨在在原始高维只是人为高的情况下工作:数据存在固有的低维。即,数据“位于”低维流形上。一个很好的例子是同一个人的连续照片:虽然我可以用像素数(高维)来表示每张图像,但数据的内在维数实际上受到点的物理变换的限制(在在这种情况下,头部的 3D 旋转)。在这种情况下,t-sne 效果很好。但是在固有维度很高的情况下,或者数据点位于高度变化的流形上,t-sne 预计会表现不佳,因为它的最基本假设 - 流形上的局部线性 - 被违反了。
对于实际用户,我认为这意味着要记住两个有用的建议:
在对可视化方法执行降维之前,请始终尝试首先弄清楚您正在处理的数据是否确实存在较低的内在维度。
如果您不确定 1(以及一般情况下),那么正如原始文章所建议的那样,“对从模型中获得的数据表示执行 t-sne 可能很有用,该模型有效地表示数字中高度变化的数据流形非线性层,例如自动编码器”。所以在这种情况下,自动编码器+t-sne的组合可能是一个很好的解决方案。
以下是关于在运行 t-SNE 时改变参数如何影响一些非常简单的数据集的出色分析:http: //distill.pub/2016/misread-tsne/。一般来说,t-SNE 似乎在识别高维结构(包括比集群更复杂的关系)方面做得很好,尽管这取决于参数调整,尤其是 perplexity 值。