벡터 임베딩 - 비정형 데이터를 수치로 표현하는 방법

2025. 8. 4. 15:03·CS 기초부터 한 걸음씩

들어가며: 컴퓨터는 어떻게 '의미'를 이해할까?

당신이 "강아지"라는 단어를 들었을 때 머릿속에는 무엇이 떠오르는가? 털이 복슬복슬한 모습, 꼬리를 흔드는 모습, 충성스러운 성격 등 수많은 연상들이 떠오를 것이다. 하지만 컴퓨터에게 "강아지"는 그저 7바이트의 문자열일 뿐이다.

컴퓨터가 인간처럼 단어의 '의미'를 이해하고 처리하려면 어떻게 해야 할까? 여기서 **벡터 임베딩(Vector Embedding)**이라는 기술이 등장한다. 벡터 임베딩은 단순히 데이터를 숫자로 바꾸는 것이 아니라, 데이터가 가진 본질적인 의미와 관계를 수학적으로 표현하는 방법이다.

벡터 임베딩의 핵심 원리: 의미의 수학적 표현

임베딩의 정의와 본질

벡터 임베딩이란 비정형 데이터(텍스트, 이미지, 오디오 등)를 고정된 크기의 실수 벡터로 변환하는 과정이다. 여기서 핵심은 단순한 변환이 아니라 의미적 관계의 보존에 있다.

예를 들어, 다음과 같은 4차원 벡터로 단어들을 표현한다고 가정해보자:

  • "왕" → [0.9, -0.8, 0.9, 0.3]
  • "여왕" → [0.9, 0.8, 0.9, 0.2]
  • "남자" → [0.1, -0.8, 0.1, 0.4]
  • "여자" → [0.1, 0.8, 0.1, 0.3]

각 차원의 의미:

  • 1차원(첫 번째 값): 권력/지위의 정도 (높을수록 권력이 큼)
  • 2차원(두 번째 값): 성별 특성 (양수면 여성적, 음수면 남성적)
  • 3차원(세 번째 값): 사회적 지위 (높을수록 높은 지위)
  • 4차원(네 번째 값): 기타 속성들

이때 벡터 공간에서 다음과 같은 관계가 성립한다:

vector("왕") - vector("남자") ≈ vector("여왕") - vector("여자")
[0.9, -0.8, 0.9, 0.3] - [0.1, -0.8, 0.1, 0.4] ≈ [0.9, 0.8, 0.9, 0.2] - [0.1, 0.8, 0.1, 0.3]
[0.8, 0.0, 0.8, -0.1] ≈ [0.8, 0.0, 0.8, -0.1]

즉, "왕-남자"의 관계와 "여왕-여자"의 관계가 벡터 연산으로 동일하게 표현된다.

=> "남자가 왕이 되는 관계"와 "여자가 여왕이 되는 관계"가 본질적으로 동일한 변화

이는 우연이 아니라 벡터 임베딩이 단어 간의 의미적 관계를 벡터 공간의 기하학적 관계로 보존하기 때문이다.

임베딩이 관계를 보존하는 수학적 메커니즘

벡터 임베딩이 관계를 보존하는 핵심은 고차원 공간에서의 기하학적 구조에 있다. 의미적으로 유사한 단어들은 벡터 공간에서 가까운 거리에 위치하게 되며, 이는 다음과 같은 수학적 특성을 만족한다:

1. 유사성 보존 (Similarity Preservation) 의미적으로 유사한 단어들의 벡터는 높은 코사인 유사도를 가진다:

cos(θ) = (A · B) / (|A| × |B|)

2. 관계 보존 (Relation Preservation) 단어 간의 의미적 관계가 벡터 간의 차이로 표현된다. 비슷한 관계에 있는 단어 쌍들은 유사한 벡터 차이를 보인다.

3. 클러스터링 특성 (Clustering Property) 동일한 카테고리의 단어들이 벡터 공간에서 클러스터를 형성한다.

One-Hot Encoding의 한계: 왜 새로운 방법이 필요한가?

One-Hot Encoding의 작동 방식

전통적으로 텍스트를 숫자로 변환하는 가장 직관적인 방법은 One-Hot Encoding이었다. 이 방식은 전체 어휘집(vocabulary)의 크기만큼의 차원을 가진 벡터에서 해당 단어의 위치만 1로, 나머지는 0으로 표현한다.

예시: 어휘집 ["강아지", "고양이", "새", "물고기"]

  • "강아지" → [1, 0, 0, 0]
  • "고양이" → [0, 1, 0, 0]
  • "새" → [0, 0, 1, 0]
  • "물고기" → [0, 0, 0, 1]

차원의 저주 (Curse of Dimensionality)

One-Hot Encoding은 차원의 저주라는 심각한 문제를 야기한다. 새로운 카테고리가 추가될 때마다 새로운 이진 열이 생성된다. 수백 개의 도시나 제품명과 같은 고유값이 많은 특성을 다룰 때, 이 방식은 수십만 개의 차원을 가진 벡터를 생성한다.

구체적인 문제점들:

1. 메모리 효율성 문제

  • 영어 위키피디아의 어휘 수는 약 500만 개
  • 각 단어를 500만 차원의 One-Hot 벡터로 표현
  • 단일 문서도 기가바이트 단위의 메모리 필요

2. 계산 복잡도 증가

  • 벡터 간 유사도 계산: O(V) (V: 어휘집 크기)
  • 500만 차원에서의 내적 연산은 현실적으로 비효율적

3. 거리 측정의 무의미화 고차원에서는 모든 벡터 간 거리가 비슷해지는 현상이 발생한다. 이로 인해 KNN과 같은 거리 기반 알고리즘의 성능이 저하된다.

희소성 (Sparsity) 문제

One-Hot Encoding은 희소한 데이터를 생성한다. 대부분의 관측값이 One-Hot 인코딩된 열의 대부분에서 0의 값을 가지게 된다. One-Hot 벡터의 99.9999%가 0으로 채워져 있어, 실제 정보 밀도가 극도로 낮다.

희소성이 야기하는 문제:

  • 저장 공간의 낭비: 대부분이 0인 벡터를 저장하는 비효율성
  • 연산의 비효율성: 0과의 연산이 대부분이지만 여전히 계산 필요
  • 학습의 어려움: 실제 신호가 노이즈에 묻혀버림

의미적 관계 표현의 불가능성

One-Hot Encoding의 가장 치명적인 한계는 단어 간의 의미적 관계를 전혀 표현할 수 없다는 점이다.

# One-Hot 벡터들의 코사인 유사도는 모두 0
cos_similarity("강아지", "개") = 0
cos_similarity("강아지", "우주선") = 0
cos_similarity("사랑", "증오") = 0

모든 One-Hot 벡터는 서로 직교(orthogonal)하므로, 의미적으로 매우 유사한 "강아지"와 "개"도 완전히 무관한 것으로 표현된다.

분포 가설 (Distributional Hypothesis): 임베딩의 이론적 기반

벡터 임베딩의 이론적 근거는 분포 가설에서 출발한다. 분포 시소러스 구축의 핵심 아이디어는 분포 가설(Firth, 1957)이다: "함께 등장하는 단어들을 통해 그 단어를 알 수 있다."

J.R. Firth의 분포 가설

1957년 언어학자 J.R. Firth가 제시한 분포 가설은 다음과 같다:

"You shall know a word by the company it keeps" (단어는 함께 나타나는 단어들로 알 수 있다)

이는 단순한 격언이 아니라 언어의 본질적 특성에 대한 깊은 통찰이다.

분포 가설의 언어학적 근거

1. 문맥적 의미 결정 (Contextual Meaning Determination)

단어의 의미는 절대적이지 않고 문맥에 따라 결정된다. 예를 들어:

  • "은행에서 돈을 찾았다" → 금융기관
  • "강둑에서 은행을 따라 걸었다" → 물가

하지만 대량의 텍스트에서 통계적으로 보면, 각 의미별로 함께 등장하는 단어들의 패턴이 일관성을 보인다.

2. 의미 필드 이론 (Semantic Field Theory)

언어학에서 의미 필드 이론에 따르면, 의미적으로 관련된 단어들은 유사한 언어적 환경에서 사용된다:

  • 동물 관련: {강아지, 고양이, 새} → "키우다", "먹이다", "산책"
  • 음식 관련: {밥, 빵, 국수} → "먹다", "맛있다", "요리"

분포 가설의 수학적 구현

분포 가설에 따르면, "의미를 포착하는 것"과 "문맥을 포착하는 것"은 본질적으로 동일하다. 따라서 우리가 해야 할 일은 단어 문맥에 대한 정보를 단어 표현에 넣는 것이다.

분포 가설을 수학적으로 구현하는 핵심 아이디어:

1. 문맥 벡터 (Context Vector)

단어 w의 문맥 = {w가 등장하는 주변 단어들의 집합}

2. 동시 출현 행렬 (Co-occurrence Matrix)

M[i][j] = 단어 i와 단어 j가 함께 등장한 횟수

3. 차원 축소 (Dimensionality Reduction)

고차원 희소 행렬 → 저차원 밀집 벡터

임베딩 벡터의 기하학적 특성

벡터 공간에서의 의미 표현

임베딩 벡터가 의미를 표현하는 방식은 기하학적 직관과 밀접하게 연결되어 있다.

1. 거리와 유사도

  • 유사한 의미의 단어들은 가까운 거리에 위치
  • 벡터 간 거리 ∝ 의미적 차이

2. 방향과 관계

  • 벡터의 방향이 의미적 속성을 나타냄
  • 벡터 간의 차이가 의미적 관계를 표현

3. 클러스터와 카테고리

  • 동일 카테고리의 단어들이 클러스터 형성
  • 클러스터 간 거리가 카테고리 간 관련성을 반영

실제 예시: 단어 관계의 벡터 표현

성별 관계

vector("king") - vector("queen") ≈ vector("man") - vector("woman")

수도 관계

vector("Paris") - vector("France") ≈ vector("Tokyo") - vector("Japan")

시제 관계

vector("walking") - vector("walked") ≈ vector("swimming") - vector("swam")

이러한 관계들이 성립하는 이유는 언어 사용의 패턴이 일관성을 가지기 때문이다.

임베딩의 학습 과정: 어떻게 의미를 학습하는가?

자기지도학습 (Self-Supervised Learning)의 원리

임베딩 학습의 핵심은 자기지도학습이다. 별도의 라벨 없이 텍스트 자체에서 학습 신호를 추출한다.

학습 목표 함수

목표: P(context | target_word) 최대화
또는: P(target_word | context) 최대화

문맥 예측을 통한 의미 학습

임베딩 학습에는 크게 두 가지 접근 방식이 있다:

Skip-gram 방식 (개념적 소개)

  • 중심 단어로부터 주변 단어를 예측
  • "The quick [brown] fox jumps"에서 "brown"으로부터 "quick", "fox" 예측
  • 자세한 메커니즘은 다음 포스트에서 심화 학습

CBOW 방식 (개념적 소개)

  • 주변 단어들로부터 중심 단어를 예측
  • "The", "quick", "fox", "jumps"로부터 "brown" 예측
  • 자세한 메커니즘은 다음 포스트에서 심화 학습

학습을 통한 의미 공간 형성

학습 과정에서 다음과 같은 현상이 발생한다:

  1. 의미적으로 유사한 단어들의 수렴
    • 비슷한 문맥에서 등장하는 단어들의 벡터가 유사해짐
  2. 의미적 관계의 선형화
    • 단어 간의 관계가 벡터 연산으로 표현 가능해짐
  3. 다층적 의미 구조의 형성
    • 동의어, 하이퍼님, 메로님 등 다양한 의미 관계가 기하학적으로 표현됨

임베딩의 실제 활용과 효과

자연어처리에서의 개선

1. 검색 시스템의 개선

# 기존: 정확한 키워드 매칭만 가능
query = "자동차"
results = find_exact_match("자동차")  # "차", "승용차" 등은 검색 안됨

# 임베딩 기반: 의미적 유사도 검색 가능
query_vector = embed("자동차")
results = find_similar_vectors(query_vector)  # "차", "승용차", "SUV" 등도 검색됨

2. 추천 시스템의 개선

  • 사용자가 "액션 영화"를 좋아하면 "스릴러", "모험" 장르도 추천 가능
  • 단어 수준의 매칭을 넘어선 의미적 추천

3. 번역 시스템의 품질 향상

  • 직역을 넘어선 의미 기반 번역
  • 문맥에 따른 적절한 번역어 선택

다양한 도메인으로의 확장

이미지 임베딩

  • 이미지를 벡터로 표현하여 유사 이미지 검색
  • "강아지 사진"과 시각적으로 유사한 다른 동물 사진 검색

음성 임베딩

  • 음성 신호를 벡터로 표현하여 화자 인식, 감정 분석
  • 음성의 운율, 톤 등 미묘한 특성까지 벡터로 표현

그래프 임베딩

  • 소셜 네트워크의 노드와 엣지를 벡터로 표현
  • 사용자 간의 관계, 커뮤니티 구조를 벡터 공간에서 분석

현재 임베딩의 한계와 개선 방향

편향성 (Bias) 문제

임베딩은 학습 데이터의 편향을 그대로 학습한다:

vector("doctor") - vector("man") ≈ vector("nurse") - vector("woman")

이는 사회적 편견이 벡터 공간에 반영된 것으로, 공정성 측면에서 심각한 문제가 될 수 있다.

다의성 (Polysemy) 처리의 어려움

하나의 단어가 여러 의미를 가질 때, 단일 벡터로는 모든 의미를 표현하기 어렵다:

  • "bank"의 금융기관 의미와 강둑 의미가 하나의 벡터에 혼재

맥락 의존성 (Context Dependency)

정적 임베딩은 문맥에 따른 의미 변화를 반영하지 못한다:

  • "Apple is a technology company"
  • "I ate an apple"

동일한 "apple" 벡터가 사용되어 문맥별 의미 차이를 표현하지 못한다.

마무리

벡터 임베딩은 인간의 언어와 의미를 수학적으로 모델링하는 중요한 방법이다. 이 기술은 다음과 같은 변화를 가능하게 했다:

  1. 의미의 계산 가능성: 추상적인 의미를 구체적인 수치 연산으로 처리
  2. 관계의 대수적 표현: 복잡한 의미 관계를 벡터 연산으로 해결
  3. 다중 모달리티 통합: 텍스트, 이미지, 음성 등을 동일한 벡터 공간에서 처리

다음 포스트에서는 이러한 벡터 임베딩의 아이디어를 구체적인 알고리즘으로 구현한 word2vec에 대해 자세히 살펴볼 예정이다. 

벡터 임베딩은 현재 ChatGPT, Claude와 같은 대화형 AI의 기반이 되는 핵심 기술이다.

'CS 기초부터 한 걸음씩' 카테고리의 다른 글

[Android] Activity와 Activity Lifecycle 기초 개념  (5) 2025.08.18
word2vec 이란? - 분포 가설부터 학습 알고리즘까지  (4) 2025.08.04
함수형 프로그래밍 6편 - 함수형 사고 방식과 문제 해결 전략  (1) 2025.07.23
함수형 프로그래밍 5편 - 지연 계산과 함수형 최적화 전략  (4) 2025.07.23
함수형 프로그래밍 4편 - 고차 함수와 클로저, 캡처와 순수성  (1) 2025.07.23
'CS 기초부터 한 걸음씩' 카테고리의 다른 글
  • [Android] Activity와 Activity Lifecycle 기초 개념
  • word2vec 이란? - 분포 가설부터 학습 알고리즘까지
  • 함수형 프로그래밍 6편 - 함수형 사고 방식과 문제 해결 전략
  • 함수형 프로그래밍 5편 - 지연 계산과 함수형 최적화 전략
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    시뮬레이션
    프로그래머스
    코테
    백준
    Kotlin
    Level3
    문법정리
    greedy
    알고리즘고득점kit
    java
    boostcamp
    Level2
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
벡터 임베딩 - 비정형 데이터를 수치로 표현하는 방법
상단으로

티스토리툴바