Verbessern Sie die Geschwindigkeit der Implementierung von t-sne in Python für große Datenmengen


18

Ich würde gerne eine Dimensionsreduktion für fast 1 Million Vektoren mit jeweils 200 Dimensionen durchführen ( doc2vec). Ich verwende dafür die TSNEImplementierung aus dem sklearn.manifoldModul und das Hauptproblem ist die zeitliche Komplexität. Trotzdem method = barnes_hutist die Rechengeschwindigkeit immer noch gering. Irgendwann geht ihm sogar der Speicher aus.

Ich lasse es auf einem Prozessor mit 48 Kernen mit RAM 130G laufen. Gibt es eine Methode, um es parallel auszuführen oder die reichlich vorhandenen Ressourcen zu nutzen, um den Prozess zu beschleunigen?


Haben Sie versucht, die Karte in einem Framework wie Spark zu verkleinern?
Dawny33

Nö .. wie funktioniert es und können Sie mich bitte leiten ..
Yazhi


1
Überprüfen Sie, ob diese Spark-Implementierung funktioniert.
Emre

1
Es ist Scala für Spark. Wenn Sie eine Python-Implementierung wünschen, können Sie diese möglicherweise übersetzen. Spark läuft auch auf Python.
Emre

Antworten:



7

Sehen Sie sich das FFT-beschleunigte interpolationsbasierte t-SNE- Paket ( Papier- , Code- und Python-Paket ) an.

Aus dem Abstract:

Wir präsentieren t-SNE (FIt-SNE), das auf einer schnellen Fouriertransformations-beschleunigten Interpolation basiert und die Berechnung von t-SNE dramatisch beschleunigt. Der zeitaufwändigste Schritt von t-SNE ist eine Faltung, die wir beschleunigen, indem wir auf ein Gitter mit gleichem Abstand interpolieren und anschließend die schnelle Fourier-Transformation verwenden, um die Faltung durchzuführen. Wir optimieren auch die Berechnung von Eingabeähnlichkeiten in großen Dimensionen unter Verwendung von mehrgängigen, ungefähr nächsten Nachbarn.

Das Papier enthält auch ein Beispiel eines Datensatzes mit einer Million Punkten und 100 Dimensionen (ähnlich der OP-Einstellung), und es scheint ~ 1 Stunde zu dauern.


5

Da es in SO keine Antworten gibt, habe ich mich auf der Github-Seite gefragt und das Problem wurde durch die Angabe der folgenden Antwort von GaelVaroquaux geschlossen.

Wenn Sie nur die Vektoroperation parallelisieren möchten, sollten Sie einen mit MKL kompilierten Build von numpy verwenden (versuchen Sie nicht, es selbst zu tun, es ist eine Herausforderung).

Es könnte Ansätze für eine Parallelität auf hoher Ebene im Algorithmus selbst geben, die wahrscheinlich zu größeren Gewinnen führen würden. Nach einem kurzen Blick auf den Code sah ich jedoch keinen klaren Weg, dies zu tun.

Ich gehe voran und schließe dieses Problem, da es sich eher um eine Blauhimmelwunschliste handelt. Ich stimme vollkommen zu, ich möchte, dass TSNE schneller geht, und es wäre großartig, wenn Parallelität einfach wäre. Nach dem gegenwärtigen Stand der Dinge ist jedoch mehr Arbeit in einem Zustand erforderlich, in dem wir eine solche Wunschliste in Angriff nehmen können.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.