MotoJapan's Tech-Memo

技術めも

【行動認識 #9】t-SNEをtensorboard(Embedding Visualization)で可視化

今回はtensorboardのEmbedding Visualization対応コードを実装し、センサーデータ入力にt-SNEを可視化してみた。

センサー系の文脈ではこれの続き
【行動認識 #6】tensorflowでCAE(Convolutional Auto-Encoder)を実装してみた - MotoJapan's Tech-Memo

行動認識系全般ではこれの続き
【行動認識 #8】OpenPoseのBodyParts推定をTensorFlowでCPU実行する方法 (Linux : Ubuntu 16.04 LTS) - MotoJapan's Tech-Memo

目次

t-SNEとは?

  • t-distributed Stochastic Neighbor Embedding
  • Laurens van der Maaten & Geoffrey Hinton 提唱 [2008]
  • 高次元データに対する次元圧縮/可視化手法の1つ(PCA, ICA, etc)
  • KL情報量を目的関数とした、高次元から低次元へのデータのローカル距離の保つ非線形マッピングを行う
    • 各点間のユークリッド距離の近さを確率分布で表現
    • 分布の近さを測る方法であるKL情報量で、次元圧縮前後の分布の近さを測り、これを最小化する
    • PCAの場合、分散最大化を目的関数とした、高次元から低次元へのデータの線形構造を保つマッピングを行う(線形アルゴリズム
  • ハイパーパラメータ
    • 「perplexity」 (候補数, 複雑度)
      • 小さいほど局所的、大きいほど大域的な特性を考慮できる
      • 5 - 50 に収まるのが良いが、データ数より小さい方がよい
    • 「iteration」 (学習回数)
      • 同じデータセットであっても同じiterationで安定せず、安定するタイミングは不明
      • 構造の再現性を保証しない
    • 「epsilon」 (学習率)
  • 他の手法に比べて
    • 視覚的な図示が綺麗なことが多い (case-by-case)
    • 計算コストとメモリ消費が大きい
    • (PCAで前処理をしてからt-SNEを試行する高速化手法もある)
    • 次元圧縮も可能だが、2次元から2次元への変換さえ可能

詳細は他に譲りますが参考文献をみればよくわかる。

結果

学習データ 7344 [samples]に対してt-SNEを試行。(512次元を3次元に次元圧縮)
わかりやすく可視化するため、1 [sample]毎にmeta情報(index, labelなど)をEmbeddingした。
(慣れればtensorboardはすごく扱いやすい。)

Iterationによるクラスタリング遷移

・600 [iteration]程で大体収束
f:id:motojapan:20170831054135g:plain
見ていて面白い。

3D操作例

センサーから読み取れる行動は、中心から幾つもエッジが生える様な形状を有していた。
f:id:motojapan:20170831054155g:plain
すごく便利。
動画では途中でmetaデータのembeddingを実行してみたが、グラフィックが切り替わり、データ解析が捗る。

形状から読み取れることは

  • 中心部には異なる行動でも、似たような動きのサンプルが集まる
  • エッジに伸びるほど、同じ行動に特徴的なサンプルが集まる

中心部拡大

別々のクラスが密集しているところでわかることは、

  • WALKING_xxx 3つは隣接している
    • 「共通かつ繰り返し動作で根本的に似ていること」がt-SNEから表現
  • STANDING - WALKING_UPSTAIRSは隣接している
    • 体幹を上げるという点で似ていること」がt-SNEから表現
  • STANDING - SITTINGは隣接していない





メモ

tensorflowでの実装メモ

embeddingするmetaデータのフォーマット.tsvについて
1行目は、ヘッダー、2行目以降は、embedding情報。
なので.tsvの総行数は、[ヘッダー(1行)+データ数]となる
(詳細は本家)

今回は次の要領で書き込んだ。

[metadata.tsv]
'index \t activity \t subject \n'
'1 \t WALKING \t 15 \n'
'2 \t WALKING \t 15 \n'
'3 \t SITTING \t 15 \n'
...

python上での実装について
実装は次を参考(すごくわかりやすかったです)
TensorFlow 0.12 のEmbedding Visualizationを動かす - すぎゃーんメモ

学習処理後に下記を追記

embedding_var = tf.Variable(tf.stack([tf.squeeze(y) for y in <labels>], axis=0), trainable=False, name='fc2')

summary_writer = tf.summary.FileWriter(<dst_dir>)
config = projector.ProjectorConfig()
embedding = config.embeddings.add()
embedding.tensor_name = embedding_var.name #'fc2/Variable'
embedding.metadata_path = <meta_path>
projector.visualize_embeddings(summary_writer, config)

sess.run(tf.variables_initializer([embedding_var]))
saver = tf.train.Saver([embedding_var])
saver.save(sess, <store_model_path>)

Embedding Visualizationでできること

  • 2D/3Dへの次元圧縮
  • 次元圧縮の選択肢は、PCA, t-SNE, CUSTOM
  • t-SNEは perplexity, learning rateをGUIで操作
  • 任意点の近傍探索
  • meta情報(複数可能)をembeddingして、Coloring / Sort / Grepが簡単 (超絶便利)