-
자연어 처리(NLP) 임베딩 기법 중, Facebook(Meta) AI Research에서 개발하여 Word2Vec의 치명적인 단점을 해결한 FastText에 대해 깊이 있게 알아보겠습니다.
- Word2Vec의 한계 (모 아니면 도): Word2Vec은 단어를 하나의 '최소 단위'로 봅니다. 예를 들어, 학습 데이터에 "apple"은 있지만 "apples"가 없다면, Word2Vec에게 "apples"는 듣도 보도 못한 외계어(OOV, Out of Vocabulary)가 됩니다. 이 경우 벡터 값을 아예 만들 수 없거나 무작위로 할당해야 하죠.
- FastText의 해법 (쪼개면 보인다): FastText는 단어를 더 잘게 쪼갠 'Subword(부분 단어)' 단위를 도입했습니다. 단어를 문자 단위의 n-gram으로 나누어 학습하기 때문에, 설령 "apples"라는 단어를 처음 보더라도 그 안에 포함된 "apple", "app", "ple" 같은 조각(Subword)들의 정보를 조합해 의미를 유추해냅니다.

Character N-gram
FastText가 OOV 문제를 해결하는 구체적인 메커니즘은 Character n-gram입니다.
예를 들어, 단어 apple을 $n=3$으로 설정하여 FastText가 어떻게 인식하는지 살펴봅시다. FastText는 단어의 시작과 끝을 알리는 <와 >를 붙여서 분해합니다.
- 3-grams: <ap, app, ppl, ple, le>
- Special Sequence: <apple> (단어 전체)
FastText는 위에서 쪼개진 5개의 조각과 단어 전체, 총 6개 각각에 대해 임베딩 벡터를 할당하고 학습합니다. 최종적으로 apple이라는 단어의 벡터는 이 모든 n-gram 벡터들의 합으로 표현됩니다.
$$v_{apple} = \sum_{g \in \mathcal{G}_{apple}} z_g$$(여기서 $\mathcal{G}_{apple}$은 apple의 모든 n-gram 집합, $z_g$는 각 n-gram의 벡터입니다.)
🔍 FastText의 Subword 분해 로직: 왜 이렇게 쪼갤까?
FastText가 단어를 쪼개는 방식에는 '의미의 최소 단위'를 찾아내기 위한 정교한 규칙이 숨어 있습니다.
1. 양 끝에 <와 >를 붙이는 이유 (Boundary Markers)
가장 먼저 하는 작업은 단어 앞뒤에 화살표 기호를 붙여 <apple>로 만드는 것입니다.
- 접두사와 접미사의 구분: 단어의 시작과 끝을 명시함으로써, 단어의 중간에 나온 철자 뭉치와 단어의 앞/뒤에 붙은 철자 뭉치를 다르게 인식하기 위함입니다.
- 예시: at이라는 단어가 있다고 가정해 봅시다.
- <at>: 독립적인 단어 "at" (전치사 등)
- at: "cat", "chat" 등에 포함된 단순한 철자 결합
- FastText는 <at>와 at를 서로 다른 벡터로 취급하여, 단어의 위치에 따른 의미 차이(접두사/접미사/어근)를 학습합니다.
2. 슬라이딩 윈도우(Sliding Window) 방식 ($n=3$)
이제 <apple>이라는 7글자 문자열 위로 3칸짜리 창문(Window)이 지나간다고 상상해 보세요. 한 칸씩 옆으로 이동하며 글자를 수집합니다.
단계 창문 범위 (Index) 추출된 n-gram 설명 1단계 [0, 1, 2] <ap 단어의 시작을 포함한 3글자 2단계 [1, 2, 3] app 3단계 [2, 3, 4] ppl 4단계 [3, 4, 5] ple 5단계 [4, 5, 6] le> 단어의 끝을 포함한 3글자 이 과정을 통해 총 5개의 3-gram 조각이 생성됩니다.
3. 여기에 '전체 단어'를 하나 더 추가합니다.
FastText는 쪼개진 조각들만 학습하는 게 아닙니다. 원래 단어에 양 끝 표시를 한 <apple> 자체도 하나의 특별한 토큰으로 취급하여 벡터를 만듭니다.
- 결과적으로 apple은 [ <ap, app, ppl, ple, le>, <apple> ] 이라는 6개 요소의 집합이 됩니다.
왜 FastText가 더 강력한가?
학습된 조각들을 조합하는 방식 덕분에 FastText는 다음과 같은 강력한 특징을 가집니다.
형태학적 유사성 파악 (Morphological Richness)
단어의 뿌리를 이해합니다. "apple"과 "apples"는 다른 단어지만, 내부의 app, ppl, ple 같은 조각을 상당 부분 공유합니다.
- 효과: 모델은 "이 두 단어는 비슷한 조각을 가졌으니 의미도 비슷하겠구나!"라고 스스로 유추합니다.
OOV 및 희소 단어에 대한 강인함
데이터에 한 번도 나오지 않은 단어나 아주 드물게 나오는 단어도 조각을 통해 처리합니다.
- OOV 대응: "반려동물"과 "산책"을 학습했다면, 처음 본 **"반려동물과산책"**도 기존 조각들의 벡터를 합쳐 그 의미를 정확히 유추합니다.
- 희귀 단어: 단어 자체가 드물어도, 그 안의 조각들이 다른 흔한 단어들과 공유되기에 임베딩 품질이 훨씬 높습니다.
오타 및 신조어 대응 (Robustness)
사용자의 실수나 유행어에도 유연하게 대처합니다.
- 오타: appel이라고 잘못 적어도 app, ppl 같은 조각들이 살아있어 원래 의미인 apple에 가깝게 해석합니다.
- 신조어: 새로운 합성어가 나와도 내부 조각의 조합으로 대략적인 의미 파악이 가능합니다.
한국어(교착어) 환경에서의 압도적인 성능
한국어는 어근에 조사가 붙는 교착어이기 때문에 FastText가 특히 강력합니다.
- 유연한 변형: "먹다", "먹고", "먹으니", "먹어서"를 Word2Vec은 모두 남남으로 보지만, FastText는 **"먹"**이라는 핵심 조각을 통해 이들의 연관성을 꿰뚫어 봅니다.
- 심화 학습: 만약 '초성-중성-종성' 단위(자소 단위)로 쪼개서 학습하면, 한국어 특유의 오타나 신조어 대응 성능이 극대화됩니다.
'AI' 카테고리의 다른 글
순환 신경망(RNN)의 개념 (0) 2026.02.22 통계적 언어 모델(SLM)과 N-gram (0) 2026.02.22 Word2Vec: Negative Sampling (0) 2026.02.21 단어의 의미를 벡터로, Word2Vec (0) 2026.02.21 텍스트 벡터화(Text Vectorization) (0) 2026.02.20