엄청나게 유용하면서도 별로인 W2V에 대해서 알아보도록 합시다.
영어를 왜 중간에 많이 넣었냐면.. 실무에선 영어쓰니까..?
우리가 강대국이었으면.. 한글자료가 훨 많았을텐데 흐규흐규
출처:
Efficient Estimation of Word Representations in Vector Space(Tomas Mikolov Kai Chen Greg Corrado Jeffrey Dean )
이분의 글도 참고해서 봅시다.
정의
Word to Vec 이라는 설명에 걸맞게 뜻도 그렇다.
단어를 바로 벡터로 변환해준다는 이야기다. (Word to Vector)
왜?? 굳이 단어를 벡터로 바꿔야해?
-> 벡터로 바꾸어야 유사도 같은 계산이 가능함(분산 표현 시 가능)
엥?? 그냥 원핫인코딩하면 되는 거아님??
-> 그렇게 만들어 놓은 벡터는 유사도를 계산하지 못하고 차원의 저주에 빠져 속도가 거의 거북이 뺨침
그럼 단어를 벡터화 하는 방법에 대해는 뭐가 있는데?
첫째는 카운트 기반의 벡터화 방법인 LSA, HAL 등이 있으며
둘째는 예측 기반으로 벡터화하는 NNLM, RNNLM, Word2Vec, FastText
그리고 카운트 기반과 예측 기반 두 가지 방법을 모두 사용하는 방법으로 GloVe 방법
우리는 오늘 W2V에 대해서 배워보는 것이다.
우선 Word2Vec은 2개의 히든레이어를 가지고 있는 뉴럴 네트워크(Neural Network) 모델이다.
-> 딥러닝모델은 아님(Deep Learning Model) x
++딥러닝이란 입력층과 출력층 사이의 은닉층의 개수가 충분히 쌓인 신경망을 학습할 때를 말하는데.. 2개의 레이어 밖에 없어서.. 그렇게 부르긴 무리다.
-> 얕은 신경망이라고 부를 수 있다.
W2V은 단어가 많아져도 저차원벡터를 가지고 다차원 공간에 벡터화해서 유사성을 표현할 수 있다.
**이러한 워드 임베딩을 (분산 표현: distributed representation)이라고도 부름
** Word Embedding, 워드임베딩 : 쉽게 말해서 자연어를 컴퓨터가 처리할 수 있게 벡터화 하는 것
분산표현이 어떤 것이길래 유사성이 표현이 된다는 것일까???
분산표현은 " 비숫한 위치에서 등장하는 단어들은 비슷한 의미를 가진다." 라는 가정하에 만들어진 말이다.
영어로는 "share common contexts in the corpus are located close to one another in the space."
?? 그래서 원핫 인코딩이랑 뭐가 다른데??
Ex) 강아지 = [ 0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0]
(원핫 인코딩)
Ex) 강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2]
(워드투벡터)
다르지..? ㅎㅎ 각 차원이 실수형으로 표현 되면서 단어의 의미를 여러 차원에다 분산시킨다는 말이다.
Word2Vec에 사용되는 원리
2가지의 방식으로 Word2Vec이 진행되는데 -> 분산표현방식의 2가지 방법이다.
1. CBOW(Continuous Bag of Words)
2. Skip-gram
위 2가지 방법이 있다.
쉽게 말하면 CBOW는 주변의 단어로 중간의 단어를 예측, Skip-gram은 중간의 단어로 주변 단어들을 예측한다.
거기서 거기 같은데 뭐가 다를까? 알아보자
CBOW 방식부터 알아보자
주변단어를 통해 중간단어를 알아낸다고 했다.
위 링크의 예문과 그림을 이용해서 내 방식대로 이해해보자
예문 : "The fat cat sat on the mat"
가운데 단어를 예측하는 것이 CBOW라고 했다. {"The", "fat", "cat", "on", "the", "mat"}으로부터 sat을 예측하는 것은 CBOW가 하는 일이다.
이 때 예측해야하는 단어 sat을 중심 단어(center word)라고 하고, 예측에 사용되는 단어들을 주변 단어(context word)라고 한다.
즉, Center word를 추론해내려면 주변 단어들로써 추론을 해내야 한다.
그럼 그 Context word의 추론은???
-> 다른 곳에서는 Context word 였지만 이 친구도 한 Center word가 될 수 있다.
??? 그럼 순환논리에 빠지는 것이 아니냐??
-> 추론이라는 것에 대해 어떻게 생각하느냐에 따라 다른데..
사실 우리는 주어진 자연어로 벡터화하는 것 뿐이다.
Word2Vec에서 뜻을 추론하는 것이 아니란 얘기다.
그니까 순환논리에 빠지지도 않는다.
처음부터 도출해내는 것이 뜻이 아니라 주어진 단어 출현(word occurence)에서 단어 간의 관계이다.
(단어 출현은 corpus of text 상에 나와있으니까 ㅎ)
**저기 projection layer가 학습하는 계층 퍼셉트론(Perceptron) 가중치를 주는 곳이라고 보면되겠다.
음.. 저런식으로 학습된다고???
인풋이 많은데 어떻게 저 레이어에 들어가??? 라고 할 수 있다. (행렬계산을 통해 들어간다 ㅎ)
중간 레이어, 저기 projection layer 의 크기는 고정되어있다. M의 크기로 고정되어있다.
** M은 워드 임베딩 후의 차원을 뜻한다.(사용자 임의 설정 가능)
*차원이 높아질수록 계산속도 느려짐을 알고만 있으면 된다.
근데 그럼 그 가중치를 어떻게 해서 학습하겠다는 말이지..?? 라고 생각할 수 있다.
** V는 단어 집합의 크기가 되겠다. -> 즉 input 단어 전부
입력층과 투사층 사이의 가중치 W는 V × M 행렬이며
투사층에서 출력층사이의 가중치 W'는 M × V 행렬이다.
?? 왜 그렇게해??
우선 원소의 개수는 같을 것이다. 하지만 V x M과 M x V는 단순히 전치 행렬이 되는 것이 아니라
랜덤값이 된다.! (행렬 공부하면 안다)
++차원을 줄여서 연산하고 다시 차원을 똑같이 만들어준다.
다시 계산 어떻게 하는지 보자.
**윈도우 : 주변 단어
만약 윈도우 크기 n=2라면, 입력 벡터의 총 개수는 2n이므로 중간 단어를 예측하기 위해서는 총 4개가 입력 벡터로 사용된다. 평균을 구할 때는 4개의 결과 벡터에 대해서 평균을 구하게 된다.
-> 가중치를 적용한 결과의 평균을 말한다.
평균 벡터는 두번째 가중치 행렬 W'와 곱한다.
-> 원-핫 벡터와 차원이 동일하게 나와야함.
이 벡터에 CBOW는 소프트맥스(softmax) 함수를 취하는데, 소프트맥스 함수로 인한 출력값은 0과 1사이의 실수로, 각 원소의 총 합은 1이 되는 상태로 바꾼다.
이렇게 나온 벡터를 스코어 벡터(score vector)라고 하고 스코어 벡터의 각 차원 안에서의 값이 의미하는 것은 다음 한마디로 설명하겠다.
스코어 벡터의 j번째 인덱스가 가진 0과 1사이의 값은 j번째 단어가 중심 단어일 확률을 나타냄. 그리고 이 스코어 벡터는 우리가 실제로 값을 알고있는 벡터인 중심 단어 원-핫 벡터의 값에 가까워야함. 스코어 벡터를 y^라고 하자. 중심 단어를 y로 했을 때, 이 두 벡터값의 오차를 줄이기위해 CBOW는 손실 함수(loss function)로 cross-entropy 함수를 사용함.
-> 결국 소프트맥스의 의미: 정규화 + 확률계산
근데 원래 단어 집합의 크기가 엄청 크면...?
계산시간이 엄청나게 걸리겠죠잉ㅎ
위와 동일하게 Skip-gram은 반대인데.. 그냥 그림만 한 번 쭉 훑고 갑시다.
Skip-gram은 중심 단어에서 주변 단어를 예측하려고 하는 것이라고 앞에서 말함.
특징이 있다면
중심 단어에 대해서 주변 단어를 예측하기 때문에, 투사층에서 벡터들의 평균을 구하는 과정은 없다.
**전반적으로 "Skip-gram이 CBOW보다 성능이 좋다고 알려져 있습니다"라고 다들 말하던데.. 뭐 경우에 따라 다른 것이겠죠? 압도적으로 좋다면 반대의 알고리즘이 나올리가 없음.
언제 만들어졌나??
2013년에 만들어짐
2020년 현재의 Word2Vec의 위상은
이전의 임베딩 벡터 알고리즘과 비교하는 데 쓰인다.
Word2vec was created and published in 2013 by a team of researchers led by Tomas Mikolov at Google. Their two papers have been cited in the scientific literature 17231 and 21670 times, respectively (Google Scholar, 2 Aug 2020). The algorithm is patented. Other researchers helpfully analysed and explained the algorithm. Embedding vectors created using the Word2vec algorithm have some advantages compared to earlier algorithms such as latent semantic analysis.
Word2Vec이 쓰이는 곳
The word2vec algorithm uses a neural network model to learn word associations from a large corpus of text.
위에는 단어 연관성을 큰 텍스트에서 뽑아낸다고 하지만 지금은 구형 모델이 되어서
다른 알고리즘과의 성능 비교하는데 쓰입니다. 하지만 그건 그런대로 의미가 있죠 ㅎ
Word2Vec의 단점
1. 계산이 크다.
*one=hot encdoing -> 비효율
2. context 표현이 안됨
*사과 : 먹는거 사과 : 미안함의 표현
->결국 단어(모양)의 출현이지 단어(의미)의 출현이 아님
++유사도 비교 결과 왜 이게 비슷한 단어지? 라는 결과가 정말 많이 나옴ㅎ
그래서 계산이 오래 걸리면 답이 없는데...
왜냐면 머신러닝이든 딥러닝이든 엄청난 사이즈의 텍스트를 학습시키기 때문이다.
그래서 Word2Vec은 네거티브 샘플링(Negative Sampling)을 활용해서 단점을 극복하려고 하였다.
++ 샘플링(sampling)은 쉽게 말해서 표본추출을 말한다.
??그래서 네거티브 샘플링이 뭐고 왜하는데??
위에서 계산이 오래걸린다 그랬다. 소프트 맥스는 모든 원소의 합이 1이 되게 바꾼다했다.
즉, 원-핫 벡터로 만들기 전 가중치가 곱해져 소프트맥스를 적용하는 단계가 있다.
여기서 오차를 구하고 모든 단어에 대한 임베딩을 조정해야한다.
-> 여기서 모든 단어에 주목하자
그 벡터들의 크기는 단어 집합의 크기와 같다.
즉, large corpus of text 일수록 차원이 커진다는 소리다.
아까 차원의 저주 때문에 차원이 커질수록 속도가 느려진다고 했지??
실제로 뛰어난 성능을 위해선 Large text를 집어넣어야 하지만 Large text를 넣으면 속도가 떨어져 학습능력이 제대로 발휘할 수 없는 상황에 이르게 된다.
굳이 모든 단어, 즉 정말 주변 단어와 상관없는 단어도 조정하니까.. 느려지는 것이다.
??? 그럼 쓸모가 없어지잖아... 그러니까 이를 극복하기 위해서 찾아낸 방법이 바로!!!
네거티브 샘플링(Negative Sampling)이다.
네거티브 샘플링은 전체 단어 집합이었던 것을 일부만 샘플링 하겠다는 말이다.
그 샘플링에 들어가는 것들은?
주변 단어들 + 주변단어가 아닌 랜덤 단어들 일부(전체 x)
위의 조건에 해당하는 단어들을 적절히 가져와서 조정하겠다 이말이다.
이렇게 이루어진 set에 주변 단어들을 긍정(positive), 랜덤으로 샘플링 된 단어들을 부정(negative)로 둔 이후 이진 분류 문제로 풀어버리는 것이다.
** 솔직히 나도 아니 시간이 걸려도 다 학습시켜야 하는거 아니야? 라는 생각이 있었지만
내가 젓가락이 뭔지 배우려고 석기시대부터 배우는 거라고 생각하니까 바로 맘이 접어졌다. 다행 ㅎ
단점이 저렇게나 많은데 난 왜 이걸 공부하느냐...?
그냥.. 뭐 혹시 나올 것이 있지 않을까해서...ㅎ
Word2Vec의 성능을 높이는 방법에 대해서 고민해 볼 가치는 있다고 본다.
한 번 생각해보겠다.
'데이터 사이언스(Data Science) > 자연어 처리 ,NLP' 카테고리의 다른 글
자연어 처리에서의 용어 (0) | 2021.01.07 |
---|---|
Sequence to Sequence (S2S) 시퀀스 투 시퀀스란? (0) | 2021.01.07 |
딥러닝 챗봇 만들기 - 2 (파이썬 IDE, 개발환경만들기) (0) | 2020.12.19 |
딥러닝 챗봇 만들기 - 1(챗봇의 정의, 이해) (0) | 2020.12.18 |
[문서 유사도] 코사인 유사도 판단 (0) | 2020.08.20 |