본문 바로가기
KONLP

word2vec 혼자 정리 노트(1)

by lolencec 2020. 1. 19.

이번에 word2vec을 시작으로 처음 NLP라는 자연어처리 세계에 발을 담궛다.

word2vec 한마디로 단어를 벡터로 바꿔준다는  말이다.

벡터로 바꿔서 컴퓨터가 단어의 내적인 의미를 알게 해주는것이 목표라고 생각한다. 

 

그렇다면 왜 ? 라는 의문이 생길 수 있다. 벡터가된다는 것은 단어간의 유사성을 알 수 있고, 군집화를 할 수 있는 기회를 준다. 그렇다면 왜 유사성을 알고 군집화를 해야할까? 

 

개인적으로 요즘 시대에 가지고 있다면 유용한 skill로써 검색과 개인적인 정보의 이용에 도움을 줄 수 있다고 생각한다.

 

그렇다면 어떻게 단어를 벡터로 바꾸지 ? 라는 생각이 든다. 정말 말도안되는 소리라고 생각했다.

임베딩은  1980년 역전파의 오류로부터 2003년 신경계 언어모델이 나오고 2008년 NLP가 연구가 되면서 2013년 

word2vec이 나오게 되었다. 그 이후로 더 좋은 모델? 아니 다른 방법의 모델들이 많이 나오고 있지만 word2vec 의 임베딩의 예측력은 아직까지 좋다고 여겨진다. 

 

아 그리고 영어로된 임베딩방법은 많은 정보와 자료들을 인터넷에서 찾을  수 있지만, 한국어 임베딩 방법은 많지 않다.

물론 가장 널리 할 수있는건 '명사'라고 생각한다. 하지만 한국어에서 더 깊게 들어가게 된다면 형태소분석을 해야 한다는 점이다. 적절히 모든 문장에서 단어를 잘 전처리 하는 것이 중요하지만 어렵다고 생각한다.

<구글링이 아직 약해서 .. 아닐 지도 모른다>

 

word2vec 은 임베딩의 한 종류이다.

그렇다면 임베딩이란 무엇일까?

임베딩이란 문자를 벡터화 하는것이다. 

 

그렇다면 word2vec은 어떻게 하는것일까 ?

하는 방법은 2가지로 나누어진다. 첫번째는 cbow  두번째는 skip gram이라는 방법이다.

 

본인은 다양한 글들과 요즘의 여론들에 힘입어 cbow는 깊게 하지않았다. 

이유는 skimgram이 cbow보다 더 좋은 결과를 보여주기 때문이다.

 

하는 방식은 예를 들어 보여주겠다.

ex> 오늘도 나는 아침에 출근을 한다.

 

이렇게 된다면 단어는 

오늘도 

나는

아침에

출근을

한다 

 

이렇게 나오게 된다. 

cbow 방식은 주변의 단어들을 통해 중심단어를 유추하는 것이다. 

만약 '오늘도 나는 xxx 출근을 한다' 이런상황일때 xxx를 유추하게 된다. 오늘도 나는 출근을 한다 라는 단어를 통해 가장 적절한 단어를 학습을 하여 찾아주게 된다. 

 

그렇다면 skip gram은 무엇인가.

반대로 중심단어(center word)를 기준으로 주변단어(context)를 찾아주는 방식이다.

이방식에 더해 window라는 개념을 사용한다. window란 중심단어를 기준으로 몇개의 주변단어까지 허용범위를 두고 학습하는지 지정해준다.

window 값이 2라면 '아침에' 를 중심단어로 하겠다. 

(아침에, 오늘도) (아침에, 나는) (아침에, 출근을) (아침에, 한다) 이렇게 학습이 된다. 

중심단어에 대해 학습을 했다면 다음단어를 중심단어로 선택하고 같은 작업을 하게된다. 그렇게 마지막 단어까지 학습이 된다면 iter 이 1이 되는것이다. 

 

본격적으로 skipgram에 들어가게되면 skipgram은 신경망형태를 가지는 학습을 한다.

 

내가그린 신경망 

input은 one hot 형태로 단어가 들어가게 된다.

특이한점은 두개의 가중치가 우리가 하고 싶은 word2vec의 결과라는 점이다.

w1은 중심단어를 이용해 주변단어를 vec ,w2는 주변단어를 이용해 중심단어를 찾는 word2vec 이다.

w1과 w2는 전치 행렬인데 완전히 같지는 않은 형태라고 한다. 어떤점이 완전히 같지않은진 나도 아직 모르겠다.

같다고 봐도 무방하다고 한다. 

 

단어가 만약 100개의 단어가 있고 우리가 벡터의 차원을 100이라고 한다면 w1의 가중치 행렬은 1:1대응으로 

100*100의 행렬을 가지게 된다. 단어가 많을 수록 차원이 커질 수록 아주 커다란 가중치행렬이 형성하게 된다. 

 

input 은 단어의 n개수만큼 열이 생겨나며, 차원값이 m 이라면 

w1은 (n*m) 의 행렬을 가지게 되는것이다. 더불어 input값은 one hot이기 때문에 w1의 행벡터 값들이 우리가

원하는 값이 된다. 

 

 

 그렇다면 수학식으로 설명을 해보자

단어 i 가 존재할때 단어 t 가 있을확률을 최고로 높여준다는 말이다. -> skipgram 의 목적 

여기서 J는 Likelihood 가 최대를 구한다고 한다면 반대로 최소를 구하기 위한 값이다. -를 취해줌으로써 argmin 값을 찾는것을 목표로하고, log를 취해줌으로써 곱셈을 -> 다른 사칙연산으로 변환하여 전개에 도움을 준다. 

 

정리한 내용을 대입해 Vc는 중심단어 U는 주변단어로 하여 식을 전개하면 모양이 soft max의 형태를 띄게된다. 

 

여기서 이제 최적화만이 남아있다. 

 

최적화는 gradient 기울기를 이용해 한다는데 다음에 써보겠다.

'KONLP' 카테고리의 다른 글

codefight_27번 문제풀이(1)  (0) 2020.09.05
word2vec 3번째 이야기  (0) 2020.01.27
아무것도 모르는 사람들에게 word2vec  (0) 2020.01.27
word2vec 두번째 정리 (2)  (0) 2020.01.27