다시 이음

임베딩 (1) - Word embedding 본문

Pre_Onboarding by Wanted(자연어 처리)

임베딩 (1) - Word embedding

Taeho(Damon) 2022. 3. 8. 20:17

안녕하세요.

 

오늘은 word embedding 모델의 종류를 알아보려고 합니다.

 

임베딩은 자연어를 컴퓨터가 이해하고, 효율적으로 처리하기 위해서 컴퓨터가 이해할 수 있도록 자연어를 적절히 변환합니다.

 

1. Embedding 방법

 

1-1. Sparse Embedding

 

원-핫 인코딩 방법은 단어 인덱스만 1이고 나머지 인덱스에는 전부 0으로 표현되는 벡터 표현 방법이 있습니다.

이렇게 벡터 또는 행렬(matrix)의 값이 대부분이 0으로 표현되는 방법을 Sparse representation(희소 표현)이라고 합니다. 

 

단점

 

  • 포함된 단어의 개수 만큼 차원이 확장되기 때문에 고차원으로 형성 ==> 차원의저주(curse of dimensionality)
  • 벡터가 단어의 의미를 표현하지 못합니다.
  • 모든 단어의 유클리디안 거리가 동일합니다. (유사도를 알 수 없음)

 

1-2. Dense Embedding

 

단어 개수 만큼의 차원을 가지는 벡터를 생성하던 Sparse와 달리 Dense embedding은 사용자가 지정한 값으로 단어들의 차원을 맞춥니다.

300차원으로 임베딩을 설정
'커피' = [1.1, 3.1 , .... 12.3] = shape(1,300)

 

2. Word embedding

 

단어를 dense vector의 형태로 표현하는 방법을 워드 임베딩이라 합니다. dense vector를 워드 임베딩 과정을 통해 나온 결과라고 하며 임베딩 벡터(embedding vector)라고도 합니다.

 

2-1. Skip-gram

 

Skip-gram은 중심단어(target)을 사용하여 주변단어(context)를 찾아내는 방법론입니다.

 

window_size = (한 방향의) 주변 단어 개수를 사용자가 설정하여 사용합니다.

 

context의 수는 window_size의 2배(양방향)가 됩니다.

 

그러나 주변 단어의 순서 고려 하지 않기 때문에 거리개념 학습 안됩니다.

 

예시 ) ___ : context , 파란색 굵은 글씨 : target
window_size = 2 : 오늘 ___ ___ 만났다 , ___ 공주는 ___ ___  , ___ ___ 왕자를 ___   , 오늘 ___ ___ 만났다
window_size = 1 : 오늘 ___ 왕자를 만났다 , ___ 공주는 ___ 만났다 , 오늘___ 왕자를 ___ , 오늘 공주는 ___ 만났다

데이터 셋 예시

예시 ) 문장 : 오늘 공주는 왕자를 만났다
(target, context) 모양으로 데이터 셋이 구성됩니다.

window_size = 2 : 
(오늘, 공주는)
(오늘, 왕자를)
(공주는, 오늘)
(공주는, 왕자를)
(공주는, 만났다)
(왕자를, 오늘)
(왕자를, 공주는)
(왕자를, 만났다)
(만났다, 공주는)
(만났다, 왕자를)

 

 

학습 방법

input vector(one-hot vector) = 10000개 단어의 벡터 = |V|

embedding size = 300 = N

 

1. (Input Layer) context에서 기준 단어에 대한 one-hot vector를 만들어 input 에 넣습니다.

      input vector = (1,10000)

 

2. (Input Layer → Hidden Layer) Input에 input word matrix를 곱해, N차원 embedding vector를 얻습니다.
      input word matrix = (10000,300)

      embedding vector = (300,1)

 

3. (Hidden Layer → Output Layer) 2의 결과인 N차원 embedding vector에 2m개의 output word matrix를 곱해, 입력 차원과 같은 vector를 만듭니다. 

      weight = (300, 10000)
      output vector = (10000,1)

 

4. (Output Layer) 3에서 얻어진 vector를 균등한 확률로 표현하기 위해 softmax 함수를 취합니다. 
      output vector = (10000,1) 

 

5. (Loss) y hat을 각 문맥 단어들의 one-hot vector인 y와 오차 측정하고 오차값을 통해 업데이트 합니다.

 

 

2-2. CBOW(Continuous Bag-of-Words)

 

CBOW는 주변단어(context)을 사용하여 중심단어(target)를 찾아내는 방법론입니다.

 

Skip gram과 같이 주변 단어의 순서 고려 하지 않기 때문에 거리개념 학습 안됩니다.

 

입력값으로 context를 y값으로 target값을 사용합니다.

예시 ) ___ : Target , 파란색 굵은 글씨 : context
window_size = 2 : 
___ 공주는 왕자를 만났다, 오늘 ___ 왕자를 만났다 , 오늘 공주는 ___ 만났다  , 오늘 공주는 왕자를 ___

 

데이터셋 예시

 

예시 ) 문장 : 오늘 공주는 왕자를 만났다
(context, target) 형태로 구성됩니다.

window_size = 2 : 
(공주는, 오늘)
(왕자를, 오늘)
(오늘, 공주는)
(왕자를, 공주는)
(만났다, 공주는)
(오늘, 왕자를)
(공주는, 왕자를)
(만났다, 왕자를)
(공주는, 만났다)
(왕자를, 만났다)

 

학습 방법

1. (Input Layer) context에서 기준 단어를 제외한 문맥 단어 각각에 대한 one-hot vector를 만들어 input 에 넣습니다.

2. (Input Layer → Hidden Layer) Input에 input word matrix를 곱해, N차원 embedding vector를 얻습니다.

3. (Hidden Layer → Output Layer) 2의 결과인 N차원 embedding vector에 2m개의 output word matrix를 곱해, 입력 차원과 같은 vector를 만듭니다.

4. (Output Layer) 3에서 얻어진 vector를 균등한 확률로 표현하기 위해 softmax 함수를 취합니다.

5. (Loss) y hat을 각 문맥 단어들의 one-hot vector인 y와 오차 측정합니다.

 

 

2-3. Word2vec

 

간단한 신경 모델로 단어 embedding 학습하기 위해 고안되었습니다.

 

Skip-gram 단점인 가중치 크기가 크고, 데이터셋이 크고, 학습시간이 오래걸리는 것을 보완합니다.

 

skip-gram, CBOW 중 한가지 방법을 선택하여 사용할 수 있습니다.

 

해결책

 

-자주 등장하는 단어 제거

-Negative sampling : softmax에서 sigmoid로 변형하고 negative sampling(노이즈)를 추가 해서 복잡도 감소시킵니다.

 

원리

 

Embedding matrix 에서 input값을 가져오고 Context matrix에서 out값을 가져와서

두 값을 Dot product를 하고 sigmoid를 거쳐 오류값을 계산 후

이미 알고 있는 target과 비교하여 update하는 과정을 반복하여 거친후 embedding matrix를 word embedding으로 사용합니다.

 

2-4. GloVe

 

전체 통계 정보로 단어의 embedding을 만들어서 카운트 기반의 LSA(Latent Semantic Analysis)와 문서 전체 통계정보를 반영하지 못한 예측 기반 word2vec(Local context window 방식(skip-gram)) 보완하기 위해 카운트 기반과 예측 기반을 모두 사용하는 방법론입니다.

 

LSA(Latent Semantic Analysis)는 DTM이나 TF-IDF 행렬과 같이 각 문서에서의 각 단어의 빈도수를 카운트 한 행렬이라는 전체적인 통계 정보를 입력으로 받아 차원을 축소(Truncated SVD)하여 잠재된 의미를 끌어내는 방법론이었습니다.

 

LSA의 단점은 단어 의미의 유추 작업(Analogy task)에는 성능이 떨어집니다.

 

 

해결방법

 

윈도우 기반 동시 등장 행렬(Window based Co-occurrence Matrix)

 

 - 행과 열을 전체 단어 집합의 단어들로 구성하고, i 단어의 윈도우 크기(Window Size) 내에서 k 단어가 등장한 횟수를 i행 k열에 기재한 행렬

 

 

단어가 동시에 등장하는 빈도수를 계산한 행렬(word-word co-occurrence statistics)

 

- P(k|i) 특정 단어 i가 등장했을 때 주변 단어 k가 등장한 확률 계산

 - 중심 단어와 주변 단어 벡터 내적 == 동시 등장 확률

 

 

2-5. FastText

 

단어 embedding이 아니라 subword embedding을 만들어서 사용하는 방법입니다.

 

단어 → bag of character n-gram

 

각 단어는 글자 단위 n-gram의 구성으로 취급합니다. n을 몇으로 결정하는지에 따라서 단어들이 얼마나 분리되는지 결정합니다.

 

# apple , n = 3인 경우
<ap, app, ppl, ple, le>

n-gram을 통해 얻은 n-gram 구성을 벡터화합니다.

 

즉, 내부 단어들을 벡터화한다는 의미는 저 단어들에 대해서 Word2Vec을 수행한다는 의미입니다.

위와 같이 내부 단어들의 벡터값을 얻었다면, 단어 apple의 벡터값은 저 위 벡터값들의 총 합으로 구성합니다.

 


장점

 

  • 데이터 셋만 충분한다면 위와 같은 내부 단어(Subword)를 통해 모르는 단어(Out Of Vocabulary, OOV)에 대해서도 다른 단어와의 유사도를 계산합니다.
  • Word2Vec의 경우에는 등장 빈도 수가 적은 단어(rare word)에 대해서는 임베딩의 정확도가 높지 않다는 단점이 있었습니다. 참고할 수 있는 경우의 수가 적다보니 정확하게 임베딩이 되지 않는 경우입니다. 그러나 FastText의 경우, 만약 단어가 희귀 단어라도, 그 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면, Word2Vec과 비교하여 비교적 높은 임베딩 벡터값을 얻습니다.

 

2-6. sentencePiece

 

서브워드 토크나이징 알고리즘들을 내장한 센텐스피스(SentencePiece)는 일반적으로 실무에서 선택할 수 있는 최선의 선택 중 하나입니다.

 

사전 토큰화 작업(pretokenization)없이 전처리를 하지 않은 데이터(raw data)에 바로 단어 분리 토크나이저를 사용할 수 있습니다.

 

논문 : https://arxiv.org/pdf/1808.06226.pdf