【问题标题】:Is t-SNE's computational bottleneck its memory complexity?t-SNE 的计算瓶颈是内存复杂度吗?
【发布时间】:2017-08-22 18:38:35
【问题描述】:

我一直在探索不同的降维算法,特别是 PCA 和 T-SNE。我正在获取 MNIST 数据集的一小部分(大约 780 个维度)并尝试将原始数据减少到三个维度以可视化为散点图。 T-SNE可以详细描述here

我使用 PCA 作为 T-SNE 之前的中间降维步骤,正如 T-SNE 的原始创建者在 source code from their website. 上所描述的那样

我发现 T-SNE 需要永远运行(从 2000 x 252000 x 3 特征空间需要 10-15 分钟),而 PCA 运行相对较快(2000 x 780 => 2000 X 20 只需几秒钟)。

为什么会这样?我的理论是,在 PCA 实现中(直接来自主要作者的 Python 源代码),他利用 Numpy 点积符号来计算 XX.T

def pca(X = Math.array([]), no_dims = 50):
    """Runs PCA on the NxD array X in order to reduce its dimensionality to no_dims dimensions."""

    print "Preprocessing the data using PCA..."
    (n, d) = X.shape;
    X = X - Math.tile(Math.mean(X, 0), (n, 1));
    (l, M) = Math.linalg.eig(Math.dot(X.T, X));
    Y = Math.dot(X, M[:,0:no_dims]);
    return Y;

据我所知,这比标量操作效率高得多,也意味着只有 2N(其中N 是行数)数据被加载到内存中(你需要加载一行X和一列X.T)。

但是,我认为这不是根本原因。 T-SNE 肯定也包含向量运算,例如计算成对距离时D

D = Math.add(Math.add(-2 * Math.dot(X, X.T), sum_X).T, sum_X);

或者,在计算 P(高维)和 Q(低维)时。然而,在 t-SNE 中,您必须创建两个 N X N 矩阵来存储每个数据之间的成对距离,一个用于其原始的高维空间表示,另一个用于其降维空间。

在计算梯度时,您还必须创建另一个名为PQN X N 矩阵,即P - Q

在我看来,这里的内存复杂性是瓶颈。 T-SNE 需要 3N^2 的内存。这不可能适合本地内存,因此该算法会遇到严重的缓存行未命中,并且需要转到全局内存来检索值。

这是正确的吗?我如何向客户或合理的非技术人员解释为什么 t-SNE 比 PCA 慢?

共同作者的 Python 实现位于 here

【问题讨论】:

  • 粗略一瞥,pca 似乎是一系列矢量化操作,因此具有高性能,而 t-sne 则不是。可能离题,但我们不需要那个tile,因为可以在该步骤使用 NumPy 广播。
  • 有趣。关于tile,直接从合著者的PCA 源代码中复制。 T-SNE 也有几个矢量化操作。我将编辑问题以包含一些示例。
  • 我的猜测是t-SNE变慢的核心原因是没有封闭形式的解决方案,它需要迭代来近似答案。 PCA 是一个简单的计算,瓶颈 (eig) 已被优化到极致。

标签: python arrays algorithm numpy dimensionality-reduction


【解决方案1】:

t-SNE 比 PCA 慢的主要原因是不存在正在优化的标准的解析解。相反,必须通过梯度下降迭代来近似解。

实际上,这意味着很多 for 循环。至少不是第 129 行中的主迭代 for 循环,它运行到 max_iter=1000 次。此外,x2p 函数使用 for 循环遍历所有数据点。

参考实现针对可读性而非计算速度进行了优化。作者也链接到optimised Torch implementation,这应该会大大加快计算速度。如果你想留在纯 Python 中,我推荐在 Scikit-Learn 中的实现,它应该也会快很多。

【讨论】:

  • 谢谢-这非常有帮助并回答了我的问题。出于好奇,您能否就我的内存复杂性问题提供一些想法? PCA 本身是否应该只是 2N 内存复杂度,而 T-SNE 似乎是 2N^2
【解决方案2】:

t-SNE 尝试降低维度,同时保留元素之间的距离分布。

这需要计算所有点之间的距离。成对距离矩阵有 N^2 个条目,其中 N 是示例数。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多