> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sifi.life/llms.txt
> Use this file to discover all available pages before exploring further.

# 단어 임베딩 혁명 (2003~2014)

> 이 문서는 **[GenAI 개념](/blog/guides/genai-concepts/overview)** 섹션의 일부입니다.

## 등장 배경 — "단어를 숫자로 표현하는 방법"의 진화

통계적 NLP의 가장 큰 한계는 단어를 **이산적 기호(discrete symbol)** 로 취급한 것입니다. "고양이"와 "강아지"는 의미적으로 가까운데, 컴퓨터에게는 완전히 다른 ID일 뿐이었습니다.

```
One-Hot Encoding (기존):
  고양이 = [1, 0, 0, 0, 0, ...]   ← 5만 차원
  강아지 = [0, 1, 0, 0, 0, ...]   ← 완전히 다른 벡터, 유사도 = 0

Distributed Representation (목표):
  고양이 = [0.2, 0.8, -0.1, 0.5]   ← 저차원, 의미 내포
  강아지 = [0.3, 0.7, -0.2, 0.6]   ← 유사한 벡터, 유사도 ≈ 0.95
```

## NNLM — Neural Network Language Model (Bengio, 2003)

Yoshua Bengio의 2003년 논문 "A Neural Probabilistic Language Model"은 **단어를 저차원 연속 벡터(임베딩)** 로 표현하는 아이디어를 최초로 실용화했습니다. NNLM의 핵심 기여와 한계를 요약합니다.

| 항목          | 내용                                    |
| ----------- | ------------------------------------- |
| **핵심 아이디어** | 단어마다 학습 가능한 벡터를 부여하고, 신경망으로 다음 단어를 예측 |
| **혁신**      | 비슷한 문맥에서 등장하는 단어는 비슷한 벡터를 갖게 됨        |
| **한계**      | 학습이 매우 느림 (대규모 데이터 처리 어려움)            |

## Word2Vec (Mikolov et al., Google, 2013)

NLP 역사상 가장 영향력 있는 논문 중 하나입니다. **단순한 얕은 신경망** 으로 고품질 단어 임베딩을 **매우 빠르게** 학습할 수 있음을 보여주었습니다.

### 두 가지 학습 방식

Word2Vec은 두 가지 서로 다른 방향의 예측 방식을 제공하며, 실무에서는 **Skip-gram** 이 더 널리 사용됩니다.

| 방식                                | 원리                 | 예시                     |
| --------------------------------- | ------------------ | ---------------------- |
| **CBOW**(Continuous Bag of Words) | 주변 단어들로 가운데 단어를 예측 | "오늘 \_\_\_ 좋다" → "날씨가" |
| **Skip-gram**                     | 가운데 단어로 주변 단어들을 예측 | "날씨가" → "오늘", "좋다"     |

### 놀라운 발견 — 벡터 산술

```
king - man + woman ≈ queen
Paris - France + Korea ≈ Seoul
```

단어 벡터 사이의 덧셈/뺄셈으로 **의미적 관계** 가 포착된다는 사실은 큰 충격이었습니다. 이는 임베딩이 단순한 연관성이 아닌, 추상적 의미 구조를 학습했다는 증거입니다.

### Distributional Hypothesis 심화

Word2Vec의 이론적 기반은 영국 언어학자 **J.R. Firth(1957)** 의 유명한 명제입니다:

> **"You shall know a word by the company it keeps."**
> (단어의 의미는 그 단어가 함께 등장하는 단어들에 의해 결정된다.)

이것이 **분포 가설(Distributional Hypothesis)** 입니다. 놀라운 점은 **인간도 정확히 이 방식으로 단어를 학습한다** 는 것입니다.

```
아이가 "멍멍이"라는 단어를 처음 들을 때:
  "멍멍이가 꼬리를 흔든다" → 동물?
  "멍멍이에게 밥을 줬다" → 먹는 존재?
  "멍멍이가 짖는다" → 소리를 내는 동물!

→ "멍멍이"의 의미를 정의를 읽어서가 아니라, 등장 문맥에서 추론
→ Word2Vec이 정확히 이 과정을 수학적으로 구현
```

분포 가설이 중요한 이유는, 단어의 의미를 인간이 수동으로 정의하지 않아도 **데이터에서 자동으로 추출** 할 수 있다는 가능성을 열었기 때문입니다. 이는 규칙 기반에서 데이터 기반으로의 전환을 이론적으로 뒷받침한 핵심 아이디어입니다.

### Word2Vec이 NLP를 바꾼 3가지 이유

Word2Vec은 단순히 "좋은 임베딩"을 만든 것이 아닙니다. NLP 연구의 **방법론 자체** 를 바꿨습니다.

**1) 전이 학습(Transfer Learning)의 시작**

Word2Vec 이전에는 모든 NLP 태스크를 처음부터(from scratch) 학습해야 했습니다. Word2Vec 이후에는 대규모 코퍼스로 사전학습한 임베딩을 다운로드하여 자신의 태스크에 재활용할 수 있게 되었습니다.

```
이전: 감성 분석 모델 → 자체 데이터로 단어 표현부터 학습 (데이터 수만 건 필요)
이후: Google의 사전학습 Word2Vec 다운로드 → 감성 분류 층만 학습 (데이터 수백 건으로도 가능)
```

이 "사전학습 → 재활용" 패턴이 이후 ELMo → BERT → GPT로 이어지는 **사전학습 시대의 원형** 입니다.

**2) 연산 효율성 — Negative Sampling**

Bengio의 NNLM(2003)은 어휘 전체(수만\~수십만 단어)에 대한 softmax를 계산해야 해서 매우 느렸습니다. Word2Vec은 **Negative Sampling** 기법으로 이를 해결했습니다.

```
전체 어휘에 대한 softmax:  60,000개 단어 모두 확률 계산 → 매우 느림
Negative Sampling:        정답 1개 + 무작위 오답 5~20개만 비교 → 1000배 이상 빠름
```

이 효율성 덕분에 Word2Vec은 **수십억 단어** 규모의 코퍼스에서도 학습이 가능했고, 이것이 고품질 임베딩의 핵심이었습니다.

**3) 벡터 산술이 보여준 "의미 공간"의 존재**

`king - man + woman ≈ queen`이라는 결과는 단순한 트릭이 아닙니다. 이것은 **단어들이 구조화된 의미 공간에 배치된다** 는 증거입니다. "남성→여성" 방향, "단수→복수" 방향, "현재→과거" 방향이 벡터 공간에 일관되게 존재합니다. 이 발견은 언어의 의미 구조를 기하학적으로 표현할 수 있다는 가능성을 보여주었습니다.

### 한국어 Word2Vec 실험

Word2Vec의 벡터 산술은 한국어 코퍼스에서도 작동합니다.

```
한국어 Word2Vec 벡터 산술 결과:
  서울 - 한국 + 일본 ≈ 도쿄       (수도 관계)
  삼성 - 한국 + 미국 ≈ 애플       (대표 기업 관계)
  아버지 - 남자 + 여자 ≈ 어머니    (성별 관계)
```

다만 한국어에는 고유한 도전이 있습니다. 한국어는 **교착어** 로, 어근에 다양한 조사와 어미가 붙습니다.

```
"먹다", "먹고", "먹었다", "먹을까" → Word2Vec은 모두 다른 단어로 취급!
→ 어휘 크기가 폭발적으로 증가 → 각 형태별 학습 데이터 부족
```

이 문제를 해결한 것이 **fastText**(Bojanowski et al., Facebook, 2017)입니다. fastText는 단어를 **문자 N-gram의 합** 으로 표현하여, 학습 시 보지 못한 형태소 변형도 처리할 수 있습니다.

```
fastText: "먹었다" = [먹, 먹었, 었다, 다] 의 벡터 합
→ "먹"이 공통으로 들어있으므로, "먹다"와 유사한 벡터 유지
→ 한국어처럼 형태 변화가 풍부한 언어에서 특히 유용
```

## GloVe (Pennington et al., Stanford, 2014)

**Global Vectors for Word Representation**. Word2Vec이 로컬 문맥(주변 N개 단어)만 보는 반면, GloVe는 **전체 코퍼스의 동시 출현 행렬(co-occurrence matrix)** 을 활용합니다. 두 접근법의 핵심 차이를 비교합니다.

| 비교    | Word2Vec           | GloVe               |
| ----- | ------------------ | ------------------- |
| 학습 방식 | 예측 기반 (predictive) | 통계 기반 (count-based) |
| 활용 정보 | 로컬 문맥 윈도우          | 전체 코퍼스 통계           |
| 속도    | 대규모 코퍼스에서 빠름       | 행렬 분해 한 번으로 학습      |
| 결과 품질 | 비슷한 수준             | 비슷한 수준              |

## 성과와 한계

단어 임베딩 시대는 NLP의 패러다임을 근본적으로 전환했지만, **문맥을 무시한다** 는 치명적 한계가 남아 있었습니다. 이 한계가 바로 다음 세대(ELMo, BERT)를 이끄는 원동력이 됩니다.

| 성과                                   | 한계                                              |
| ------------------------------------ | ----------------------------------------------- |
| 단어를 의미 있는 벡터로 표현 (NLP의 패러다임 전환)      | **다의어 처리 불가**: "배" → 과일? 선박? 신체 부위? 하나의 벡터만 가짐  |
| 전이 학습의 시작 — 사전학습된 임베딩을 다운스트림 태스크에 활용 | **문장/문서 수준 표현 부재**: 단어 벡터의 단순 평균은 의미를 정확히 담지 못함 |
| 후속 모든 NLP 연구의 기반이 됨                  | **문맥 무시**: 동일 단어는 어떤 문장에서든 같은 벡터                |

> **주의**
> **다의어 문제의 심각성**: "나는 배가 고프다" vs "나는 배를 타고 갔다" — Word2Vec에서 "배"는 두 문장 모두에서 동일한 벡터입니다. 이 문제를 해결한 것이 바로 **문맥 임베딩(Contextual Embedding)**, 즉 ELMo → BERT로 이어지는 흐름입니다.

## 서브워드 토큰화 — BPE (Byte Pair Encoding)

Word2Vec과 GloVe는 강력했지만, 한 가지 고질적인 문제가 남아 있었습니다: **OOV(Out-of-Vocabulary) 문제**. 학습 시 한 번도 보지 못한 단어는 처리할 수 없었습니다.

```
학습 데이터에 있는 단어:  happy, unhappy, happiness
학습 데이터에 없는 단어:  unhappiness → ??? (OOV — 벡터 없음!)

문제: 신조어, 전문 용어, 오타 등이 모두 처리 불가
```

### BPE의 핵심 원리 (Sennrich et al., 2016)

BPE는 **문자(character) 수준에서 시작** 하여, 가장 빈번한 문자 쌍을 **반복적으로 병합** 해 나가는 방식입니다.

```
1단계: 모든 단어를 문자로 분해
   "unhappiness" → [u, n, h, a, p, p, i, n, e, s, s]

2단계: 가장 빈번한 문자 쌍을 병합 (반복)
   (s, s) → ss    [u, n, h, a, p, p, i, n, e, ss]
   (p, p) → pp    [u, n, h, a, pp, i, n, e, ss]
   (h, a) → ha    [u, n, ha, pp, i, n, e, ss]
   (ha, pp) → happ [u, n, happ, i, n, e, ss]
   (n, e) → ne    [u, n, happ, i, ne, ss]
   (ne, ss) → ness [u, n, happ, i, ness]
   (happ, i) → happi [u, n, happi, ness]
   (u, n) → un    [un, happi, ness]

최종 결과: "unhappiness" → ["un", "happi", "ness"]
```

각 서브워드 조각("un", "happi", "ness")은 **의미를 가진 단위** 입니다. "un-"은 부정, "happi"는 행복, "-ness"는 명사화 접미사.

### 한국어에서의 BPE

```
"데이터브릭스" → ["데이터", "브", "릭", "스"]  또는  ["데이터", "브릭스"]
"데이터엔지니어" → ["데이터", "엔지니어"]  ← "데이터" 토큰 재활용!

영어 대비 한국어의 차이:
  "Databricks" → ["Data", "bricks"]       ← 2토큰
  "데이터브릭스" → ["데이터", "브", "릭", "스"] ← 4토큰 (토큰 효율성 낮음)
```

### BPE 변형과 현재

BPE의 기본 아이디어를 발전시킨 여러 변형 알고리즘이 등장했으며, 현재 주요 LLM에서 사용 중인 토큰화 방식은 다음과 같습니다.

| 알고리즘              | 개발사             | 특징                   | 사용 모델               |
| ----------------- | --------------- | -------------------- | ------------------- |
| **BPE**           | Sennrich et al. | 빈도 기반 병합             | GPT-2, GPT-3, GPT-4 |
| **WordPiece**     | Google          | 우도(likelihood) 기반 병합 | BERT, DistilBERT    |
| **SentencePiece** | Google          | 언어 독립적, 공백도 토큰화      | T5, Llama, ALBERT   |
| **Unigram**       | Kudo (2018)     | 확률적 서브워드 선택          | XLNet, mBART        |

> **성공**
> **현대 LLM과의 연결**: 오늘날 **모든 주요 LLM**(GPT-4, Claude, Llama, Gemini)은 BPE 또는 그 변형을 사용합니다. Word2Vec 시대의 "단어 단위" 처리에서 BPE의 "서브워드 단위" 처리로의 전환은, 단어 임베딩 시대와 Transformer 시대를 잇는 중요한 다리입니다. OOV 문제 해결 없이는 범용 언어 모델이 불가능했을 것입니다.
