이 글은 임베딩 실험 시리즈의 두 번째 글이다.
1편에서는 LLM이 단어와 문장의 의미를 벡터로 표현하고, 문장 간 의미 유사도를 수치로 비교하는 실험을 다루었다.
1편 바로가기: LLM이 단어/문장을 이해하는 방법 – 임베딩과 의미 유사도 실험(1)
이번에는 앞서 실험에 사용한 문장 또는 단어 임베딩을 2차원 공간에 시각화하여, 의미적으로 비슷한 문장/단어가 실제로 가까운 위치에 배치되는지 확인해보았다.
1) 사용 임베딩
paraphrase-multilingual-MiniLM-L12-v2 모델을 이용해 다음 5개 문장을 벡터화
2) 문장 목록
- 오늘은 날씨가 정말 좋다.
- 맑은 하늘이 기분을 상쾌하게 해준다.
- 고양이는 낮잠을 자고 있다.
- 나는 새로운 언어를 배우고 있다.
- 자동차가 도로를 달리고 있다.
3) 시각화 방식
- 벡터 차원: 384차원 → PCA로 2차원 축소
- 시각화 도구: matplotlib, sklearn.decomposition.PCA
4) PCA 시각화
- PCA 시각화 사용 코드
from sentence_transformers import SentenceTransformer
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import platform
# 한글 폰트 설정
if platform.system() == 'Windows':
plt.rc('font', family='Malgun Gothic')
elif platform.system() == 'Darwin':
plt.rc('font', family='AppleGothic')
else:
plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus'] = False
# 문장 목록
sentences = [
"오늘은 날씨가 정말 좋다.",
"맑은 하늘이 기분을 상쾌하게 해준다.",
"고양이는 낮잠을 자고 있다.",
"나는 새로운 언어를 배우고 있다.",
"자동차가 도로를 달리고 있다."
]
# 모델 및 임베딩
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
embeddings = model.encode(sentences)
# PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
reduced = pca.fit_transform(embeddings)
# 시각화
plt.figure(figsize=(8, 6))
for i, (x, y) in enumerate(reduced):
plt.scatter(x, y)
plt.text(x + 0.01, y + 0.01, sentences[i], fontsize=12)
plt.title("문장 임베딩 PCA 시각화")
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.grid(True)
plt.show()
- PCA 시각화 결과 및 해석
PCA를 통해 384차원의 문장 임베딩을 2차원으로 축소한 결과, 다음과 같은 공간적 분포가 나타났다:

- 문장 1 ("오늘은 날씨가 정말 좋다.")
- 문장 2 ("맑은 하늘이 기분을 상쾌하게 해준다.")
→ 두 문장은 PCA 공간에서 거의 겹쳐진 위치에 배치됨
→ 의미상 유사한 두 문장이 실제로 임베딩 공간에서도 가까운 위치에 있음을 시각적으로 확인 - 문장 3 ("고양이는 낮잠을 자고 있다.")
→ 좌하단에 고립된 위치에 존재
→ 주제가 완전히 다르며, 동물/행동 중심 문장이라는 점에서 다른 문장들과 구분됨 - 문장 4 ("나는 새로운 언어를 배우고 있다.")
→ 최상단에 단독 위치
→ 학습/자기계발이라는 고유한 의미로, 감정·날씨·관찰 문장들과는 구별됨 - 문장 5 ("자동차가 도로를 달리고 있다.")
→ 중앙 왼쪽에 위치
→ 고양이/낮잠 문장과 가까운 쪽에 있으나, 전체적으로는 독립적 위치
5) t-SNE 시각화
- t-SNE 시각화 사용 코드
from sklearn.manifold import TSNE
from sentence_transformers import SentenceTransformer
import matplotlib.pyplot as plt
import platform
# 한글 폰트 설정
if platform.system() == 'Windows':
plt.rc('font', family='Malgun Gothic')
elif platform.system() == 'Darwin':
plt.rc('font', family='AppleGothic')
else:
plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus'] = False
# 문장 리스트
sentences = [
"오늘은 날씨가 정말 좋다.",
"맑은 하늘이 기분을 상쾌하게 해준다.",
"고양이는 낮잠을 자고 있다.",
"나는 새로운 언어를 배우고 있다.",
"자동차가 도로를 달리고 있다."
]
# 임베딩
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
embeddings = model.encode(sentences)
# t-SNE (주의: 랜덤성 있음, perplexity는 샘플 수에 맞게 낮게)
tsne = TSNE(n_components=2, perplexity=3, random_state=42, n_iter=1000)
reduced = tsne.fit_transform(embeddings)
# 시각화
plt.figure(figsize=(8, 6))
colors = ['orange', 'blue', 'green', 'red', 'purple']
for i, (x, y) in enumerate(reduced):
plt.scatter(x, y, color=colors[i])
plt.text(x + 0.1, y + 0.1, sentences[i], fontsize=12)
plt.title("문장 임베딩 t-SNE 시각화")
plt.xlabel("t-SNE 1")
plt.ylabel("t-SNE 2")
plt.grid(True)
plt.show()
- t-SNE 시각화 결과 및 해석

t-SNE를 통해 문장 임베딩을 2차원으로 축소한 결과, 다음과 같은 의미 군집이 시각적으로 드러났다:
- 문장 1 ("오늘은 날씨가 정말 좋다.")
- 문장 2 ("맑은 하늘이 기분을 상쾌하게 해준다.")
→ 두 문장은 서로 가까운 하단 구역에 위치
→ 의미적으로 모두 날씨 및 감정과 관련되어 있으며, 의미 유사성을 기반으로 동일 클러스터 내에 배치됨 - 문장 3 ("고양이는 낮잠을 자고 있다.")
→ 상단에 고립된 위치
→ 동물 행동 묘사로, 다른 문장들과 의미적 관련성이 낮아 독립적인 위치에 존재 - 문장 4 ("나는 새로운 언어를 배우고 있다.")
→ 우측 하단에 단독 위치
→ 학습·지적 활동이라는 주제 특성상 고유한 의미 군집을 형성 - 문장 5 ("자동차가 도로를 달리고 있다.")
→ 중앙에 가까운 위치지만, 다른 문장들과는 충분한 거리 유지
→ '관찰된 행동'이라는 일반적 특징을 갖지만 주제 측면에서는 중립적인 의미
6) PCA vs t-SNE 시각화 비교 분석 요약
- PCA 결과 요약:
- 문장 1번과 2번이 같은 클러스터 내에서 매우 근접
- 나머지 문장들은 의미적으로 분리되긴 했으나, 간격이 완벽히 구분되지는 않음
- 전체 구조 파악에 유용하지만, 일부 문장 간 거리 차이는 다소 완만하게 표현됨
- t-SNE 결과 요약:
- 문장 1번(날씨 좋다)과 2번(기분 상쾌)만이 강하게 가까운 위치로 클러스터링
- 나머지 문장들은 의미적 독립성에 따라 명확히 멀어진 위치에 분산
- 특히 고양이, 자동차, 언어 학습 문장은 명확히 구분된 위치에 있어 분류 관점에서 더 직관적
- 표 비교
| 항목 | PCA (주성분 분석) | t-SNE (확률적 이웃 임베딩) |
| 목적 | 전역적인 분산 최대화 | 국소적인 거리 보존 (이웃 구조 유지) |
| 수학적 기반 | 선형 변환 (고차원 → 저차원 직선 축) | 비선형 확률 기반 거리 보존 |
| 해석 가능성 | 좌표축의 의미 명확 (PC1, PC2) | 좌표축의 의미 없음, 해석 불가능 |
| 속도 | 빠름 | 상대적으로 느림 |
| 결과 일관성 | 동일 데이터면 항상 동일 결과 | 매 실행마다 약간씩 달라짐 (랜덤성 존재) |
7) 종합 결론
- PCA는 전체적인 전역적 분포를 해석하거나 트렌드를 설명할 때 유리하며,
- t-SNE는 의미 유사성 기반의 문장 군집화 또는 분류 판단에 효과적이다.
- 따라서 데이터의 전체 구조를 해석할 목적이라면 PCA, 유사한 의미끼리 모이는 현상을 직관적으로 보여줄 목적이라면 t-SNE가 더 적합하다.
8) 분석 및 느낀 점
- PCA 시각화를 통해, 문장의 의미적 유사성이 벡터 간 거리로 표현되며 공간상에서도 군집을 형성한다는 점을 확인할 수 있었다.
- 특히 의미 유사한 문장(1번과 2번)은 인접하게 시각화되었고, 주제가 완전히 다른 문장들(3~5번)은 서로 멀리 위치함으로써 임베딩 공간이 구조화되어 있음을 입증함.
- 이 결과는 단순 수치 비교(Cosine 유사도)를 넘어, 직관적으로 임베딩 구조를 이해하는 데 매우 효과적이었다.
- t-SNE 시각화를 통해 "유사한 의미는 가까이, 다른 의미는 멀리"라는 임베딩 공간의 구조가 잘 드러났다.
- 날씨와 감정 관련 문장은 하나의 클러스터를 이루었고, 학습, 동물 행동, 이동 행동 등의 문장은 각각 다른 방향으로 뚜렷이 분리되었다.
- 이는 문장을 단순한 단어 나열이 아닌, 의미 단위의 벡터로 표현하는 임베딩의 핵심 원리를 시각적으로 증명한 결과이다.
'LLM' 카테고리의 다른 글
| LLM이 단어/문장을 이해하는 방법 : 임베딩과 의미 유사도 실험(1) (0) | 2025.05.27 |
|---|---|
| LLM 토크나이저 종류별 토큰 수 및 분해 특성 비교 (0) | 2025.05.13 |





