メインコンテンツへスキップ
Embedding Projector
埋め込みは、人、画像、投稿、単語などのオブジェクトを数値の並びで表現するために使用されます。これは ベクトル と呼ばれることもあります。機械学習やデータサイエンスのユースケースでは、埋め込みはさまざまなアプリケーションで、多様な手法を使って生成できます。このページでは、読者が埋め込みに精通しており、W&B 内でそれらを視覚的に分析したいと考えていることを前提としています。

埋め込みの例

Hello World

W&B では、wandb.Table クラスを使って埋め込みをログできます。以下の例では、5 次元の埋め込みが 3 つあります。
import wandb

with wandb.init(project="embedding_tutorial") as run:
  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
  ]
  run.log(
      {"embeddings": wandb.Table(columns=["D1", "D2", "D3", "D4", "D5"], data=embeddings)}
  )
  run.finish()
上記のコードを実行すると、W&Bダッシュボードにデータを含む新しい表が表示されます。右上のパネルセレクターから 2D Projection を選択すると、埋め込みを2次元でプロットできます。Smart default が自動的に選択されますが、歯車アイコンをクリックして開く設定メニューから簡単に変更できます。この例では、使用可能な5つの数値次元をすべて自動的に使用します。
2D投影の例

MNIST の数字

上記の例では、埋め込みをログする基本的な仕組みを示しましたが、通常はもっと多くの次元数とサンプルを扱います。ここでは、SciKit-Learn で利用できる MNIST Digits データセット (UCI ML hand-written digits datasets) を見てみましょう。このデータセットには 1797 件のレコードがあり、それぞれ 64 次元です。これは 10 クラス分類の問題です。また、可視化のために入力データを画像に変換することもできます。
import wandb
from sklearn.datasets import load_digits

with wandb.init(project="embedding_tutorial") as run:

  # データセットを読み込む
  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]]

  run.log({"digits": df})
上記のコードを実行すると、再び UI に表が表示されます。2D Projection を選択すると、埋め込みの定義、色分け、アルゴリズム (PCA、UMAP、t-SNE) 、アルゴリズムのパラメーター、さらにはオーバーレイ (この場合は、点にカーソルを合わせると画像を表示) まで設定できます。このケースでは、これらはすべて「smart defaults」が使われているため、2D Projection を 1 回クリックするだけで、ほぼ同じ表示になるはずです。(この埋め込みチュートリアルの例を操作する)。
MNIST digits projection

ログのオプション

埋め込みは、さまざまな形式でログできます。
  1. 単一の埋め込み列: データがすでに「行列」のような形式になっていることはよくあります。この場合は、単一の埋め込み列を作成できます。セル値のデータ型には、list[int]list[float]、または np.ndarray を使用できます。
  2. 複数の数値列: 上の 2 つの例では、この方法を使って各次元ごとに列を作成しています。現在、セルには Python の int または float を使用できます。
単一の埋め込み列
複数の数値列
さらに、他のすべての表と同様に、表の構築方法にもさまざまな選択肢があります。
  1. dataframe から直接作成する: wandb.Table(dataframe=df)
  2. データのリストから直接作成する: wandb.Table(data=[...], columns=[...])
  3. 表を1 行ずつ段階的に構築する (コード内にループがある場合に便利です) 。table.add_data(...) を使って表に行を追加します
  4. 表に埋め込み列を追加する (埋め込み形式の予測のリストがある場合に便利です) : table.add_col("col_name", ...)
  5. 計算列を追加する (表全体に適用したい関数やモデルがある場合に便利です) : table.add_computed_columns(lambda row, ndx: {"embedding": model.predict(row)})

プロットオプション

2D Projection を選択したら、歯車アイコンをクリックして表示設定を編集できます。対象の列を選択するだけでなく (上記参照) 、使用するアルゴリズムと必要なパラメーターも選択できます。以下に、UMAP と t-SNE のパラメーターをそれぞれ示します。
UMAP のパラメーター
t-SNE のパラメーター
注: 現在、3 つすべてのアルゴリズムで、1000 行・50 次元のランダムなサブセットにダウンサンプリングしています。