Embedding Projector
Embeddings は、オブジェクト(人、画像、投稿、単語など)を数値のリストで表現するために使用されます。これらは時々 ベクトル とも呼ばれます。機械学習やデータサイエンスのユースケースでは、さまざまなアプローチで多種多様なアプリケーションからEmbeddingsを生成できます。このページでは、読者がEmbeddingsに精通しており、W&B内でそれらを視覚的に分析することに興味があることを前提としています。
Embedding Examples
ライブ・インタラクティブ・デモ・レポートに直接飛び込むこともできますし、このレポートのコードをExample Colabから実行することもできます。
Hello World
W&Bでは、wandb.Table
クラスを使用してEmbeddingsをログに記録することができます。以下の例では、5次元からなる3つのEmbeddingsを示します。
import wandb
wandb.init(project="embedding_tutorial")
embeddings = [
# D1 D2 D3 D4 D5
[0.2, 0.4, 0.1, 0.7, 0.5], # embedding 1
[0.3, 0.1, 0.9, 0.2, 0.7], # embedding 2
[0.4, 0.5, 0.2, 0.2, 0.1], # embedding 3
]
wandb.log(
{"embeddings": wandb.Table(columns=["D1", "D2", "D3", "D4", "D5"], data=embeddings)}
)
wandb.finish()
上記のコードを実行した後、W&Bダッシュボードには新しいTableがデータとともに表示されます。右上のパネルセレクタから 2D Projection
を選択すると、Embeddingsを2次元でプロットできます。スマートデフォルトが自動的に選択され、ギアアイコンをクリックしてアクセスする設定メニューで簡単に上書きできます。この例では、利用可能な5つの数値次元すべてが自動的に使用されます。
Digits MNIST
上記の例ではEmbeddingの基本的なメカニクスを示しましたが、通常はもっと多くの次元とサンプルを扱います。MNIST Digitsデータセット( UCI ML手書き数字認識データセット)をScikit-Learn経由で利用します。このデータセットには1797件のレコードがあり、それぞれに64次元があります。この問題は10クラス分類のユースケースです。入力データを画像に変換して可視化することもできます。
import wandb
from sklearn.datasets import load_digits
wandb.init(project="embedding_tutorial")
# データセットのロード
ds = load_digits(as_frame=True)
df = ds.data
# "target"カラムの作成
df["target"] = ds.target.astype(str)
cols = df.columns.tolist()
df = df[cols[-1:] + cols[:-1]]
# "image"カラムの作成
df["image"] = df.apply(
lambda row: wandb.Image(row[1:].values.reshape(8, 8) / 16.0), axis=1
)
cols = df.columns.tolist()
df = df[cols[-1:] + cols[:-1]]
wandb.log({"digits": df})
wandb.finish()
上記のコードを実行した後、再びUIにTableが表示されます。2D Projection
を選択すると、Embeddingの定義、カラーリング、アルゴリズム(PCA、UMAP、t-SNE)、アルゴリズムのパラメータ、およびオーバーレイ(この場合、点にホバーしたときに画像が表示されます)の設定ができます。この特定のケースでは、すべて「スマートデフォルト」であり、2D Projection
をワンクリックするだけで非常に類似したものを見ることができるはずです。この例を使ってインタラクティブにクリックします。
Logging Options
Embeddingsは、さまざまなフォーマットでログに記録できます。
- Single Embedding Column: 多くの場合、データはすでに「マトリックス」形式になっています。この場合、単一のEmbeddingカラムを作成できます。セルの値のデータ型は
list[int]
、list[float]
またはnp.ndarray
である場合があります。 - Multiple Numeric Columns: 上記の2つの例では、このアプローチを使用して、各次元のカラムを作成します。現在、セルにはPythonの
int
またはfloat
を受け入れます。
さらに、すべてのテーブルと同様に、テーブルの構築方法についても多くのオプションがあります。
- データフレームから直接
wandb.Table(dataframe=df)
を使用 - データのリストから直接
wandb.Table(data=[...], columns=[...])
を使用 - テーブルを行ごとにインクリメンタルに構築(コードにループがある場合に最適)。
table.add_data(...)
を使用してテーブルに行を追加 - テーブルにEmbeddingカラムを追加(予測のリストが embeddings 形式になっている場合に最適):
table.add_col("col_name", ...)
- 計算カラムを追加(関数やモデルをテーブルにマップしたい場合に最適):
table.add_computed_columns(lambda row, ndx: {"embedding": model.predict(row)})
Plotting Options
2D Projection
を選択した後、ギアアイコンをクリックしてレンダリング設定を編集できます。上記の意図されたカラムを選択するだけでなく、興味のあるアルゴリズム(および希望のパラメータ)を選択することもできます。以下にUMAPとt-SNEそれぞれのパラメータを示します。
Note: 現在、すべてのアルゴリズムで1000行と50次元のランダムサブセットにダウンサンプリングしています。