정리
앞서 소개했던 BoW, TF-IDF는 Count Based Language Model에 속한다. 왜나하면 word를 vector로 표현할 때 단어의 빈도수를 특성으로 표현하기 때문이다.
이제부터 소개할 Language Model은 Neural Network Language Model이다.
NNLM에는 word2vec, FASTTEXT, Glove와 같은 방법들이 존재한다.
Count Based Language Model의 문제점
Problem 1 : 하나의 단어를 표현하는데 큰 벡터가 필요하다.
기존의 원 핫 인코딩에서 하나의 Column은 사전에 등록된 단어를 의미했다.
강아지 : [ 1 0 0 ]
멍멍이 : [ 0 1 0 ]
고양이 : [ 0 0 1 ]만약 사전에 30,000개의 단어가 들어있다면 하나의 단어를 표현하기 위해서는 30,000 차원이 필요하다. ( Count Based LM은 듬성 듬성한 Sparse Vector의 모습을 가지게 된다. )
큰 차원의 벡터는 계산복잡성이 크고 메모리 문제가 존재한다. 그리고 실제 위의 벡터에서 필요한 값은 1이 들어간 하나의 요소 뿐이고 나머지는 불필요한 0들만 포함되어 있다.
Problem2 : 단어와의 관련성을 파악할 수 없다.
예를 들어 “강아지”와 멍멍이”가 유사하다는 것을 Count Based LM에서는 알 수 없었다. 저런 형태로는 관계를 전혀 파악할 수가 없다.
강아지 : [ 1 0 0 ]
멍멍이 : [ 0 1 0 ]또한 위의 Vector를 내적하면 0이 된다. 길이가 1인 두 벡터의 내적은 두 벡터 사이의 각도가 되므로 두 벡터가 직교한다는 의미가 된다.
이를 확장해서 생각하면 원 핫 인코딩은 서로 독립한다는 것을 알 수 있다.
즉, 모든 단어들이 서로 영향을 미치지 않는 다는 것을 의미한다.
Distributed Representation
위의 문제들을 해결하기 위해 Distributed Representation(분산 표상)을 사용한다.
( 그림1 )을 보면 총 9개의 도형이 있다.
초록색 해 / 초록색 달 / 초록색 구름
파란색 해 / 파란색 달 / 파란색 구름
주황색 해 / 주황색 달 / 주황색 구름만약 파란색 해를 One hot encoding으로 표현한다면 [ 0 0 0 1 0 0 0 0 0 ] 이 될 것이다.
위의 9차원 벡터는 2차원 벡터로도 표현 가능하다. 각 도형의 속성인 colors와 shapes를 조합하여 9개의 도형을 표현할 수 있기 때문이다.
분산표상은 데이터의 차원수를 줄여주기도 하지만 개체간 유사성을 비교할 수도 있게 만든다. 의미가 유사한 단어는 벡터 공간에서 가깝게, 반대의 경우에는 멀게 배치하는 것이 분산표상의 목표이다.
Word2vec에서 단어 vector는 “강아지” = [ 0.2, 1.8, 2.8 … , -7.2 ]와 같이 표현된다.
이전의 Count-Based LM에서 vector의 column은 사전에 등록된 단어를 의미했다.
그렇다면 Word2vec에서 vector의 column은 위에서 언급한 colors, shapes와 같은 특성을 의미하는 것일까?
정답은 아니다. 그렇게 딱 딱 떨어지는 것이 아닌 colors와 shapes의 특성이 혼합된 것을 의미한다.
즉 “강아지”라는 단어 vector에서 0.2 가 동물, 1.8이 종류를 나타내는 것이 아니다. 여러 특성이 섞여서 수치로 표현 되는 것이다.
“강아지” = [ 0.2, 1.8, 2.8 … , -7.2 ]와 같이 vector의 값이 dense(빽빽하게) 있기 때문에 dense vector라고도 한다.
Neural Network Language Model
- 위에서 설명한 분산 표상을 가지는 Vector를 만들기 위해서 Shallow Neural Net 학습을 진행한다.
Input Layer에는 One-Hot Encoding의 값이 들어간다.
강아지 = [ 1 0 0 ] 의 값이 들어가는 것이다.
x1 = 1 / x2 = 0 / x3 = 0Hidden Layer에서 Weight와 Bias의 값이 존재한다.
Hidden Layer의 노드 개수는 사용자가 정의한다. ( Hidden Layer의 노드 개수가 embedding dimention을 의미한다. )
보통 128 / 256 / 512와 같이 2의 배수를 사용해서 정의한다. ( 딥러닝 학습 연산과 관련이 있다.)
Output Layer에서는 Input Layer와 노드의 개수가 같다.
(Input Layer와 Output Layer 노드 개수는 One-hot Encoding의 dictionary 개수와 같다.)
출력값은 [ 0 1 0 ] 을 가지게 된다.
y1 = 0 / y2 = 1 / y3 = 0
멍멍이 = [ 0 1 0 ]NNLM의 학습은 다음 단어가 무엇인지를 예측하는 방식으로 이루어진다.
“The fat cat sat on the mat” 이라는 문장이 있다.
Input에는 The = [ 1 0 0 0 0 0 0 ] 이 들어가고 hidden layer를 거쳐서 predict 한 값이 [ 0 1 0 0 0 0 0 ]이 되도록 학습을 진행하다는 것이다.이렇게 학습을 진행하면 단어간의 의미적인 관계가 담겨있는 weight vector가 생성된다는 것이 NNLM의 기본개념이다.
CBOW와 Skip-gram을 설명하면서 더 자세하게 설명하겠다.
CBOW
NNLM의 학습 방법은 CBOW와 Skip-Gram 방법이 존재한다.
CBOW는 주변 단어를 사용해 중간 단어를 예측하는 방법을 의미한다.
(그림3)을 보면 중심 단어를 기준으로 앞뒤 2개의 단어를 학습데이터로 사용을 한다.
주변 단어를 Input에 넣고 Hidden Layer를 거쳐서 Output Layer에서 나온 값이 중심 단어가 되도록 학습시키는 것이다.
(그림4)는 (그림3)을 이해하기 쉽게 도식화한 이미지이다.
sat이라는 중심단어를 예측하기 위해 fat, cat, on, the와 같은 주변 단어를 입력하였다.
- (그림5)를 보면 알 수 있듯이 4개의 벡터 값의 평균을 구하여 해당 Vector 값을 Word Vector로 사용한다.
Skip-Gram
Skip-gram은 CBOW와 반대로 중심단어를 사용해 주변단어를 예측하는 것이다.
보통 CBOW보다 Skip-gram을 많이 사용한다고 하는데 이유는 다음과 같다.CBOW에서는 주변단어를 4개를 사용해 predict를 하고 한 번만 역전파를 한다.
하지만 skip-gram에서는 중심단어 1개를 사용해 predict를 하고 네 번 역전파를 진행한다.즉, skip-gram이 역전파하는 회수가 CBOW보다 더 많기 때문에 학습이 잘 된다고 한다.
정리
- word2vec을 이용해 단어의 vector를 구한다는 것은 NNLM의 신경망에서 학습된 가중치 벡터를 가져오는 것이다.
( 그림7 ) 과 같이 좌측 행렬은 단어를 의미하는 행렬이고 우측 행렬은 weight vector이다.
“강아지”라는 단어는 [ 10 12 19 ] 라는 벡터로 표현되는 것이다.
이것은 weight vector의 행이 단어의 벡터를 의미한다고 볼 수 있다.왜냐하면 [ 0 0 0 1 0 ]에서 보는 것처럼 0과 곱해지면서 1이 포함된 weight vector의 행만 출력이 되기 때문이다.
(말로 잘 설명이 안되네요… 행렬의 곱셈을 할 줄 아는 사람이라면 충분히 이해할 것이라 생각합니다.)그렇다면 weight vector는 어디서 가져올까?
wiki-docs 와 같은 데이터를 Pre-trained한 Weight vector 값을 가져올 수 있다.
아니면 자신의 목적에 맞게 학습을 시켜 Weight vector를 생성하고 그 vector 값을 가져와 사용할 수 있다.
wiki-docs에서 사전에 학습한 weight vector 값을 가져온다고 가정해보자.
wiki-docs가 많은 단어를 가지고 있기는 하지만 내가 사용하는 데이터의 단어를 가지고 있지 않은 경우도있을 것이다.그런 경우에는 해당 단어의 vector 값을 random 하게 부여하기도 하고 값을 크게 부여하기도 한다.
자기가 설계하기 나름이다.기존의 Count Based LM에서는 사전의 단어 개수가 차원수 였다면 NNLM에서는 사용자가embedding_dim을 몇으로 정의하는가에 따라 단어의 차원수가 정해진다. ( 처음에는 이게 이해가 안 되서 고생을 했다. )
공부할 때 참고했던 URL
[URL] : https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/
- word2vec 학습 방식
- 개괄적으로 잘 설명해두었다.
[URL] : https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/29/NNLM/
- Distributed Representation 잘 설명
- Neural Network Language Model을 설명
[URL] : https://wikidocs.net/22660
- NNLM의 학습방법에 대해 매우 자세히 설명되어 있다.
-
- Count-Based LM 부터 NNLM의 방법까지 잘 설명되어 있다.
[URL] : https://lovit.github.io/nlp/2018/04/05/space_odyssey_of_word2vec/
- 코드와 구체적인 예시등이 설명되어 있다.
[URL] : https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/tutorials/word2vec/
- 텐서플로우 코리아 word2vec 문서