やりたいこと
前提知識:Embedding(埋め込み表現)とは
ある対象をコンピュータ上で取り扱えるように、数値(ベクトル)に変換した結果のこと。対象をベクトル空間上に落とし込むため、「ベクトル空間に埋め込む」なんて言い方をする1。
例:自然言語処理で単語のEnbedding
- 「本」 = (1.8, 2.1, ..., -0.3)
- 「大学生」 = (1.2, -0.3, ..., 0.9)
- 「テキーラ」 = (0.2, -0.5, ..., 3.2)
※ 埋め込み方法によってこの数値は異なる。
本題
- Enbedding作ったけど、可視化してそれっぽい埋め込みになっているかを確かめたい!
先に出力イメージ
tensorboardを使うと簡単にこんなのを作れる。
(3次元に投影するのでぐるぐる回せる)
やり方
pythonの環境準備
次のものをインストール(私はどちらもcondaでインストールしました)
- torch(下のプログラムの書き換えは少し必要だけどtensorflowでもOK)
- tensorboard
プログラム
import numpy as np
from torch.utils.tensorboard import SummaryWriter
vectors = np.random.normal(0, 1, (30,128)) # 128次元のベクトルを正規分布で適当に30個生成(embeddingの代用)
labels = ['data_'+str(i) for i in range(30)] # ベクトルの名前を'data_1'みたいな形で設定
writer = SummaryWriter()
writer.add_embedding(vectors, metadata=labels)
描画の実行方法
上のプログラムを実行すると、runsというディレクトリができる。
tensorboard --logdir ./runs
を実行すると、http://localhost:xxxx/ のようなURLが出てくるので、ブラウザで開くと上の画像のような画面が出てくる。
※ ブラウザで開いてもうまく表示されない場合はリロードしてみるといいかも
終わりに
- 他にもlabelをいろいろ調整して画像を表示させたりできるらしいので、
- 埋め込み関連の研究やるなら早めに知っておいたほうがいいツールだったと思う(私は最近まで知らなかった。。。)
-
適切な演算が定義してある数学的な「ベクトル空間」とは限りません。そのため数学的には正しくない用語の使い方ですが、お気持ち的にベクトルに埋め込むという意味で一般的に使われています。 ↩