TensorFlow 0.12で追加されたEmbedding Visualizationを試す

# はじめに
先日 TensorFlow 0.12 がリリースされました。
その機能の一つとして、埋め込み表現の可視化があります。これにより高次元のデータをインタラクティブに分析することが可能になります。

以下は MNIST を可視化したものです。以下の画像は静止画ですが、[公式サイト](https://www.tensorflow.org/versions/r0.12/how_tos/embedding_viz/index.html#tensorboard-embedding-visualization)では3次元でぬるぬる動いているところを見ることができます。
![embedding_visualization.png](https://qiita-image-store.s3.amazonaws.com/0/77079/967dd536-a8bd-4f14-f807-726c35f7b626.png)

本記事ではWord2vecの可視化を通じて、Embedding Visualization の使い方を試してみました。まずはインストールから行っていきます。


<!--
なお、取り急ぎの紹介なので詳しいことがわかり次第追記します。
どういうところをいじればわかりやすいのか。どんな機能があるのかを書く。
-->

# インストール
まずは TensorFlow 0.12 をインストールします。以下のページを参考にインストールしてください。

* [Download and Setup](https://www.tensorflow.org/versions/r0.12/get_started/os_setup.html#download-and-setup)

インストールが終わったら可視化のために学習を行います。

# モデルを学習する
まずはリポジトリをクローンした後、以下のコマンドを実行して移動します:

```shell-session
$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow/models/embedding
```

学習データと評価データをダウンロードするために以下のコマンドを実行します:

```shell-session
$ wget http://mattmahoney.net/dc/text8.zip -O text8.zip
$ unzip text8.zip
$ wget https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/word2vec/source-archive.zip
$ unzip -p source-archive.zip  word2vec/trunk/questions-words.txt > questions-words.txt
$ rm source-archive.zip
```

データが用意できたので単語ベクトルを学習します。以下のコマンドを実行してください:

```shell-session
$ python word2vec_optimized.py --train_data=text8　--eval_data=questions-words.txt --save_path=/tmp/
```

学習には1時間くらいかかるのでお待ちください。

# TensorBoard で Embedding を表示する
学習が終わったら表示を行います。まずは以下のコマンドを実行して TensorBoard を起動してください:

```shell-session
$ tensorboard --logdir=/tmp/
```

起動したら、指定されたアドレスにアクセスします。その後 Embedding タブを選択すると可視化されたベクトルが表示されます。

ちなみにWord2vecの可視化を行ったら、ボキャブラリ数が多すぎてわけがわからないことになりました。
<img src="http://ahogrammer.com/wp-content/uploads/2016/11/embedding_word2vec.gif" />

[Metadata](https://www.tensorflow.org/versions/master/how_tos/embedding_viz/index.html#metadata-optional)を使うと単語IDではなく単語そのものを表示できるようになるみたいです。

## もし何も表示されなかったら
Embedding タブを選択した際にブラウザに何も表示されず、コンソールに以下のようなエラーが出ることがあります。というか出ました。

```
 File "/Users/user_name/venv/lib/python3.4/site-packages/tensorflow/tensorboard/plugins/projector/plugin.py", line 139, in configs
    run_path_pairs.append(('.', self.logdir))
AttributeError: 'dict_items' object has no attribute 'append'
```

その場合、インストールしたTensorFlowの**tensorflow/tensorboard/plugins/projector/plugin.py**の139行目を以下のように変更してください。その後、TensorBoard を再実行します。

```py3
- run_path_pairs.append(('.', self.logdir))
+ run_path_pairs = [('.', self.logdir)]
```

# いろいろいじってみる
あるノード(単語)を選択した後、「isolate 101 points」を選択したら以下のように表示されました。

<img width="1356" alt="スクリーンショット 2016-11-30 17.50.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/e2d4673a-a04a-afd8-d453-e4ae031e1378.png">

これは選択した単語に類似した100単語を表示していることになります。ここで類似度を測るためには、コサイン類似度、ユークリッド距離を使うことができます。また、neighborsを指定することで、表示する単語数を増減させることができます。



可視化のためのアルゴリズムも複数使うことができます。
<img width="987" alt="スクリーンショット 2016-11-30 18.18.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/b2699e92-648e-ffbd-53f6-7d8835539dce.png">


デフォルトではPCAですが、T-SNEやCUSTOMも使うことができます。画像では3次元表示していますが、2次元表示を行うこともできます。

# おわりに
ラベルとして単語を割り当てられるともっと面白くなりそうです。今回は取り急ぎこんな感じの紹介に留めておきます。

# 参考

* https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/models/embedding
* https://github.com/tensorflow/tensorflow/blob/r0.12/tensorflow/models/embedding/word2vec_optimized.py
* https://github.com/tensorflow/tensorflow/pull/5937