FastText 는 구글에서 만든 Word2Vec의 단점을 보완하기 위해 페이스북이 제안한 모델입니다.
Word2Vec의 치명적인 단점은 학습되지 않은 모르는 단어에 대해서는 단어 벡터값을 계산할 수 없다는 것입니다. 또한, 빈도 수가 적은 단어에 대해서도 학습이 불안한 특징이 있습니다.
이러한 한계점을 극복해낸 모델이 바로 FastText입니다.
FastText의 핵심은 내부 단어(Subword)를 사용해 워드 임베딩을 진행한다는 점입니다.
FastText에서는 character n-gram을 통해 representation을 학습하고, n-gram vector의 합으로 하나의 단어를 표현합니다.
FastText 내에서 n-gram의 개념은 간단합니다. 한 단어를 몇 글자씩 나눠서 학습할 지를 정하는 메커니즘으로 볼 수 있습니다.
예를 들어 ‘cookie’ 라는 단어를 3-gram으로 구성할 경우, 단어의 시작과 끝에 <,> 기호를 추가해 주고 세 글자씩 끊어서 다음과 같이 표현합니다.
cookie → <cookie> → <co, coo, ook, oki, kie, ie>
끝에 <, > 를 붙여주는 것은 CNN 의 convolution layer에서 padding 의 역할과 유사하다고 이해하면 좋습니다. 끝에 위치한 글자가 덜 학습되는 것을 방지하기 위함입니다.
실제 FastText가 단어를 학습할 때에는 3 ~ 6 grams 를 모두 이용합니다. 마지막으로, 길이와 상관없이 단어 전체를 special unit 으로 추가합니다.
cookie → <co, coo, ook, oki, kie, ie>
<coo, cook, ooki, okie, kie>
...
<cookie>
단어의 벡터는 내부 단어 벡터의 합으로 표현합니다.
v(cookie) = v(<co) + v(coo) + ... v(<cooki) + v(cookie) v(ookie>)+ v(<cookie>)
이러한 내부 단어 학습은 OOV에 대한 대응과 오탈자가 있는 단어에 대한 대응을 수월하게 해줍니다.
1. OOV(Out of Vocabulary)에 대한 대응
OOV는 Out of Vocabulary의 준말로서, 모르는 단어, 즉 학습된 적이 없는 단어를 의미합니다.
OOV에 대한 대응의 예시로, FastText에서 firstlove(첫사랑)이라는 단어를 학습하지 않은 상태라고 했을 때, 다른 단어에서 first와 love라는 내부 단어가 있다면 firstlove의 벡터를 얻을 수 있습니다. 반면, Word2Vec은 firstlove가 학습되지 않은, 처음 보는 단어이기 때문에 벡터를 얻을 수 없습니다.
2. Infrequent word 에 대한 대응
Word2Vec은 빈도 수가 적은 단어(infrequent word)에 대해서는 임베딩의 정확도가 높지 않다는 단점이 있었습니다. 하지만 FastText의 경우, 만약 단어가 희귀 단어라도, 그 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면, Word2Vec과 비교하여 비교적 높은 임베딩 벡터값을 얻습니다.
실제로 많은 데이터에는 오탈자가 존재합니다. 그리고 오탈자가 섞인 단어는 등장 빈도수가 매우 적으므로 일종의 Infrequent word가 됩니다. 즉, Word2Vec에서는 오타가 섞인 단어는 임베딩이 제대로 되지 않지만 FastText는 이에 대해서도 일정 수준 이상의 성능을 보입니다.
위의 예시를 그대로 가져와 보겠습니다. 만약 cookie의 typo인 cookkie를 마주했을 때, FastText는 내부 단어 학습에서 두 개의 subword만 다르고 나머지 대부분의 subword가 공통으로 존재하기 때문에 유사한 단어로 인식할 수 있게 되는 것입니다.
cookie → <co, coo, ook, oki, kie, ie>
cookkie → <co, cou, ook, okk, kki, kie, ie>