본문 바로가기

모델/자연어처리

word2vec (2)

안녕하세요! 이번 시간에는 지난번에 올린 word2vec(1)에 이어 2편을 정리해서 올리게 되었습니다! 지난 시간에는 word2vec의 기초로 1개의 word를 input으로 넣고 1개의 word를 output으로 하는 모델을 알아보았습니다. 이번에는 CBOW, Skip-gram 모델에 대해 알아보겠습니다.

 

이번에 참고한 자료는 다음과 같습니다.

https://arxiv.org/pdf/1411.2738.pdf&xid=25657,15700021,15700124,15700149,15700168,15700186,15700191,15700201,15700208&usg=ALkJrhhNCZKc2CO7hRoTrGd6aH2nBc-ZVQ

(논문)

 

https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf

(논문)

 

https://wikidocs.net/22660

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

그리고 혹시라도 보시다가 모르는 내용이 있으면 'word2vec (1)'을 보고 오시는 것을 권장합니다. (물론 제 설명이 엉망인것도 있어서 이해를 못할 수도 있습니다...) 링크는 아래 URL을 누르시면 됩니다!

https://hwa-a-nui.tistory.com/3

 

word2vec (1)

안녕하세요! 이번 시간에는 자연어 처리의 기본적인 word2vec에 대해 글을 쓰겠습니다! 아마 한동안은 제가 자연어 모델들을 공부할 목적을 가져서 자연어 위주로 글이 올라올 것 같아요!(물론 다�

hwa-a-nui.tistory.com

https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/

 

Word2Vec의 학습 방식 · ratsgo's blog

이번 포스팅에서는 최근 인기를 끌고 있는 단어 임베딩(embedding) 방법론인 Word2Vec에 대해 살펴보고자 합니다. Word2Vec은 말 그대로 단어를 벡터로 바꿔주는 알고리즘입니다. Neural Network Language Model(

ratsgo.github.io

https://en.wikipedia.org/wiki/Language_model

 

Language model - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Statistical model of structure of language A statistical language model is a probability distribution over sequences of words. Given such a sequence, say of length m, it assigns a prob

en.wikipedia.org

 

 

1. CBOW

우선 CBOW부터 보도록 하겠습니다. CBOW는 'continuous bag-of-word'의 약자로 간단하게 연속된 단어가 나올 때 중간에 단어 구멍이 있으면 여기 어떤 단어가 나올지 예측하는 것입니다. window를 1로 주면 중간 단어를 기준으로 앞, 뒤로 1개 단어를 input으로 합니다. 예를 들면 'What color do you like?'라는 문장이 있을 때 'do'를 기준으로 window를 1로 하면 input 단어가 'color, you'가 되고 모델은 그 중간단어인 'do'라는 단어를 예측하는 것입니다. 

그림 1. CBOW

그림 1은 CBOW에 대한 그림입니다. 여기서 h는 다음과 같은 값을 가집니다.

h = $\cfrac{1}{C}W^{T}(\textbf{x}_{1} + \textbf{x}_{2} + ... + \textbf{x}_{C})$

   = $\cfrac{1}{C}(\textbf{v}_{w_{1}} + \textbf{v}_{w_{2}} + ... + \textbf{v}_{w_{C}})^{T}$

 

여기서 C는 input 단어 개수로 위의 예시는 2개이므로 2가 됩니다. 지난 시간에 h는 input 단어의 embedding 형태였는데 이번에는 2개 단어가 input이기 때문에 h는 2개 단어의 embedding한 값의 평균을 가지게 됩니다.

 

loss function은 다음과 같습니다.

E = $ -log p(w_{O} | w_{I,1}, ..., w_{I,C})$

   = $-u_{j^{*}} + \sum_{j^{\prime}=1}^{V} exp(u_{j^{\prime}})$

   = ${-\textbf{v}^{\prime}_{W_{O}}}^{T} \cdot\textbf{h} + \sum_{j^{\prime}=1}^{V} exp(u_{j^{\prime}})$

 

첫 줄부터 보면 input 단어가 들어갔을 때 output 단어로 $w_{O}$가 나올 확률을 극대화 하는 모델을 만들 때 loss function을 의미하며 이는 'word2vec (1)' 글의 loss와 유사한 형태입니다.

두 번째 줄에서 $-u_{j^{*}}$는 one hot encoding 기준, 1로 예측되어야 할 위치의 값입니다. softmax 전이니 1보다 작을수도, 클 수도 있습니다. $u_{ j^{\prime} }$는 방금전의 $u_{j^{*}}$를 포함한 모든 $u_{j}$의 값으로 위의 예시에선 $u_{1}, ..., u_{5}$가 됩니다. 참고로 $u_{j}$들을 softmax 함수에 넣은 이후의 결과는 이후로는 $u_{j^{\prime}}$를 제외한 나머지 $u_{j}$는 모두 0이 나와야 제일 좋은 결과라고 할 수 있습니다.

 

마지막 줄에서 $u_{j}$값들이 다 ${\textbf{v}^{\prime}_{W_{j}}}^{T} \cdot\textbf{h}$로 바뀐 것을 볼 수 있는데 역시 'word2vec (1)'의 글과 같은 경우입니다.

 

이렇게 loss function을 구하면 input을 넣었을 때 backpropagation으로 가중치를 update하는 경우는 다음과 같습니다.

${v^{\prime}_{w_{j}}}^{(new)} = {v^{\prime}_{w_{j}}}^{(old)} - \eta \cdot e_{j} \cdot \textbf{h}$

지난 글과 똑같은 결과입니다.

다음 input과 hidden 사이의 가중치 부분은 조금 다릅니다.

${v^{\prime}_{w_{I,c}}}^{(new)} = {v^{\prime}_{w_{I,c}}}^{(old)} - \cfrac{1}{C} \cdot \eta \cdot \textbf{EH}^{T}$

지난 글의 식과 똑같으나 $\cfrac{1}{C}$가 추가되었는데 이는 아까 hidden layer를 만들 때 input 단어 개수만큼 나눠서 만들었기 때문에 update에서도 똑같이 다시 값을 나눠서 만들게 됩니다.(자세한 것은 미분법칙으로 알 수 있습니다)

 

2. Skip-Gram Model

다음은 Skip-Gram Model입니다. CBOW랑 반대로 output이 다수이고 input이 1개인 모델입니다. 나머지는 정말 똑같습니다. 예를 들어 'What color do you like?'라는 문장이 있을 때 'do'라는 단어를 넣고 window 1을 예측하라하면 전, 후 단어 1개씩, 'color, you'를 output으로 만들게 됩니다.

 

그림 2. Skip-Gram

그림 2는 Skip-Gram에 대한 모델입니다. h는 이전 글의 모델과 같으나 output이 조금 달라졌는데 이를 표현하면 다음과 같습니다.

 

$u_{c,j} = u_{j} = {\textbf{v}^{\prime}_{w_{j}}}^{T} \cdot \textbf{h}$

여기서 c는 output 단어가 어떤 단어인지 지칭합니다. 위의 사진과 비교하면 c=1이면 $u_{1}$, c=2이면 $u_{2}$가 됩니다. 특이한 점은 c가 몇이든 관계없이 $u_{j}$로 바뀌는데 이는 c의 값이랑 상관없이 hidden -> output으로 갈 때 $\textbf{W}^{\prime}$은 같은 가중치를 쓰기 때문입니다. 

 

그림 3. hidden -> output 구하는 과정

 

그림 3을 보면 c가 값이 몇이든 간에 j번째 column에 의해 $u_{c,j}$가 나올 것을 알 수 있습니다.

 

loss function은 다음과 같습니다.

 

식의 2번째 줄은 output이 많아졌으며 확률값이기 때문에 output 결과를 모두 곱셈을 기준으로 나타낸 것입니다. 마지막으로 가중치 update 입니다. hidden -> output의 가중치 $\textbf{W}^{\prime}$가 이전 글과 차이가 있기 때문에 이 부분만 쓰도록 하겠습니다.

 

$u_{j}$의 경우 c값에 따라 나뉘기 때문에 Error 값에 대한 $u_{j}$의 미분은 다음과 같습니다.

$\cfrac{{\partial}E}{{\partial}u_{c,j}} = y_{c,j} - t_{c,j} := e_{c,j}$

 

가중치의 경우 c가 구분없이 이루어지기 때문에 c값을 합한 error값을 구합니다.

$\textbf{EI}_{j} = \sum_{c=1}^{C} e_{c,j}$

 

마지막으로 각 $w^{\prime}_{ij}$에 대한 미분값은 다음과 같습니다.

여기까지가 Skip-gram 미분에 대한 설명이었습니다.

 

+ Negative Sampling

그렇다면 모델의 구조를 알았으니 그냥 학습시키면 될까요? 물론 할 순 있지만 문장이 많다고 했을 때 window로 쪼개면서 단어를 모두 학습하려면 시간이 엄청 오래걸립니다. 그래서 저자는 Hierarchical Softmax, Negative Sampling으로 학습하는 방법을 제안했는데 여기서는 많이 쓰이는 Negative Sampling을 보겠습니다.

 

이 최적화 방법이 나오게 된 계기는 위에서도 설명드렸지만 학습량이 너무 많기 때문에 이를 줄이기 위해 고안된 방법입니다. 여기서 sample을 positive sample, negative sample로 나누는데 이는 output을 기준으로 합니다. 즉, 'What color do you like?'라는 문장에서 window 1, input을 'color, you'로 하면 positive sample은 output을 'do'로 할 것이고 negative sample은 'like' 등으로 할 것입니다.

 

우선 loss function은 다음과 같습니다.

E = $-log\sigma ({\textbf{v}^{\prime}_{w_{O}}}^{T} \textbf{h}) - \sum_{w_{j} \in W_{neg}}^{} log \sigma (-{\textbf{v}^{\prime}_{w_{j}}}^{T} \textbf{h})$

 

여기서 $\sigma$는 sigmoid 함수로 $\sigma(x) = 1/(1+exp(-x))$입니다. $W_{O}$는 output word로, positive target word입니다. 그리고 $\textbf{v}^{\prime}_{w_{O}}$는 $w_{O}$의 embedding 된 벡터값이며 h는 hidden vector 입니다. 마지막으로 $W_{neg}$는 $P_{n}(w)$에서 sampling된 단어로 negative sample입니다. 참고로 $P_{n}(w)$는 positive word 1개와 이와 관련된 negative word 여러개로 구성되어 있습니다.

 

여기서 negative sample은 positive output 1개 당 단어 개수를 dataset이 작은 경우 5~20개, 큰 경우 2~5개로 sampling 합니다(해당 숫자를 k라고 정의하겠습니다). 각 negative sample은 $P_{n}(w)$에서 추출되었으므로 이 안에서 각각의 확률값을 가지는데 이는 unigram distribution으로 각 단어는 독립 확률을 가지고 있다고 가정합니다. 즉, 우리가 가진 전체 문서에서 negative sample 단어가 나올 확률값을 구하면 해당 단어들은 unigram distribution을 가진 것입니다. 그 후 각 단어 확률값에 3/4씩 제곱 한 뒤 모든 단어의 확률을 다시 softmax와 유사한 식을 적용하면 $P_{n}(w)$가 완성됩니다. 식은 다음과 같습니다.

$\cfrac{P_{n}(w_{j})}{\sum_{j=1}^{k} P_{n}({w_{j}})}$

여기서 $w_{j}$는 positive 단어 1개와 그에 따른 negative 단어들이 됩니다.

 

이제 마지막으로 아까 loss function의 가중치 update를 보도록 하겠습니다.

위의 식에서 ${\textbf{v}^{\prime}_{w_{j}}}^{T} \textbf{h}$는 우리가 'word2vec (1)'에서 $u_{j}$로 정의했던 output값입니다.(softmax 전) 

$w_{j} = w_{O}$는 $w_{j}$가 positive sample인 경우로, 위의 log는 자연로그 이므로 ln(x) -> 1/x로 바뀌고 sigmoid의 경우 미분하면 sigmoid -> sigmoid(1 - sigmoid)가 됩니다. loss function에서 뒤의 식은 미분시 없어지니 앞의 식만 고려하여 미분하면 다음과 같은 형태가 됩니다.

 

$-\cfrac{1}{\sigma} \sigma(1-\sigma)$ = $\sigma - 1$

 

그래서 이러한 형태가 나오며 마찬가지로 $w_{j}$가 negative인 경우엔 뒤의 식만 남으므로 유사한 방식으로 미분하면 됩니다. 그러므로 $t_{j}$라는 변수를 추가하면 두 개의 경우를 동시에 고려할 수 있습니다. $t_{j}$는 $w_{j}$가 positive sample인 경우에만 1이고 나머진 0입니다.

이제 우리가 원하는 변수인 $\textbf{v}^{\prime}_{w_{j}}$로 미분하면 다음과 같은 형태로 됩니다.

즉, 이를 통해 hidden -> output 사이의 특정 가중치(여기선 특정 단어의 embedding 결과)에 대한 update는 다음과 같은 식으로 됩니다.

마지막으로 h에 대한 미분은 다음과 같습니다.

 

위의 h를 이용하면 input -> hidden의 가중치도 update 할 수 있는데 이 부분은 앞에서 설명한 것과 동일합니다.

 

여기까지가 word2vec의 모델 구조에 대한 설명이었습니다. 글의 전체적인 순서는 첨부했던 'word2vec Parameter Learning Explained' 논문에 맞춰 쓰긴 했는데 다시 보니 조금 어지럽긴 하네요. 아무래도 다음엔 글 형식을 조금 바꿔야 할 것 같기도 합니다.

 

궁금하신 사항이나 수정해야 할 사항 있으시면 언제든 말씀해주세요!

긴 글 읽어주셔서 감사합니다!

'모델 > 자연어처리' 카테고리의 다른 글

Text Classification Algorithms: A Survey (알고리즘 파트)  (4) 2020.11.16
word2vec (1)  (2) 2020.08.07