티스토리 뷰

NLP /CS224n

[CS224n] Lecture 3. More word vectors

제이gnoej 2019. 4. 8. 01:57

1. Word2vec 의 원리 


Word2vec 은 결국 window 를 옮겨가며 center word 를 가지고 context words 를 output 하는 모델을 가지고 만든다. 예를 들어 "I like deep learning and NLP" 라는 문장이 있고, window size 는 2라고 하자. 현재의 time step (t) 에서 center word 가 "deep" 일 때



를 계산하고 context words vector 와 center word vector (deep) 을 update 하는 것이다. 

그 다음 time step t+1 에서는 center word 가 learning 이 되겠고, 똑같은 방식으로 window 를 옮겨가면서 실제로 함께 co-occur 하는 단어관의 확률을 높이도록 관련 parameter 를 update 하는 것이다. 


그런데 이런 식으로 window 를 한칸씩 옮겨가며 그 때마다 벡터를 업데이트 하는 데에는 문제가 있다! 

각 윈도우 마다 우리는 윈도우 크기 * 2 (output words) + 1 (center word) 만 보고 파라미터를 (time step t 에서의 center word vector 랑, output vector 는 전부 업데이트 하는 건가 ?) 업데이트 한다. 전체 코퍼스의 토큰이 20,000 정도만 된다고 해도 굉장히 sparse 하게 optimize 가 이루어지게 된다. 왜냐면 20,000 개의 단어 중에서 실제로 deep 과 나타나는 단어는 몇 개 안 되고, 나머지 토큰은 거의 deep 과 co-occur 하지 않을 가능성이 크기 때문. 


이 문제를 해결하는 방법은? 아마도 window 내에 있는 단어들, 즉 center word "deep" 과 그 주변에 실제로 co-occur 하는 context words 의 vector (I, like, and, NLP) 의 vector 만 update 하는 것! 


이렇게 하기 위해서는 2가지 방법이 가능하다. 

1) Stochastic gradients 처럼 (?), output context words matrix 의 특정 column 만 update 시키거나 

2) hash (딕셔너리) - key 는 word 이고, value 는 word vector 인 - 를 이용해서 window 내에 있는 단어에 대한 vector 만 update  하거나. 


기존에 우리가 정한 다음의 모델을 쓰기에는 또 다른 문제점이 있다. 




분자 부분은 2개의 단어 (context word, center word) 의 vector 끼리의 계산이기 때문에 간단한 반면에, 분모 부분은 computation 이 상당히 heavy 하다. (이 부분은 어려워서 https://blog.naver.com/jujbob/221155564430 인용). 그렇기 때문에 전체 V 에 대해서 계산하는 게 아니라 몇 개의 단어만 가지고 계산하면 되지 않을까 하고 생각할 수 있다. 그런데 이 몇 개의 단어를 어떻게 선택할까? 그냥 랜덤하게? 간단하게 말해 주어진 규칙을 가지고 랜덤하게 선택하면 된다. 고의적으로 여러개의 오답이 될만한 후보를 랜덤하게 선택한 후, 확률값에 negative 를 취하는 방법을 negative sampling 이라고 한다. 


negative sampling 을 확률적으로 표현하면, 정답이 될 수 있는 후보쌍의 확률을 최대로 만들고, 오답이 될 수 있는 후보쌍의 확률을 최소로 하는 것. 



2. Window base 방법과, co-occurrence 방법을 합치면? 

+ 쓰기. 

3. Word embedding 은 어떻게 평가할까? 

1) intrinsic evaluation 
2) extrinsic evaluation 

1) 번은 시스템 자체에 대한 평가를 의미하는데, word2vec model 자체를 평가한 다는 거임. 각 단어의 임베딩이 해당 단어를 얼마나 잘 표현하는지를 척도로 모델을 평가한다는 것이다. 이 경우에, 이 모델만 놓고 평가를 하는 게 가능해서 모델의 성능을 향상시키기 위해서 parameter 를 조정한다든지 하는 게 더 쉽다. 

2) 번은 word2vec 그 자체를 평가하는 것이 아니라, 해당 모델을 다른 sub task 를 하기 위해서 사용하고 (ex. machine translation, named entity recognition) 해당 task을 얼마나 더 잘  수행할 수 있는지를 보는 것이다. 

아무래도 extrinsic evaluation 은 implementation 하기가 더 쉬워보이는데 intrinsic evaluation 으로 word embedding 을 평가하기 위해서는 어떤 지표를 쓸 수 있을까? 



위와 같이 word vector analogy 라는 게 있는데, 이런 거임. Man : Woman 이 주어졌을 때 King : ? 에서 ? 에 들어갈 것을 맞추는 것. 이걸 잘 맞추는 word embedding 이 의미 관계를 잘 나타내는 word embedding 이라는 것! 이 뿐만이 아니라, superlative (비교급) 에서도 bad : worst :: good : ?  같은 것도 쓸 수 있는데 이것은 word embedding 이 (신기하게도) 의미 관계 뿐만이 아니라 syntactic 한 관계도 뽑아내기 때문에 가능한 것! 

여기서 ? 를 어떻게 구하냐면, 다음의 수식을 이용해서 구한다. a : b :: c : ? 에서 ? 가 구하고자 하는 값 d 일 때, d 는 다음과 같다. 


 

이 식을 어떻게 설명할 수 있냐면 분자만 놓고 봤을 때, 결국 ( woman - man + king ) 의 결과값과 가장 큰 cosine similarity 를 갖는 값이 원하는 값 (queen) 이라는 것 (Xi 가 queen 의 vector 값인가? d 는 string 이고..?)   

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함