[NLP] 워드 임베딩 (2) - FastText 원리와 사용방법 이해하기

728x90

fasttext

 

FastText는 Facebook AI Research(Facebook AI Research)에서 개발한 단어 임베딩(embedding) 모델이다.

 

Word2Vec의 후속 격인 이 모델은 기존의 한계를 개선하고 좀 더 높은 성능과 빠른 학습 속도를 제공하기 위해 만들어졌다.

이 글에서는 FastText의 주요 알고리즘과 Word2Vec과의 차이점, 그리고 그 개선된 부분에 대해 자세히 알아보고 언제 사용하는 것이 적합한지 설명하고자 한다.

 

FastText의 주요 알고리즘

FastText의 핵심 아이디어는 단어를 개별 단위로 보는 것이 아니라 여러 개의 문자 단위, 즉 n-gram으로 쪼개어 처리하는 것이다. Word2Vec 모델은 단어 자체를 벡터로 변환하기 때문에

학습 데이터에 없는 단어(즉, 미학습 단어)는 모델이 이해하지 못하는 한계를 가지고 있다.

 

반면에 FastText는 각 단어를 문자 단위의 조각으로 나누어 표현하기 때문에

미학습 단어(Out-of-Vocabulary, OOV) 문제를 어느 정도 해결할 수 있다.

 

두 임베딩 모델은 단어의 임베딩 벡터를 계산하는 방식이 조금 다르기에 이러한 차이가 나타난다.

 

 

FastText의 학습 과정은 다음과 같다.

  1. 각 단어를 n-gram으로 쪼갠다. 예를 들어, "apple"이라는 단어를 3-gram으로 쪼개면 "<ap", "app", "ppl", "ple", "le>"와 같이 문자 조각들로 나눌 수 있다. 이때 "<>"는 단어의 시작과 끝을 나타내는 특별한 표시다.
  2. 각 단어를 여러 개의 n-gram으로 표현한 후, 해당 n-gram들에 대한 벡터를 학습하여 이를 합산함으로써 단어의 최종 벡터 표현을 얻는다.
  3. 학습 데이터에 없는 단어도 문자 조각들이 이미 학습된 적이 있다면, 그 벡터를 조합하여 새로운 단어의 벡터를 생성할 수 있다.

FastText는 이러한 n-gram을 이용한 벡터화 방식 덕분에 단어의 형태학적 정보를 반영할 수 있고, 문법적으로 유사한 단어들에 대해 보다 나은 표현을 얻을 수 있다. 이러한 방식은 특히 복잡한 굴절을 가진 언어, 예를 들어 한국어나 독일어와 같은 언어에서 더 유리하다.

Word2Vec과의 차이점

FastText는 Word2Vec과 유사한 방식으로 학습되지만, 몇 가지 중요한 차이점이 존재한다.

  1. n-gram 단위 학습: Word2Vec은 각 단어를 하나의 벡터로만 표현하는 반면, FastText는 단어를 n-gram 문자 조각으로 나누어 학습한다. 이 덕분에 FastText는 형태학적 정보를 잘 반영할 수 있고, 학습되지 않은 단어에 대해서도 벡터를 생성할 수 있다. (한국어의 경우, 자모단위로 분리를 하는 방법도 존재한다. 자음과 모음으로 나눠서 학습을 해서 단어의 벡터 형태를 확률로 계산하는 것이다.)
  2. 미학습 단어 처리(OOV): Word2Vec은 미학습 단어에 대해서는 아예 정보를 제공하지 못한다. 그러나 FastText는 n-gram을 사용하여 미학습 단어도 유사한 패턴을 가진 벡터로 변환할 수 있기 때문에 더욱 유연하다.
  3. 모델 크기 및 학습 속도: FastText는 Word2Vec보다 다소 많은 메모리를 요구할 수 있지만, 학습된 모델이 제공하는 단어 표현이 더 정확하고 일반화 능력이 뛰어나다. 특히 단어 형태가 중요한 언어에서는 FastText가 더 좋은 성능을 보인다.

개선된 부분

FastText의 개선된 부분은 주로 형태학적 정보의 활용미학습 단어에 대한 처리 능력이다. Word2Vec은 단어 자체의 관계에 집중하지만, FastText는 단어 내부의 문자 단위 패턴까지 고려하므로 새로운 단어에 대해 더 나은 일반화된 표현을 제공할 수 있다. 또한, FastText는 희귀한 단어에 대한 벡터 표현이 더 풍부해져 언어적 다양성 처리가 더 원활해진다.

언제 FastText를 사용해야 하는가?

FastText는 다음과 같은 상황에서 사용하면 좋다.

  1. 언어의 형태학적 특성이 중요한 경우: 한국어, 독일어, 핀란드어와 같이 굴절어가 많이 쓰이는 언어의 경우 FastText의 n-gram 방식이 큰 도움이 된다. 단어의 다양한 형태를 효과적으로 처리할 수 있기 때문이다.
  2. 희귀한 단어가 자주 등장하는 경우: 특정 도메인에서는 희귀한 용어나 새롭게 생긴 단어들이 자주 등장할 수 있다. FastText는 문자 단위 정보(n-gram)를 활용하기 때문에 이러한 희귀 단어를 처리하는 데 적합하다.
  3. OOV 문제가 빈번한 경우: 학습 데이터에 포함되지 않은 새로운 단어가 테스트 데이터나 실제 환경에서 많이 등장한다면 FastText가 Word2Vec보다 더 좋은 성능을 낼 수 있다. OOV 문제에 대한 FastText의 유연한 처리가 큰 장점으로 작용한다.

결론적으로, FastText는 Word2Vec의 단점을 개선하여 더 풍부하고 유연한 단어 표현을 제공하는 모델이다. 단어 내부의 형태적 특성을 활용함으로써 OOV 문제를 줄이고, 여러 언어에 걸쳐 보다 높은 성능을 발휘할 수 있다.

 

특히 굴절어 및 희귀 단어 처리가 중요한 상황에서 FastText는 강력한 도구가 될 수 있다.

FastText 사용법: Step by Step

여기에서는 Python 환경에서 Gensim 라이브러리를 사용하여 FastText를 실제로 사용하는 방법을 단계별로 설명한다. FastText를 사용하기 위해서는 Gensim을 설치해야 한다.

1. Gensim 설치하기

먼저 Gensim 라이브러리를 설치한다. 터미널에서 다음 명령어를 실행하면 된다.

pip install gensim

2. FastText 모델 학습하기

이제 FastText 모델을 학습시키는 방법을 알아보자. 우선 데이터셋이 필요하며, 간단한 텍스트 파일을 사용하여 학습을 진행할 수 있다.

from gensim.models import FastText

# 학습 데이터를 준비한다 (문장 리스트)
sentences = [['apple', 'is', 'a', 'fruit'], ['banana', 'is', 'yellow'], ['apple', 'and', 'banana', 'are', 'fruits']]

# FastText 모델을 학습한다
model = FastText(sentences, vector_size=100, window=3, min_count=1, sg=1)
  • sentences: 학습에 사용할 문장 리스트를 제공한다. 각 문장은 단어 리스트 형태로 구성된다.
  • vector_size: 임베딩 벡터의 크기를 설정한다. 기본값은 100이다.
  • window: 한 단어 주변에 고려할 단어의 범위를 설정한다.
  • min_count: 최소 등장 횟수를 설정하여 이보다 적게 등장한 단어는 무시된다.
  • sg: 1일 경우 Skip-gram을, 0일 경우 CBOW를 사용한다.

3. 단어 벡터 확인하기

모델 학습이 완료되면 특정 단어의 벡터를 확인할 수 있다.

# 'apple' 단어의 벡터를 출력한다
print(model.wv['apple'])

이 코드는 'apple'이라는 단어의 벡터를 출력한다. FastText는 문자 n-gram을 사용하여 벡터를 생성하기 때문에 형태학적으로 유사한 단어에 대해 유사한 벡터를 얻을 수 있다.

4. 단어 유사도 계산하기

FastText 모델을 사용하여 두 단어 사이의 유사도를 계산할 수도 있다.

# 'apple'과 'banana' 사이의 유사도를 계산한다
similarity = model.wv.similarity('apple', 'banana')
print(f"Similarity between 'apple' and 'banana': {similarity}")

5. 유사한 단어 찾기

특정 단어와 유사한 단어들을 찾을 수도 있다.

# 'apple'과 유사한 단어 3개를 찾는다
similar_words = model.wv.most_similar('apple', topn=3)
print(similar_words)

이 코드에서는 'apple'과 가장 유사한 단어 3개를 출력한다. FastText는 형태학적 유사성을 고려하기 때문에 유사한 의미를 가지는 단어들을 효과적으로 찾아낼 수 있다.

6. 모델 저장 및 불러오기

학습된 모델을 저장하고 나중에 다시 사용할 수도 있다.

# 모델 저장
model.save('fasttext_model.model')

# 저장된 모델 불러오기
loaded_model = FastText.load('fasttext_model.model')

결론

FastText는 단어의 형태적 특성을 반영하여 보다 유연하고 강력한 단어 임베딩을 제공하는 모델이다.

이 글에서는 FastText의 개념과 Word2Vec과의 차이점, 주요 알고리즘, 그리고 사용하는 방법에 대해 알아보았다.

 

주로 단어 형태에 변수가 존재할 수 있는 경우에 유리한데, 한국어 데이터에서 오타가 다수 존재하는 경우,

word2vec 모델은 학습 데이터에 없다고 판단하기에 이를 적용할 수 없으나, FastText모델은 단어를 쪼개서 학습하기 때문에

이해할 수 있다. 이해하기 쉽게 아래와 같이 예를 들어 보겠다.

학습데이터로 입력된 단어와, 각 모델이 이를 인지하는 방식을 정리한다.

 

학습 단어 word2vec fasttext fasttext(자모단위)
사과 사과 사, 사과, 과 ㅅ,ㅏ,ㄱ,ㅗ,ㅏ
사고 사고 사, 사고, 고 ㅅ,ㅏ,ㄱ,ㅗ

 

이 때, (말은 안되지만..) 사과를 사고라고 오타로 입력한 경우, 사고라는 데이터의 단어를 쪼개서 판단한다.

따라서 해당 데이터가 입력 데이터에 없더라도 이를 인지하고 임베딩벡터를 생성할 수 있다.

728x90