메인 콘텐츠로 건너뛰기
임베딩 프로젝터
임베딩은 객체(사람, 이미지, 게시물, 단어 등)를 숫자 목록으로 표현하는 데 사용되며, 이를 _벡터_라고 부르기도 합니다. 머신러닝과 데이터 사이언스 활용 사례에서 임베딩은 다양한 애플리케이션에서 여러 방법으로 생성될 수 있습니다. 이 페이지는 독자가 임베딩에 익숙하며 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

Digits MNIST

앞의 예시는 임베딩을 로깅하는 기본 메커니즘을 보여주지만, 실제로는 훨씬 더 많은 차원과 샘플을 다루는 경우가 일반적입니다. SciKit-Learn을 통해 제공되는 MNIST Digits 데이터셋(UCI ML 손글씨 숫자 데이터셋s)을 살펴보겠습니다. 이 데이터셋에는 총 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에 다시 Table이 표시됩니다. 2D Projection을 선택하면 임베딩 정의, 색상, 알고리즘(PCA, UMAP, t-SNE), 알고리즘 파라미터, 심지어 오버레이까지 설정할 수 있습니다(이 예시에서는 각 포인트에 마우스를 올렸을 때 해당 이미지를 표시). 이 예시에서는 이런 설정들이 모두 ‘스마트 기본값(smart defaults)’으로 잡혀 있어서, 2D Projection을 한 번만 클릭해도 거의 동일한 결과를 확인할 수 있습니다. (이 임베딩 튜토리얼 예제를 직접 살펴보세요).
MNIST digits projection

로깅 옵션

임베딩은 여러 가지 형식으로 로깅할 수 있습니다:
  1. 단일 임베딩 컬럼: 종종 데이터가 이미 “행렬”과 유사한 형식일 수 있습니다. 이 경우 단일 임베딩 컬럼을 만들 수 있으며, 셀 값의 데이터 타입은 list[int], list[float], 또는 np.ndarray일 수 있습니다.
  2. 여러 개의 숫자 컬럼: 위의 두 예시에서처럼, 이 방식은 각 차원마다 하나의 컬럼을 만드는 접근 방식입니다. 현재 셀 값으로는 파이썬 int 또는 float 타입을 허용합니다.
단일 임베딩 컬럼
여러 개의 숫자 컬럼
또한 모든 테이블과 마찬가지로, 테이블을 구성하는 방법에 대해 다양한 옵션이 있습니다:
  1. wandb.Table(dataframe=df)를 사용하여 데이터프레임으로부터 직접 생성
  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 파라미터
t-SNE 파라미터
참고: 현재 세 가지 알고리즘 모두에 대해 행 1000개와 차원 50개로 이루어진 무작위 서브셋으로 다운샘플링합니다.