딥러닝/NLP

한국어 임베딩 - 단어 수준 임베딩 (Word2Vec, FastText)

eunsour 2022. 10. 20.
반응형

1.  Word2Vec

 Word2Vec은 2013년 구글 연구 팀이 발표한 기법으로 가장 널리 쓰이고 있는 단어 임베딩 모델이다. Word2Vec 기법은 두 개의 논문으로 나누어 발표됐다. Mikolov et al. (2013a)에서는 Skip-GramCBOW라는 모델이 제안됐고, Mikolov et al. (2013b)은 이 두 모델을 근간으로 하되 네거티브 샘플링 등 학습 최적화 기법을 제안하였다. 

 

1.1 모델 기본 구조

 Mikolov et al. (2013a)이 제안한 CBOW와 Skip-gram 모델의 기본 구조는 다음 그림과 같다. 

 

 

 CBOW는 주변에 있는 문맥 단어(context word)들을 가지고 타깃 단어(target word) 하나를 맞추는 과정에서 학습된다. Skip-gram 모델은 타깃 단어를 가지고 주변 문맥 단어가 무엇일지 예측하는 과정에서 학습된다. 

 

 위 그림을 보면 CBOW의 경우 입력, 출력 학습 데이터 쌍이 {문맥 단어 4개, 타깃 단어} 하나인 반면, Skip-gram의 학습 데이터는 {타깃 단어, 타깃 직전 두 번째 단어}, {타깃 단어, 타깃 직전 단어}, {타깃 단어, 타깃 다음 단어}, {타깃 단어, 타깃 다음 두 번째 단어} 이렇게 4개 쌍이 된다. Skip-gram이 같은 말뭉치로도 더 많은 학습 데이터를 확보할 수 있어 임베딩 품질이 CBOW보다 좋은 경향이 있다.

 

 

1.2 학습 데이터 구축

 Word2Vec에서 Skip-gram 모델의 학습 데이터를 구축하는 과정(Mikolov et al., 2013b)을 살펴본다. 

 

한국어 위키백과에 언급된 빨래

 

 Skip-gram 모델의 학습 데이터를 구축하는 과정은 다음 그림과 같다. 

 

Skip-gram 모델의 학습 데이터 구축

 

 위 그림에서 포지티브 샘플(positive sample)이란 타깃 단어(𝓽)와 그 주변에 실제로 등장한 문맥 단어(𝓬) 쌍을 가리킨다. 네거티브 샘플(negative sample)은 타깃 단어와 그 주변에 등장하지 않은 단어(말뭉치 전체에서 랜덤 추출) 쌍을 의미한다. 윈도우는 2로 설정했다. 포지티브 샘플을 만들 때 타깃 단어 앞뒤 두 개씩만 고려한다는 뜻이다. 

 

 Skip-gram 모델은 전체 말뭉치를 단어별로 슬라이딩해 가면서 학습 데이터를 만든다. 이다음 학습 데이터를 만들 때는 [를]이라는 단어가 타깃 단어(𝓽)가 되고 [빨래]문맥 단어(𝓬)가 된다. Skip-gram 모델은 같은 말뭉치를 두고도 엄청나게 많은 학습 데이터 쌍을 만들어낼 수 있다. 

 

 Skip-gram 모델이 처음 제안된 Mikolov et al. (2013a)에서는 타깃 단어가 주어졌을 때 문맥 단어가 무엇일지 맞추는 과정에서 학습됐다. 하지만 이 방식은 softmax 때문에 계산량이 비교적 큰 편이다. 타깃 단어를 입력받아 문맥 단어를 직접 출력하는 모델을 학습하려면, 정답 문맥 단어가 나타날 확률은 높이고 나머지 단어들 확률은 그에 맞게 낮춰야 한다. 그런데 어휘 집합에 속한 단어 수는 보통 수십만 개나 된다. 이를 모두 계산하려면 비효율적이다. 

 

 Mikolov et al. (2013b)에서 제안한 Skip-gram 모델은 타깃 단어문맥 단어 쌍이 주어졌을 때 해당 쌍이 포지티브 샘플(+)인지, 네거티브 샘플(-)인지 이진 분류하는 과정에서 학습된다. 이렇게 학습하는 기법을 네거티브 샘플링이라고 한다. 

 

 네거티브 샘플링 방식으로 학습하게 되면 1개의 포지티브 샘플𝓴 개의 네거티브 샘플만 계산(=정확히는 매 스텝마다 차원 수가 2인 시그모이드를 𝓴 + 1회 계산)하면 되기 때문에 모델을 1 스텝에 전체 단어를 모두 계산(=정확히는 매 스텝마다 어휘 집합 크기만큼의 차원 수를 가진 소프트맥스를 1회 계산) 해야 하는 기존 방법보다 계산량이 훨씬 적다. 

 

 위 그림은 𝓴 를 2로 설정한 예시다. 이 경우 모델은 하나의 스텝에서 1개의 포지티브 샘플2개의 네거티브 샘플, 즉 3개만 학습하면 된다. 첫 번째 스텝에서는 [빨래-에서] 포지티브 샘플 1개와 [빨래-책상], [빨래-커피] 네거티브 샘플 2개가 학습된다. Mikolov et al. (2013b)에 따르면 작은 데이터에는 𝓴 를 5 ~ 20, 큰 말뭉치에는 𝓴 를 2 ~ 5로 하는 것이 성능이 좋았다고 한다.

 

Mikolov et al. (2013b)은 네거티브 샘플을 말뭉치에 자주 등장하지 않는 희귀한 단어가 네거티브 샘플로 조금 더 잘 뽑힐 수 있도록 설계했다. 네거티브 샘플 확률은 다음 수식과 같다. 수식에서 𝓤(𝔀𝓲)란 해당 단어의 유니그램 확률(해당 단어 빈도/전체 단어 수)을 의미한다.

 

네거티브 샘플 확률

 

 예컨대 우리가 가진 말뭉치에 있는 단어가 [용][미르] 둘 뿐이고 그 구성 비율은 각각 0.99, 0.01이라고 하자. 그렇다면 용과 미르가 네거티브로 뽑힐 확률은 각각 다음 수식과 같다. 원래대로라면 용은 0.99의 확률로 네거티브 샘플이 됐겠지만 0.97로 살짝 낮아졌다. 대신에 미르는 0.01에서 0.03으로 살짝 높아졌다.

 

용과 미르가 네거티브 샘플로 뽑힐 확률

 

 

 Mikolov et al. (2013b)은 이와 별개로 자주 등장하는 단어는 학습에서 제외하는 서브샘플링(subsampling)이라는 기법도 적용했다. Skip-gram 모델은 말뭉치로부터 엄청나게 많은 학습 데이터 쌍을 만들어낼 수 있기 때문에 고빈도 단어의 경우 등장 횟수만큼 모두 학습시키는 것이 비효율적이라고 본 것이다. 서브샘플링 확률은 다음 수식과 같다. 

서브샘플링 확률

 

 만일 𝓯(𝔀𝓲)가 0.01로 나타나는 빈도 높은 단어(예컨대 조사 [은/는])는 위 식으로 계산한 𝓟(𝔀𝓲)가 0.9684나 돼서 해당 단어가 가질 수 있는 100번의 학습 기회 가운데 96번 정도는 학습에서 제외하게 된다. 반대로 등장 비율이 적어 𝓟(𝔀𝓲)가 0에 가깝다면 해당 단어가 나올 때마다 빼놓지 않고 학습을 시키는 구조다. 서브샘플링은 학습량을 효과적으로 줄여 계산량을 감소시키는 전략이다. 

 

1.3 모델 학습

 Skip-gram 모델은 타깃 단어와 문맥 단어 쌍이 주어졌을 때 해당 쌍이 포지티브 샘플(+)인지 아닌지를 예측하는 과정에서 학습된다. 따라서 타깃 단어와 문맥 단어 쌍이 실제 포지티브 샘플이라면 다음 수식에 정의된 조건부 확률을 최대화해야 한다.

 

𝓽, 𝓬가 포지티브 샘플(= 𝓽 주변에 𝓬가 존재)일 확률

 

 Skip-gram 모델의 학습 파라미터는 𝓤 와 𝓥 행렬 두 개뿐이다. 둘의 크기는 어휘 집합 크기(|𝓥|) X 임베딩 차원 수(𝓭)로 동일하다. 𝓤 와 𝓥 는 각각 타깃 단어와 문맥 단어에 대응한다. 예를 들어 𝓾𝓽 는 타깃 단어(𝓽) [빨래]에 해당하는 𝓤 의 행 벡터, 𝓿𝓬 는 문맥 단어(𝓬) [속옷]에 해당하는 𝓥 의 열 벡터가 된다. NPLM의 수식과 비교해보면 학습 파라미터의 종류와 크기가 확 줄어든 것을 확인할 수 있다. 

 

 위 수식을 최대화하려면 포지티브 샘플에 대응하는 단어 벡터인 𝓾𝓽 와 𝓿𝓬 의 내적(inner product) 값을 키우면서 분모를 줄여야 한다.  그런데 두 벡터의 내적은 코사인 유사도(cosine similarity)와 비례한다. 따라서 내적 값의 상향은 포지티브 샘플 𝓽 와 𝓬 에 해당하는 단어 벡터 간 유사도를 높인다.

 

 Skip-gram 모델은 네거티브 샘플 단어 쌍에 관해 다음 수식에 정의된 조건부 확률을 최대화해야 한다. 

 

 수식을 최대화하려면 식의 우변 분자를 최대화해야 한다. 분자를 최대화하려면 네거티브 샘플에 대응하는 단어 벡터인 𝓾𝓽 와 𝓿𝓬 의 내적 값을 줄여야 한다. 그런데 두 벡터의 내적은 코사인 유사도와 비례한다. 따라서 내적 값의 하향은 네거티브 샘플 𝓽 와 𝓬 에 해당하는 단어 벡터 간 코사인 유사도를 낮춘다. 

 

 다음 수식은 Skip-gram 모델이 최대화해야 하는 로그우도 함수(log-likelihood function)다. 모델 파라미터인 8을 한 번 업데이트할 때 1개 쌍의 포지티브 샘플(𝓽𝓹, 𝓬𝓹)𝓴 개 쌍의 네거티브 샘플(𝓽𝓷𝓲, 𝓬𝓷𝓲)이 학습된다는 의미다. 수식을 최대화하는 과정에서 결과적으로 Skip-gram 모델은 말뭉치의 분포 정보를 단어 임베딩에 함축시키게 된다. 

 

 

Skip-gram 모델의 로그우도 함수

 

 Skip-gram 모델은 위 수식을 계산할 때 타깃 단어에 해당하는 단어 벡터 𝓤𝓽 는 행렬 𝓤 에서, 문맥 단어에 해당하는 단어 벡터 𝓿𝓬 는 행렬 𝓥 에서 참조한다. 모델 학습이 완료되면 𝓤 만 𝓭 차원의 단어 임베딩으로 쓸 수도 있고, 𝓤 + 𝓥𝓽 행렬을 임베딩으로 쓸 수도 있다. 혹은 𝓤, 𝓥𝓽 를 이어 붙여 2d차원의 단어 임베딩으로 사용할 수도 있다. 

 

 

 Word2Vec을 위시한 단어 임베딩 기법들은 대게 말뭉치의 분포(distribution) 정보를 벡터에 녹이고, 분포가 유사한 단어 쌍은 그 속성 또한 공유할 가능성이 높다. most_similar 함수는 쿼리 단어와 코사인 유사도가 가장 높은 단어들을 출력하지만 어떤 단어 쌍이 특정 속성을 공유한다고 해도 해당 쌍이 반드시 유의 관계인 것은 아니다. 여기에는 반의 관계, 상하 관계도 있을 수 있다. 따라서 해당 쿼리 단어와 유의 관계에 있는 단어를 보여준다기보다는, 관련성(relevance)이 높은 단어를 출력한다는 의미로 이해하는 것이 좋다. 

 

 

반응형

 


 

2. FastText

 FastText(Bojanowski et al., 2017)는 메타에서 개발해 공개한 단어 임베딩 기법이다. FastText는 각 단어를 문자 단위 n-gram으로 표현한다. 이 밖의 내용은 Word2Vec과 같다.

 

 

2.1 모델 기본 구조

 예컨대 [시나브로]라는 단어의 문자 단위 n-gram(n=3)은 다음 그림과 같다. 그림에서 [<, >]는 단어의 경계를 나타내 주기 위해 FastText 모델이 사용하는 특수 기호다. 

'시나브로'의 n=3인 문자 단위 n-gram

 

 FastText 모델에서는 [시나브로]라는 단어의 임베딩을 다음 수식과 같이 5개의 문자 단위 n-gram 벡터의 합으로 표현한다. 𝓤𝓽 는 타깃 단어 𝓽 에 속한 문자 단위 n-gram 집합을 가리킨다.

 

FastText의 단어 벡터 표현

 

 FastText 모델 역시 네거티브 샘플링 기법을 쓴다. 다음 수식에 정의된 조건부 확률을 최대화하는 과정에서 학습된다. 입력 단어 쌍(𝓽, 𝓬)이 실제 포지티브 샘플이라면 모델은 해당 입력 쌍이 포지티브라고 맞춰야 한다. 여기까지는 Word2Vec과 다르지 않다. FastText는 한발 더 나아가 타깃 단어(𝓽), 문맥 단어(𝓬) 쌍을 학습할 때, 타깃 단어(𝓽)에 속한 문자 단위 n-gram 벡터(𝔃)들을 모두 업데이트한다. 

 

FastText 모델에서 𝓽,𝓬가 포지티브 샘플(=𝓽 주변에 𝓬가 존재)일 확률

 

 포지티브 샘플이 주어졌을 때 위 수식을 최대화하려면 분모를 최소화해야 한다. 분모를 최소화하기 위해서는 𝔃 들과 𝓿𝓬 간 내적 값을 높여야 한다. 벡터의 내적은 코사인 유사도와 비례한다. 따라서 내적 값의 상향은 타깃 단어(𝓽)에 속하는 문자 단위 n-gram 벡터와 문맥 단어의 포지티브 샘플(𝓬)에 해당하는 단어 벡터 간 유사도를 높여야한다는 의미로 이해할 수 있다.

 

 예컨대 [시나브로]가 타깃 단어(𝓽), [쌓였다]가 문맥 단어의 포지티브 샘플(𝓬)이라면 [<시나], [시나브], [나브로], [브로>], [<시나브로>] 등 문자 n-gram 벡터(𝔃)들 각각을 [쌓였다]에 해당하는 단어 벡터(𝓿𝓬)와의 유사도를 높인다.

 

 FastText 모델은 또한 네거티브 샘플 단어 쌍에 대해 다음 수식에 정의된 조건부 확률을 최대화해야 한다. 다시 말해 네거티브 샘플을 모델에 입력하면 모델은 이 데이터가 정말 네거티브 샘플이라고 잘 맞춰야 한다는 이야기다.

 

FastText 모델에서 𝓽,𝓬가 네거티브 샘플(𝓬를 𝓽와 무관하게 말뭉치 전체에서 랜덤 샘플)일 확률

 

 네거티브 샘플이 주어졌을 때 위 수식을 최대화하려면 분자를 최대화해야 한다. 분자를 최대화하기 위해서는 𝔃 들과 𝓿𝓬 간 내적 값을 낮춰야 한다. 벡터의 내적은 코사인 유사도와 비례한다. 따라서 내적 값의 하향은 타깃 단어(𝓽)에 속하는 문자 단위 n-gram 벡터와 문맥 단어의 네거티브 샘플(𝓬)에 해당하는 단어 벡터 간 유사도를 낮춰야(=벡터 공간상 멀게) 한다는 의미로 이해할 수 있다.

 

 예컨대 [시나브로]가 타깃 단어(𝓽), [컴퓨터]가 문맥 단어의 포지티브 샘플(𝓬)이라면 [<시나], [시나브], [나브로], [브로>], [<시나브로>] 등 문자 n-gram 벡터(𝓬)들 각각을 [컴퓨터]에 해당하는 단어 벡터(𝓿𝓬)와의 유사도를 낮춘다.

 

 다음 수식은 FastText 모델이 최대화해야 할 로그우도 함수다. 모델을 한 번 업데이트할 때 1 개의 포지티브 샘플(𝓽𝓹, 𝓬𝓹)과 k개의 네거티브 샘플(𝓽𝓷𝓲, 𝓬𝓷𝓲)을 학습한다. 

 

FastText 모델의 로그우도 함수

 

 FastText 모델의 강점은 조사나 어미가 발달한 한국어에 좋은 성능을 낼 수 있다는 점이다. FastText 모델로 학습하면 용언(동사, 형용사)의 활용이나 그와 관계된 어미들이 벡터 공간상 가깝게 임베딩 된다. 예컨대 [하였다]가 타깃 단어(𝓽), [진행]이 문맥 단어의 포지티브 샘플(𝓬)이라면 [<하였], [하였다], [였다>] 벡터(𝔃)들 각각이 [진행]에 해당하는 벡터(𝓿𝓬)와의 유사도가 높아진다. 이러한 방식으로 학습이 됐다면 [하였다] 벡터와 [하(다)], [했(다)], [(하)였으며] 등에 해당하는 벡터 간 유사도가 문맥이 서로 비슷하기 때문에 높을 것이다.

 

model.most_similar("하였다", topn=5)

""" 결과
[('하', 0.9295729665862918),
('다', 0.907324941314357),
('했', 0.892999416929608),
('였으며', 0.8632510577839813),
('했으며', 0.8549427906656639)]
"""

 

 FastText는 또한 오타미등록 단어(unknown word)에도 강건하다. FastText는 각 단어의 임베딩을 문자 단위 n-gram 벡터의 합으로 표현하기 때문이다. 예컨대 미등록 단어 [서울특별시]에 대해서도 [서울]이 어휘 집합에 있다면 나머지 n-gram(울특, 특별 등)이 모두 미등록 단어라 할지라도 [서울특별시]에 대한 임베딩을 추정할 수 있다. 다른 단어 임베딩 기법이 미등록 단어 벡터를 아예 추출할 수 없다는 사실을 감안하면 FastText는 경쟁력이 있다.

 

 

요약

  • 네거티브 샘플링 기법을 사용한 Word2Vec Skip-gram 모델은 타깃 단어와 문맥 단어 쌍이 주어졌을 때 해당 쌍이 포지티브 샘플(+)인지, 네거티브 샘플(-)인지 이진 분류하는 과정에서 학습된다. NPLM보다 학습 파라미터 종류와 크기가 훨씬 작고 효율적인 학습이 가능하다. 
  • Levy&Goldberg (2014)는 네거티브 샘플링 기법으로 학습된 Word2Vec의 Skip-gram 모델은 행렬 분해 관점에서 이해할 수 있다고 증명해 주목받았다. 
  • FastText는 각 단어를 문자 단위의 n-gram으로 표현하는 임베딩 기법이다. 이 밖의 모델 구조는 Word2Vec과 동일하다. FastText 모델은 조사나 어미가 발달한 한국어에 좋은 성능을 낸다. 

 

 

Reference

 
한국어 임베딩
저자 : 이기창
감수 : NAVER Chatbot Model
출판 : 에이콘출판사
발매 : 2019.09.26

 

반응형

댓글