Ⅰ. 기존 방식의 한계와 FastText의 등장 배경
Word2Vec과 GloVe는 뛰어난 단어 임베딩 모델이지만, 이미지에서 지적하듯 명확한 한계점을 가지고 있었습니다.
- 단어 단위(Word-level) 학습: 이 모델들은 단어를 더 이상 쪼갤 수 없는 최소 단위, 즉 하나의 '통'으로 취급합니다. 이로 인해 두 가지 큰 문제가 발생합니다.
- 내부 형태(Morphology) 무시: 'dark', 'darker', 'darkest'는 모두 'dark'라는 어근(root)을 공유하며 의미적으로 매우 유사합니다. 하지만 Word2Vec과 GloVe는 이 단어들을 전혀 별개의 단어로 취급하여 각각 독립적으로 벡터를 학습합니다. 이처럼 단어의 내부 구조(접두사, 어근, 접미사 등)에 담긴 풍부한 정보를 활용하지 못합니다. 이는 특히 한국어처럼 교착어(조사, 어미 등이 발달한 언어)에서 더욱 불리합니다.
- OOV (Out-of-Vocabulary) 문제: 학습 데이터에 등장하지 않은 단어에 대해서는 벡터를 생성할 수 없습니다. 'embedding'을 학습했지만 'embeddings'가 등장하면 OOV가 되어 처리할 수 없는 문제가 발생합니다.
이러한 문제들을 해결하기 위해 2016년 페이스북 AI 연구팀(FAIR)에서 FastText를 제안했습니다.
Ⅱ. FastText의 핵심 아이디어: Subword 확장 💡
FastText의 가장 중요한 혁신은 단어를 더 작은 단위인 문자 n-gram(character n-gram)의 집합으로 간주하는 것입니다.
- Subword 분해: 각 단어를 문자 n-gram들로 분해합니다. 보통 n은 3에서 6 사이의 값을 사용합니다.
- 예를 들어, n=3일 때 where라는 단어는 3글자씩 쪼갠 whe, her, ere로 나뉩니다.
- 여기에 추가로, 단어의 시작과 끝을 알리는 특별한 기호 <와 >를 추가하여 <wh, ere>, 그리고 원래 단어 자체인 <where>도 부분 단어(subword) 집합에 포함시킵니다.
- 최종적으로 where의 subword 집합 $G_{where}$는 {<wh, whe, her, ere, re>, <where>} 가 됩니다.
- 단어 벡터는 Subword 벡터의 합: FastText는 단어 자체가 아니라, 이 모든 subword 각각에 대해 벡터를 학습합니다. 그리고 최종 단어 'where'의 벡터는 이 subword 벡터들의 총합으로 계산됩니다.
- : subword 에 해당하는 벡터 (이것이 실제 학습되는 파라미터)
- : 단어 'where'의 최종 임베딩 벡터
Subword 방식의 강력한 장점
- OOV 문제 해결: 학습 데이터에 없던 'embeddings'라는 단어가 등장해도, 이를 emb, mbe, bed, ddi, ... 등의 subword로 분해할 수 있습니다. 이 subword들은 학습 데이터의 다른 단어들('embedding', 'embedded' 등)을 통해 이미 학습되었을 가능성이 높으므로, 이들의 벡터 합을 통해 처음 보는 단어에 대해서도 그럴듯한 벡터를 생성할 수 있습니다.
- 형태론적 정보 반영: 'darker'는 <darker>와 dark, ark, rke, ker 등의 subword를 가집니다. 'darkest' 역시 <darkest>와 dark, ark, kes, est 등의 subword를 가집니다. 두 단어는 dark, ark 등 많은 subword 벡터를 공유하게 되므로, 최종 단어 벡터도 자연스럽게 매우 유사한 값을 갖게 됩니다. 이로써 단어의 형태적 유사성이 벡터 공간에 효과적으로 반영됩니다.
Ⅲ. FastText의 학습 방식: Skip-gram + Subword
FastText는 Word2Vec의 Skip-gram with Negative Sampling 모델을 기본 구조로 사용합니다. 하지만 중심 단어(center word)를 다루는 방식에서 결정적인 차이가 있습니다.
- 기본 구조: Skip-gram (중심 단어가 주어졌을 때, 주변 단어를 예측)
- Word2Vec과의 차이점:
- 주변 단어 (Context Word, ): Word2Vec과 동일하게 단어 전체에 대한 벡터를 사용합니다.
- 중심 단어 (Center Word, ): Word2Vec처럼 단어 하나의 벡터를 사용하는 것이 아니라, 중심 단어를 구성하는 모든 subword 벡터들의 합을 사용합니다.
이를 통해 스코어 함수(score function) $s(w, c)$가 정의됩니다. 이 함수는 중심 단어 와 주변 단어 가 함께 등장할 확률을 나타내며, 이 값이 최대화되도록 학습합니다.
- : 중심 단어 의 subword 집합
- : subword 의 벡터
- : 주변 단어 의 벡터
학습 목표: 실제 주변 단어(Positive sample)에 대해서는 스코어()를 최대화하고, 랜덤으로 뽑은 가짜 주변 단어(Negative samples)에 대해서는 스코어를 최소화하는 방향으로 subword 벡터()와 주변 단어 벡터()를 업데이트합니다.
최종 요약 및 시험 대비 🎯
- 등장 배경: Word2Vec/GloVe는 단어를 통으로 학습하여 형태론적 정보를 무시하고 OOV 문제에 취약하다.
- 핵심 아이디어: 단어를 문자 n-gram(subword)의 집합으로 본다. 최종 단어 벡터는 subword 벡터들의 합이다.
- 장점:
- Subword 정보를 활용해 OOV 단어에 대한 벡터 추정이 가능하다.
- 어근, 접사 등 형태론적 유사성을 벡터에 자연스럽게 반영할 수 있다.
- 학습 방식: Word2Vec의 Skip-gram 구조를 기반으로 하되, 중심 단어의 벡터를 해당 단어의 subword 벡터들의 합으로 대체하여 학습한다.
이 네 가지 포인트를 정확히 이해하면 FastText 관련 문제는 모두 해결할 수 있습니다. FastText는 "단어를 쪼개서 본다"는 간단하지만 강력한 아이디어로 기존 모델의 한계를 극복한 모델이라는 점을 기억하는 것이 핵심입니다.
Ⅰ. FastText 모델의 장점 (Advantages) ✨
FastText의 장점은 모두 **Subword(문자 n-gram)**라는 핵심 아이디어에서 비롯됩니다.
- OOV (Out-of-Vocabulary) 단어 처리 가능: 이게 FastText의 가장 큰 강점이죠.
- 원리: 학습 데이터에 없던 새로운 단어가 나타나도, 그 단어를 subword로 분해합니다. 이 subword들은 학습 데이터의 다른 단어들에서 이미 학습되었을 가능성이 높기 때문에, 이들의 벡터를 조합하여 처음 보는 단어의 벡터를 추정할 수 있습니다.
- 예시: electrofishing이라는 단어를 학습한 적이 없더라도, ele, lec, ctr, tro 등의 subword는 electric, electrolux 같은 단어들을 통해 이미 학습되었습니다. 따라서 electrofishing의 벡터를 성공적으로 만들어낼 수 있습니다. 이와 반대로 Word2Vec/GloVe는 OOV 단어가 나오면 그냥 무시하거나 임의의 값(거의 0에 가까운 벡터)으로 처리할 수밖에 없습니다.
- 형태소/어근 정보 반영: 단어의 내부 구조를 이해합니다.
- 원리: helpful과 helpless는 help라는 공통 어근을 가집니다. FastText는 이 두 단어를 subword로 분해할 때 hel, elp 등의 공통된 n-gram을 발견하고, 이 n-gram들이 공유하는 벡터 때문에 두 단어의 최종 벡터가 유사한 공간에 위치하게 됩니다. 이로써 단어의 형태론적 유사성이 벡터에 자연스럽게 반영됩니다.
- 효과: 특히 한국어(먹다, 먹고, 먹으니)나 독일어처럼 단어의 변형(inflection)이 많은 언어에서 매우 효과적입니다.
- 희귀 단어 표현 개선: 데이터에 몇 번 등장하지 않는 희귀 단어(rare word)도 상대적으로 더 잘 표현합니다.
- 원리: Word2Vec/GloVe는 등장 빈도가 너무 낮은 단어는 정보가 부족하여 품질 좋은 벡터를 학습하기 어렵습니다. 하지만 FastText는 희귀 단어라도 그 단어를 구성하는 subword가 다른 흔한 단어에도 포함되어 있다면, 그 subword들의 벡터 정보를 빌려와(borrow) 더 안정적이고 품질 좋은 벡터를 만들어낼 수 있습니다.
Ⅱ. FastText 모델의 단점 (Disadvantages) 🐢
혁신적인 만큼 감수해야 할 비용도 존재합니다.
- 정적 임베딩 (Static Embedding): 이 한계는 GloVe와 동일합니다. FastText 역시 단어의 문맥에 따른 의미 변화를 포착하지 못합니다. "사과(apple)를 먹었다"의 '사과'와 "스티브 잡스의 애플(Apple)"의 '애플'은 subword 기반으로 계산된 동일한 하나의 벡터로 표현됩니다.
- 모델 크기 증가: 학습해야 할 벡터의 수가 훨씬 많습니다.
- 원인: Word2Vec/GloVe는 단어 사전에 있는 단어의 개수만큼만 벡터를 저장하면 됩니다. 하지만 FastText는 단어 사전의 모든 단어 벡터는 물론, 학습 과정에서 발견된 모든 subword(n-gram)에 대한 벡터까지 전부 저장해야 합니다. 이로 인해 모델의 파일 크기가 훨씬 커져 저장 공간을 많이 차지합니다.
- 학습 속도 느림: 계산 과정이 더 복잡합니다.
- 원인: Word2Vec은 학습 시 단어 벡터 하나만 조회(lookup)하면 됩니다. 하지만 FastText는 학습할 단어가 나올 때마다 매번 그 단어를 subword로 분해하고, 데이터베이스에서 모든 subword 벡터를 찾아낸 뒤, 이들을 모두 더하는 추가적인 연산이 필요합니다. 이 과정 때문에 전체적인 학습 속도가 Word2Vec보다 느려질 수밖에 없습니다.
Ⅲ. 코드 예제 분석 💻
제시된 코드는 gensim 라이브러리를 사용하여 FastText 모델을 학습하고 활용하는 예제입니다.
from gensim.models import FastText
# 1. 모델 학습
# result: 토큰화된 문장들의 리스트 (e.g., [['fasttext', 'is', 'good'], ['word2vec', 'is', 'also', 'good']])
# size=100: 임베딩 벡터의 차원을 100으로 설정
# window=5: 중심 단어 기준, 앞뒤로 고려할 단어의 개수(문맥의 크기)
# min_count=5: 전체 데이터에서 5번 미만으로 등장하는 단어는 무시
# workers=4: 학습에 사용할 CPU 쓰레드 수
# sg=1: 학습 방식을 Skip-gram으로 설정 (0이면 CBOW)
model = FastText(result, size=100, window=5, min_count=5, workers=4, sg=1)
# 2. 모델 활용: 유사 단어 찾기
# 'electrofishing'과 가장 유사한 단어들을 벡터 공간에서 찾아 출력
model.wv.most_similar('electrofishing')
# [결과 분석]
# ('electrolux', ...), ('electrolyte', ...), ('electro', ...), ('electric', ...)
# -> 'electrofishing'이라는 단어를 학습한 적이 없어도, 'electro-' 라는 subword 정보를 활용하여
# 전기/전자와 관련된 단어들을 성공적으로 찾아낸 것을 볼 수 있습니다.
# ('overfishing', ...)
# -> '-fishing' 이라는 subword 정보를 활용하여 'overfishing'과의 유사성도 포착했습니다.
핵심 파라미터 해설:
- size: 만들어질 벡터의 차원 수.
- window: 한 번에 학습에 사용할 문맥의 크기.
- min_count: 너무 희귀한 단어는 노이즈일 수 있으므로 학습에서 제외하는 기준. FastText는 subword 덕분에 min_count를 1로 설정해도 Word2Vec보다 안정적인 학습이 가능합니다.
- sg: 1이면 Skip-gram, 0이면 CBOW. 일반적으로 Skip-gram이 성능이 더 좋다고 알려져 있습니다.
이 코드는 FastText가 어떻게 OOV 단어인 electrofishing에 대해서도 그 의미(전기 + 낚시)를 성공적으로 유추해내는지를 명확히 보여주는 훌륭한 예시입니다.
📚 단어 임베딩 모델 최종 요약 (Word2Vec, GloVe, FastText)
1. 시작점: Word2Vec의 성공과 명확한 한계
- Word2Vec (예측 기반): 신경망을 이용해 주변 단어를 예측하는 방식(Skip-gram)이나 주변 단어로 중심 단어를 예측하는 방식(CBOW)을 통해 단어의 의미를 벡터 공간에 담아내는 데 성공했습니다. 특히 단어 간의 선형 관계('king' - 'man' + 'woman' ≈ 'queen')를 잘 학습하는 능력으로 큰 주목을 받았습니다.
- 한계점 1: 전역 통계 정보 부족
- Word2Vec은 지정된 윈도우(window) 크기 내의 지역적(local) 문맥 정보만 학습에 반영합니다. 이 때문에 코퍼스 전체에서 나타나는 단어 동시 등장 패턴, 즉 전역적(global) 통계 정보를 놓치는 단점이 있었습니다.
- ➡️ 해결사: GloVe 등장!
- 한계점 2: 단어 단위 처리의 문제 (OOV 및 희귀 단어)
- Word2Vec은 단어를 '통'으로 보기 때문에, 학습 사전에 없는 단어(OOV)나 등장 빈도가 매우 낮은 희귀 단어에 대한 벡터를 제대로 학습하거나 생성할 수 없었습니다.
- ➡️ 해결사: FastText 등장!
2. 대안 ① GloVe: 전역적 통계의 힘을 보여주다
- GloVe의 핵심 철학: "단어의 의미는 단순 빈도가 아니라, 전체 코퍼스에서의 동시 출현 확률의 비율(Ratio)로 드러난다."
- 방법론: LSA와 같이 코퍼스 전체의 **동시 등장 행렬(Co-occurrence Matrix)**을 먼저 계산하여 전역 통계 정보를 확보합니다. 그 후, "두 단어 벡터의 내적이 동시 등장 빈도의 로그값과 같아지도록"() 학습하여 Word2Vec의 장점인 단어 간 선형 관계 학습 능력까지 통합했습니다.
- 결론: 전역 정보를 활용하여 Word2Vec보다 단어 유추(Analogy) 등에서 더 높은 성능과 빠른 학습 속도를 달성했습니다.
3. 대안 ② FastText: 단어를 쪼개어 의미를 찾다
- FastText의 핵심 철학: "단어의 의미는 그 단어를 구성하는 내부 subword(문자 n-gram) 벡터들의 합으로 표현할 수 있다."
- 방법론: Word2Vec의 Skip-gram 모델을 기반으로 하되, 단어를 통째로 사용하지 않고 문자 n-gram으로 분해합니다. 예를 들어 apple은 app, ppl, ple 등의 부분 벡터들의 합으로 표현됩니다.
- 결론: Subword 정보를 활용하여 OOV 문제를 해결하고, 단어의 형태론적 특징을 반영하여 희귀 단어에 대해서도 품질 좋은 벡터를 생성해냈습니다.
4. 그리고 남은 숙제: 정적 임베딩의 한계
- 공통된 한계점: Word2Vec, GloVe, FastText 모두 정적 임베딩(Static Embedding) 방식입니다. 즉, 문맥에 상관없이 한 단어는 언제나 단 하나의 고정된 벡터 값을 갖습니다.
- 예: "사과(Apple) 주식을 샀다"와 "사과(apple)를 먹었다"에서 '사과'는 완전히 다른 의미지만, 이 모델들은 두 '사과'를 똑같은 벡터로 취급합니다.
- 다음 세대로의 진화: 이 한계를 극복하기 위해 등장한 것이 바로 문맥에 따라 단어의 의미가 바뀌는 동적 임베딩, 즉 Contextualized Embeddings입니다.
- 이 계열의 대표적인 모델이 바로 ELMo, BERT, GPT 등이며, 현대 자연어 처리의 주류를 이루고 있습니다. 이 모델들은 문장 전체를 입력으로 받아 특정 위치에 있는 단어의 의미를 문맥에 맞게 동적으로 계산해냅니다.
이 흐름을 완벽히 이해하시면 각 모델이 어떤 문제를 해결하기 위해 어떤 아이디어를 제시했는지 명확하게 파악하여 시험에 완벽하게 대비할 수 있을 것입니다.
'코딩공부 > 자연어처리' 카테고리의 다른 글
| 내가 시험공부하려고 만든 자연어처리-유도 바이어스(Inductive Bias,RNN,Transformer) (0) | 2025.10.09 |
|---|---|
| 내가 시험공부하려고 만든 자연어처리-동적임베딩의 필요성 (0) | 2025.10.09 |
| 시험공부를 하려고 만든 자연어처리 정리-GloVe (1) | 2025.10.09 |
| 시험공부를 하려고 만든 자연어처리 정리-단어임베딩 (word2vec) (1) | 2025.10.08 |
| 시험공부를 하려고 만든 자연어처리 정리-단어임베딩 (신경망) (0) | 2025.10.08 |