t-SNEを理解する3つのポイントとパラメータの解説

t-SNE example

t-SNEは多次元データの可視化手法の一つとして有名な手法です。

本記事では、t-SNEで用いられている考え方のポイントとperplexityの役割を論文を元に簡単に解説します。
かなりの要約ですが、ポイントだけでも知っておくことで、理解を深める一助となることを目指しています。
同じく多次元データの可視化手法であるPCAとは考え方が全く異なるので、違いの理解の参考になれば幸いです。

元論文はこちらです。
http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf

理論ではなくコード例が必要な方は、以下の記事をご参照ください。
https://bunsekikobako.com/t-sne-code-example/

t-SNEのポイント要約

t-SNE (t-distribution Stochastic Neighbor Embedding)はSNE (Stochastic Neighbor Embedding)から派生した多次元データの可視化手法です。名前の通り、t分布を使った表現などが導入されています。

t-SNEで行なっていることの概要を把握するには、まず以下の3点を押さえるのが良いかと思います。

1. t-SNEでの次元削減の考え方: 近くの点との関係性をなるべく維持するように非線型変換。
2. データ同士の関係性の表現手法: 確率分布を用いて点同士の関係を表現。
3. 分布の最適化: コスト関数に高次元-低次元で対応する同じ点同士のKLダイバージェンスを使用。

上記のポイントを押さえると、どういう非線型変換なのかもなんとなく理解が進むのではないかと思います。
後ほどそれぞれ簡単に説明を行なっていきます。

また、最後に重要変数であるperplexityの立ち位置を簡単に紹介します。
先に説明してしまうと、perplexityはデータ同士の関係の評価の際にどれだけ近傍の点を考慮するかの決定に寄与してきます。

t-SNEでの次元削減の考え方

1つ目は、t-SNEでのそもそもの考え方です。

t-SNEでは「高次元側と低次元側それぞれでのデータ点同士の関係性(類似度)を確率を用いて表現」し、
「次元圧縮を行う際に、近くの点同士の関係性をなるべく保つような変換」を行います。

データ同士の関係性の表現手法

2つ目は、データの関係性をどう表現するかです。

t-SNEでは高次元側・低次元側それぞれで点同士の位置関係を同時分布を用いて表現しています。
例えば、高次元側ではガウス分布(正規分布)を使用して、点iと周辺のk-1個の点との関係を、

$latex p_{j|i} = \frac{exp(-|x_i – x_j|^2/2\sigma^2_i)}{\sum_{k\not=i}exp(-|x_i – x_j|^2/2\sigma^2_i)} $

として表現します。

SNEでは高次元・低次元の両方で正規分布を使用していますが、t-SNEでは低次元側の表現にt分布を使用します。

分布の最適化手法

3つ目は、分布の最適化手法です。

t-SNEでは最適化に使用するコスト関数として、高次元空間と低次元空間で対応する点同士(空間の間での対応関係)のカルバックライブラーダイバージェンス(KLダイバージェンス)の総和を使用し、勾配降下法などで最小化します。

このコスト関数を用いることで、次元削減をしたあともデータの局所構造を維持できるようになっているようです。

t-SNEのポイントまとめ

以上の3点がt-SNEのポイントの要約です。改めて整理すると、

1. t-SNEでの次元削減の考え方: 近くの点との関係性をなるべく維持するように非線型変換。
2. データ同士の関係性の表現手法: 確率分布を用いて点同士の関係を表現。
3. 分布の最適化: コスト関数に高次元-低次元で対応する同じ点同士のKLダイバージェンスを使用。

という3点に整理できました。非線型変換であることも納得がいくのではないでしょうか。

perplexityについて

t-SNEを実際に使用する上で重要なパラメータがperplexityです。

perplexityの式での表現

perplexityは高次元側での各点iに対するガウス分布の分散に関するパラメータです。

論文から式を引用すると、perplexity(perP(P_i))は、

$latex perP(P_i) = 2^{H(P_i)} $

と表現されています。H(P_i)はシャノンのエントロピーなので書き下すと、

$latex perP(P_i) = 2^{-\sum_{j} P_{j|i} log_2 P_{j|i}} $

となります。

perplexityの意味の解釈

パラメータであるperplexityは左辺に定数として代入されるので、この値が右辺の変数である分散の値の決定に影響してくることがなんとなく分かるかと思います。

論文にも記載がありますが、perplexityは有効な近傍点の評価の指標として考えることができます。

上式の左辺が定数なので、値に従って右辺の変数である分散が決定されます。
「分散が小さいほど近くの点のみ値の寄与が大きくなるので、近傍の点しか考慮しなくなる」
と考えるとよいかと思います。

ある点に対するその他全ての点との関係性を表す確率密度の総和が左辺のperplexityに寄与していることに留意しておくと理解の助けになるかもしれません。

以上より、perplexityはどれだけ近傍の点を考慮するかを決めるための値と考えることができそうです。

なお、分布の分散の値はバイナリサーチで探索されるようです。

論文中で、SNEでのperplexityは典型的には5~50程度だという記載があるので、値を決める際の参考にできそうです。

まとめ

本記事のまとめです。

1. t-SNEでの次元削減の考え方: 近くの点との関係性をなるべく維持するように非線型変換。
2. データ同士の関係性の表現手法: 確率分布を用いて点同士の関係を表現。
3. 分布の最適化: コスト関数に高次元-低次元で対応する同じ点同士のKLダイバージェンスを使用。

また、パラメータであるperplexityは元の高次元データの分布表現の際に使用される分散の決定に使用される値で、ある点の表現にどれだけ近傍の点を考慮するかを決めるための値だと考えられます。

t-SNEという名称の由来(t分布を使用したSNEだから)、大体の内容、perplexityの役割をなんとなく知っていただければ幸いです。

なお、主要なポイントから外れるので記載していませんが、t-SNEはSNEからの派生にあたり、t分布の導入だけでなく、それぞれの次元での点同士の関係を対称性を保って表現できるような変更(symmetric SNE)も含んでいます。

この辺りも含め、きちんとした理解が必要な場合は是非一度論文も読んでみてください。

また、本記事でのアイキャッチ画像は、Wine Quality Datasetに対し、t-SNEを使って可視化した例でした。
コード例を紹介する記事も作成したので、こちらも良ければご参照ください。

t-SNEの基本的なコード例と標準化との組み合わせ
pythonでのt-SNEのコード例を紹介します。パラメータであるperplexityを振った結果と、標準化したデータに対してt-SNEを適用した結果をそれぞれ扱っています。

参考文献

http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf
https://scikit-learn.org/stable/modules/manifold.html#t-sne
https://archive.ics.uci.edu/ml/datasets/wine+quality

その他参考資料

以下に示す英語の記事でt-SNE自体の説明とパラメータの特徴が動的なグラフを交えて紹介されており、有用だったため併せてご紹介します。
https://distill.pub/2016/misread-tsne/