임베딩은 숫자 목록으로 객체(사람, 이미지, 게시물, 단어 등…)를 표현하는 데 사용되며, 이를 _벡터_라고도 합니다. 머신 러닝 및 데이터 과학에서는 다양한 애플리케이션에서 여러 방식으로 임베딩을 생성할 수 있습니다. 이 페이지는 독자가 임베딩에 익숙하고 W&B 내에서 이를 시각적으로 분석하는 데 관심이 있다고 가정합니다.
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 대시보드에 데이터가 들어 있는 새 테이블이 생성됩니다. 오른쪽 상단의 패널 선택기에서 2D Projection을 선택하면 임베딩을 2차원으로 시각화할 수 있습니다. Smart default가 자동으로 선택되며, 톱니바퀴 아이콘을 클릭해 열 수 있는 설정 메뉴에서 쉽게 재정의할 수 있습니다. 이 예제에서는 사용 가능한 5개의 수치형 차원을 모두 자동으로 사용합니다.
위 예시는 임베딩을 로깅하는 기본적인 방식을 보여주지만, 일반적으로는 훨씬 더 많은 차원과 샘플을 다루게 됩니다. SciKit-Learn에서 제공되는 MNIST 숫자 데이터셋(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을 한 번만 클릭해도 거의 동일한 결과를 볼 수 있습니다. (이 임베딩 튜토리얼 예제를 직접 살펴보기).
임베딩은 여러 형식으로 로깅할 수 있습니다.
- 단일 임베딩 열: 데이터가 이미 “행렬”과 비슷한 형식인 경우가 많습니다. 이 경우 단일 임베딩 열을 만들 수 있으며, 셀 값의 데이터 유형은
list[int], list[float], 또는 np.ndarray일 수 있습니다.
- 여러 숫자 열: 위의 두 예제에서는 이 방식을 사용해 각 차원마다 열을 하나씩 만듭니다. 현재 셀 값으로는 Python
int 또는 float를 지원합니다.
또한 다른 모든 테이블과 마찬가지로, 테이블을 구성하는 방법에도 여러 옵션이 있습니다.
wandb.Table(dataframe=df)를 사용해 데이터프레임에서 직접 생성
wandb.Table(data=[...], columns=[...])를 사용해 데이터 목록에서 직접 생성
- 테이블을 행별로 점진적으로 작성 (코드에 루프가 있을 때 유용).
table.add_data(...)를 사용해 테이블에 행 추가
- 테이블에 임베딩 열 추가 (임베딩 형태의 예측 목록이 있을 때 유용):
table.add_col("col_name", ...)
- 계산된 열 추가 (테이블의 각 행에 적용할 함수나 모델이 있을 때 유용):
table.add_computed_columns(lambda row, ndx: {"embedding": model.predict(row)})
2D Projection을 선택한 후 톱니바퀴 아이콘을 클릭하면 렌더링 설정을 편집할 수 있습니다. 원하는 열을 선택하는 것(위 참조) 외에도 관심 있는 알고리즘과 원하는 매개변수를 선택할 수 있습니다. 아래에는 각각 UMAP과 t-SNE의 매개변수가 나와 있습니다.
참고: 현재 세 알고리즘 모두에 대해 1000개 행과 50개 차원의 무작위 부분집합으로 다운샘플링합니다.