250x250
Notice
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

serendipity

FastText , LSA 본문

Study/AI

FastText , LSA

z 2021. 7. 11. 22:29
728x90

3. FastText

Word2Vec에서 단어 대신 문자 단위(character) n-gram을 한 모델로, 페이스북에서 2017년에 개발했다.

 

모델 기본 구조)

Word2Vec과 대부분 내용이 동일하며, 사용하는 단위가 다르다는 차이점이 있다. ex, '티스토리'라는 단어를 n=3인 n-gram을 나타낼때, <티스,티스토,스토리,토리>,<티스토리>로 나타낸다. (<,>는 단어의 경계를 나타내주기 위해 FastText 모델이 사용하는 특수기호이다.)

 

단어 임베딩은 5개의 문자 단위 n-gram 벡터의 합으로 표현한다. 

U티스토리 = Z<티스 + Z티스토 + Z스토리 + Z토리> + Z<티스토리>

일반 수식으로 나타내면, Ut =  Σ zg (g ∈ Gt)  *Gt는 타깃 단어 t에 속한 문자 단위 n-gram 집합을 가리킨다.

 

FastText도 네거티브 샘플링 기법을 사용한다.
1. Positive sample에 대해서는 Positive sample 확률을 최대화해야 하며,
2. Negative sample에 대해서는 Negative sample 확률을 최대화해야 한다.

 

from gensim.models import FastText
from nltk.tokenize import word_tokenize, sent_tokenize

words = [word_tokenize(sentence) for sentence in text]
model = FastText(words, size=100, window=3, min_count=5, workers=4, sg=1)

 

FastText의 장점은 다음과 같다.

  1. FastText의 인공 신경망을 학습한 후 데이터셋의 모든 단어는 각 n-gram에 대해 워드 임베딩이 된다.  데이터셋만 충분하면 내부 단어를 통해 모르는 단어도 다른 단어와의 유사도를 계산해 벡터를 얻을 수 있다.
  2. 등장 빈도수가 적은 단어의 임베딩의 정확도가 낮은 Word2Vec과 달리 FastText는 희귀단어라도 그 단어의 n-gram이 다른 단어의 n-gram과 겹치면 Word2Vec보다 높은 임베딩 벡터값을 얻는다. 그래서 FastText는 노이즈(오타, 맞춤법이 틀린 단어)가 많은 코퍼스에서도 일정 수준의 성능을 보인다. (각 단어의 임베딩을 문자 단위 n-gram 벡터의 합으로 표현하기 때문에)
  3. 적은 양의 학습 데이터로도 높은 성능을 낼 수 있다.
  4. 동일한 의미를 갖는 어휘의 변화 패턴을 학습하기 쉽다.
  5. 조사나 어미가 발달한 한국어에 좋은 성냉을 낼 수 있다.

 


4. LSA, 잠재 의미 분석 (Latent Semantic Analysis)

단어-문서 행렬이나 TF-IDF행렬, 단어-문맥 행렬 같은 커다란 행렬에 차원 축소 방법의 일종인 특이값 분해를 수행하여 데이터의 차원 수를 줄여 계산 효율성을 키우고, 행간에 숨어 있는 잠재 의미를 이끌어내기 위한 방법론이다. (행렬 분해 기법으로 분류된다.) 단어-문서 행렬이나 단어-문맥 행렬 등에 특이값 분해를 시행한 뒤 결과로 도출되는 행 벡터들을 단어 임베딩으로 사용할 수 있다.


1) PPMI 행렬

단어-문서 행렬, TF-IDF행렬, 단어-문맥 행렬 , 점별 상호 정보량인 PMI 모두 잠재 의미 분석을 수행할 수 있다. 전에 언급했던 PMI란 두 확률 변수 사이의 상관성을 계량화한 지표다. 자연어 처리 분야에서는 이를 두 단어의 등장이 독립을 가정했을 때 대비 얼마나 자주 같이 등장하는 지를 수치화한 것으로 이해할 수 있다.

PMI

 

수식에서, 로그 안 우변의 분자가 분모보다 작을 경우 PMI는 음수가 된다. A,B 두 단어가 동시에 등장할 확률이 두 단어가 독립일 떄보다 작을 때 발생한다. 하지만 이런 수치는 우리가 가진 말뭉치의 크기가 충분하지 않는 한 신뢰하기 어렵다. 보통 말뭉치에서 단어 하나의 등장 확률은 0.001 이하로 작은 편이다. 이때문에 자연어 처리 분야에서는 PMI 대신 양의 점별 상호 정보량이란 지표를 사용한다.

" PMI가 양수가 아닐 경우 그 값을 신뢰하기 어려워 0으로 치환해 무시한다는 뜻이다. "

PPMI

 

2) 행렬분해

기존의 DTM이나 DTM에 단어의 중요도에 따른 가중치를 주었던 TF-IDF 행렬은 단어의 의미를 전혀 고려하지 못한다는 단점을 갖고 있었습니다. LSA는 기본적으로 DTM이나 TF-IDF 행렬에 절단된 SVD(truncated SVD)를 사용하여 차원을 축소시키고, 단어들의 잠재적인 의미를 끌어낸다.

 

특이값 분해 (Singular Value Decomposition)는 m X n 크기의 임의의 사각행렬 A를 다음과 같이 직교 행렬들과 대각 행렬로 분해한다.  U와 V는 각각 AA^T와 A^TA를 고유값 분해하여 얻어진 행렬이며, Σ의 대각성분을 특이값이다.

 

[ A=U Σ VT ]

A: m×n rectangular matrix
U: m×m orthogonal matrix
Σ: m×n diagonal matrix
V: n×n orthogonal matrix

 

특이값 분해 (SVD)

 

truncated SVD는 특이값 가운데 가장 큰 d개만 가지고, 해당 특이값에 대응하는 특이 벡터들로 원래 행렬 A를 근사하는 기법이다. 

 

truncated SVD

 

from sklearn.decomposition import TruncatedSVD
from sonlpy.vectorizer import sent_to_word_contexts_matrix

corpus = [sent.replace('\n','').strip() for sent in open(file, 'r').readlines()]
input_matrix, index2voca = sent_to_word_contexts_matrix(corpus, windows=3, min_tf=10, dynamic_weight=True, verbose=True)

svd = TruncatedSVD(n_components=100)
vectors = svd.fit_transform(input_matrix)

 

LSA는 쉽고 빠르게 구현이 가능할 뿐만 아니라 단어의 잠재적인 의미를 이끌어낼 수 있어 문서의 유사도 계산 등에서 좋은 성능을 보여준다는 장점을 갖고 있다. 하지만 SVD의 특성상 이미 계산된 LSA에 새로운 데이터를 추가하여 계산하려고하면 보통 처음부터 다시 계산해야 하는데 다시 말해, 새로운 정보에 대해 업데이트가 어렵다는 것이다. 이는 최근 LSA 대신 Word2Vec 등 단어의 의미를 벡터화할 수 있는 또 다른 방법론인 인공 신경망 기반의 방법론이 각광받는 이유이기도 하다.

 

728x90

'Study > AI' 카테고리의 다른 글

Doc2Vec , LDA  (0) 2021.07.12
GloVe , Swivel  (0) 2021.07.11
NPLM , Word2Vec  (0) 2021.07.11
지도 & 비지도 학습  (0) 2021.07.10
NLP 벡터  (0) 2021.07.10
Comments