orizuru

つながる.見える.わかる IoTソリュ-ション

scikit-learnのt-SNEが遅く感じたらMulticore t-SNEを使おう

約 6 分
scikit-learnのt-SNEが遅く感じたらMulticore t-SNEを使おう

こんにちはtetsuです。

みなさんはt-SNEを使ってますか?t-SNEはデータの分布の可視化に非常に便利ですし、scikit-learnから簡単に利用できるため重宝しています。ただscikit-learnのt-SNEを使っているときには結構計算時間がかかるなぁと思うことが多いです。このようなときに有用なのがt-SNEを高速実装したMulticore t-SNEというライブラリになります。今回はscikit-learnのt-SNEとMulticore t-SNEの比較をおこなっていきたいと思います。

t-SNEとは?

t-SNEは高次元のデータを低次元空間に射影するための手法です。高次元のデータのままでは人間にはどういうデータの分布になっているのかが理解できませんが、低次元(2あるいは3次元)の空間に射影することでデータ間の関係性を視覚的に確認することが可能となります。なお、t-SNEの読み方は”てぃーすにー”らしいです。
低次元の空間へデータを射影するための手法としては主成分分析を使った方法が一番有名かもしれません(ちなみに主成分分析についてはこちらの記事を参考ください)。主成分分析以外にも低次元の空間へ射影するための方法がいくつも存在しますが、t-SNEが優れている点としては高次元空間でのデータ間の関係性を上手く捉えることができる点です。
t-SNEの有効性を確認しておきましょう。手書き数字(0~9)の画像のデータセットで有名なMNISTから5000枚をランダムに選び、それらをt-SNEと主成分分析で2次元空間に射影して描画しました。下記の左図が主成分分析による射影の結果で、右図がt-SNEの結果です。各点が1つの数字の画像に対応しており、色が0~9の数字をあらわします。各数字ごとに文字の傾向が異なりますので、理想的には数字毎にまとまって分布して欲しいところです。主成分分析の結果では1(青)がまとまって分布していますが、8(赤色)や5(緑)がバラバラになってしまっています。一方でt-SNEでは数字毎にまとまって分布している様子が確認できます。t-SNEが関係性を上手く捉えて低次元空間に射影できていることがこれで分かったかと思います。
pcatsne

なお、理論的な話は省きますので気になる方は論文等を参照して下さい。
Visualizing Data using t-SNE

scikit-learnとMulticore t-SNEの速度比較

実験準備

次にscikit-learnのt-SNEとMulticore t-SNEの速度の比較をおこなっていきたいと思います。Multicore t-SNEはgithubで公開されているコードを利用しています(https://github.com/DmitryUlyanov/Multicore-TSNE)。
Multicore t-SNEではt-SNEを並列計算可能にした実装になります。ただしドキュメントを見てみると、入力データの次元が小さいと並列化の恩恵があまりないようです。なお、MacOS上でのインストール時にclangを使ってコンパイルをしたらマルチコアで動作しなかったので、gccを使うようにしましょう。
実験ではMNISTの画像を用いています。それぞれの画像は28✕28の大きさですので、784(=28の2乗)次元のベクトルとして扱うことにします。MNISTの画像は合計で70000枚になりますが、実行時間がかかりすぎるので5000枚と10000枚で実験をおこないました。また計算は2コアを積んだマシンでおこなっています。

実験結果

まず5000枚のMNISTの画像の射影にかかった時間を以下に示します。1コアの場合でさえscikit-learnに比べて1.5倍程度高速で、2コアを使った場合には倍以上速くなっていることが確認できます。

ここをタップして表示Close
手法 計算時間(s)
scikit-learnのt-SNE 69
Multicore t-SNE(1コア) 43
Multicore t-SNE(2コア) 31

scikit-learnの射影の結果とMulticore t-SNEの射影の結果を確認してみます。以下の左図がscikit-learnで右図がMulticore t-SNEです。乱数の関係もあり、全く同じ分布にはなりませんが、どちらも8(赤)の周りに5(緑)や3(水色)があるなど傾向は似通っているのがわかります。
sklearn_tsne_n5000mtsne_n5000

10000枚のMNISTの場合についても同じように計算時間と射影した結果を以下に示します。2コアを使った場合にはscikit-learnの3倍近く速くなっているので、大分ありがたいですね。

ここをタップして表示Close
手法 計算時間(s)
scikit-learnのt-SNE 225
Multicore t-SNE(1コア) 117
Multicore t-SNE(2コア) 80

sklearn_tsne_n10000mtsne_n10000

まとめ

よく実行する機能の待ち時間が短くなるのは嬉しいですね。どんどん使いましょう。

Leave A Reply

*
*
* (公開されません)