메인 콘텐츠로 건너뛰기
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],  # 임베딩 1
      [0.3, 0.1, 0.9, 0.2, 0.7],  # 임베딩 2
      [0.4, 0.5, 0.2, 0.2, 0.1],  # 임베딩 3
  ]
  run.log(
      {"embeddings": wandb.Table(columns=["D1", "D2", "D3", "D4", "D5"], data=embeddings)}
  )
  run.finish()
위 코드를 실행하면 W&B 대시보드에 데이터를 포함한 새로운 Table이 생성됩니다. 오른쪽 상단의 패널 선택기에서 2D Projection을 선택해 임베딩을 2차원으로 시각화할 수 있습니다. Smart default가 자동으로 선택되며, 톱니바퀴 아이콘을 클릭해 열리는 설정 메뉴에서 쉽게 변경할 수 있습니다. 이 예제에서는 사용 가능한 5개의 숫자형 차원을 모두 자동으로 사용합니다.
2D projection example

숫자 MNIST

위 예시는 임베딩 로깅의 기본 메커니즘을 보여주지만, 실제로는 훨씬 더 많은 차원과 샘플을 다루는 경우가 대부분입니다. SciKit-Learn을 통해 제공되는 MNIST 숫자 데이터셋(UCI ML hand-written digits datasets)을 살펴보겠습니다. 이 데이터셋은 64차원을 가진 1797개의 샘플로 구성되어 있습니다. 이는 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에 다시 Table이 표시됩니다. 2D Projection을 선택하면 임베딩 정의, 색상, 알고리즘(PCA, UMAP, t-SNE), 알고리즘 파라미터, 그리고 오버레이(이 예제에서는 포인트에 마우스를 올렸을 때 이미지를 표시)를 설정할 수 있습니다. 이 예제에서는 모두 “스마트 기본값(smart defaults)”이 적용되어 있어, 2D Projection을 한 번만 클릭해도 거의 동일한 결과를 확인할 수 있습니다. (이 임베딩 튜토리얼 예제를 직접 확인해 보세요).
MNIST digits projection

로깅 옵션

임베딩은 여러 가지 형식으로 로깅할 수 있습니다:
  1. 단일 임베딩 컬럼: 데이터가 이미 “행렬”과 비슷한 형식인 경우가 많습니다. 이 경우 단일 임베딩 컬럼을 만들 수 있으며, 셀 값의 데이터 타입은 list[int], list[float], 또는 np.ndarray가 될 수 있습니다.
  2. 여러 개의 수치 컬럼: 위의 두 예시에서는 이 방식을 사용해 각 차원마다 컬럼을 생성합니다. 현재 셀 값에는 Python의 int 또는 float 타입을 사용할 수 있습니다.
단일 임베딩 컬럼
여러 개의 수치 컬럼
또한, 다른 모든 테이블과 마찬가지로 테이블을 구성하는 방법에 대해서도 여러 가지 옵션이 있습니다:
  1. wandb.Table(dataframe=df)를 사용하여 dataframe으로부터 직접 생성
  2. wandb.Table(data=[...], columns=[...])를 사용하여 데이터 리스트로부터 직접 생성
  3. 테이블을 행 단위로 점진적으로 구성 (코드에 루프가 있을 때 유용). 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 parameters
t-SNE parameters
참고: 현재 세 가지 알고리즘 모두에 대해, 1000개의 행과 50개의 차원을 무작위 하위 표본으로 다운샘플링합니다.