それぞれ200次元のほぼ100万のベクトルで次元削減を行いたい(doc2vec
)。モジュールのTSNE
実装を使用していsklearn.manifold
ますが、主な問題は時間の複雑さです。でもmethod = barnes_hut
、計算速度はまだ遅いです。メモリー不足になることもあります。
130G RAMを搭載した48コアプロセッサで実行しています。並列に実行する方法や、プロセスを高速化するために豊富なリソースを使用する方法はありますか。
それぞれ200次元のほぼ100万のベクトルで次元削減を行いたい(doc2vec
)。モジュールのTSNE
実装を使用していsklearn.manifold
ますが、主な問題は時間の複雑さです。でもmethod = barnes_hut
、計算速度はまだ遅いです。メモリー不足になることもあります。
130G RAMを搭載した48コアプロセッサで実行しています。並列に実行する方法や、プロセスを高速化するために豊富なリソースを使用する方法はありますか。
回答:
FFTで高速化された補間ベースのt-SNE(paper、code、およびPythonパッケージ)をご覧ください。
要約から:
t-SNEの計算を劇的に加速する、高速フーリエ変換による補間ベースのt-SNE(FIt-SNE)を紹介します。t-SNEの最も時間のかかるステップは、等間隔グリッドに補間し、その後高速フーリエ変換を使用して畳み込みを実行することにより加速する畳み込みです。また、マルチスレッド近似最近傍を使用して、高次元での入力の類似性の計算を最適化します。
このペーパーには、100万点と100次元のデータセットの例も含まれており(OPの設定と同様)、1時間ほどかかるようです。
SOには答えがないので、githubページで自分自身に尋ねましたが、GaelVaroquaux。による次の返信を述べることで問題が解決されました。
ベクトル演算のみを並列化する場合は、MKLでコンパイルされたnumpyのビルドを使用する必要があります(自分で実行しないでください。やりがいがあります)。
アルゴリズム自体に高レベルの並列処理へのアプローチが存在する可能性があり、おそらくより大きなゲインにつながります。しかし、コードをざっと見てみたところ、それを行う明確な方法は見当たりませんでした。
この問題は青空のウィッシュリストに近いため、先に進んでこの問題を解決します。私は完全に同意します。TSNEをもっと速くしたいのですが、並列処理が簡単だったのは素晴らしいことです。しかし、現状では、このようなウィッシュリストに取り組むことができる状態になるためには、より多くの作業が必要です。
UMAPを試してください:https : //github.com/lmcinnes/umap
t-SNEよりも大幅に高速です。