word2vec

word2vec

정리


  • 앞서 소개했던 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 ] 이 될 것이다.

    (그림1) 출처 : https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/29/NNLM/

  • 위의 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 학습을 진행한다.
(그림2) 출처 : https://towardsdatascience.com/introduction-to-word-embedding-and-word2vec-652d0c2060fa

  • Input Layer에는 One-Hot Encoding의 값이 들어간다.
    강아지 = [ 1 0 0 ] 의 값이 들어가는 것이다.
    x1 = 1 / x2 = 0 / x3 = 0

  • Hidden 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) 출처 : https://wikidocs.net/22660

  • (그림3)을 보면 중심 단어를 기준으로 앞뒤 2개의 단어를 학습데이터로 사용을 한다.

  • 주변 단어를 Input에 넣고 Hidden Layer를 거쳐서 Output Layer에서 나온 값이 중심 단어가 되도록 학습시키는 것이다.

(그림4) 출처 : https://wikidocs.net/22660

  • (그림4)는 (그림3)을 이해하기 쉽게 도식화한 이미지이다.

  • sat이라는 중심단어를 예측하기 위해 fat, cat, on, the와 같은 주변 단어를 입력하였다.

(그림5) https://wikidocs.net/22660

  • (그림5)를 보면 알 수 있듯이 4개의 벡터 값의 평균을 구하여 해당 Vector 값을 Word Vector로 사용한다.


Skip-Gram


  • Skip-gram은 CBOW와 반대로 중심단어를 사용해 주변단어를 예측하는 것이다.
    보통 CBOW보다 Skip-gram을 많이 사용한다고 하는데 이유는 다음과 같다.

  • CBOW에서는 주변단어를 4개를 사용해 predict를 하고 한 번만 역전파를 한다.
    하지만 skip-gram에서는 중심단어 1개를 사용해 predict를 하고 네 번 역전파를 진행한다.

  • 즉, skip-gram이 역전파하는 회수가 CBOW보다 더 많기 때문에 학습이 잘 된다고 한다.

(그림6) 출처 : https://wikidocs.net/22660



정리


  • word2vec을 이용해 단어의 vector를 구한다는 것은 NNLM의 신경망에서 학습된 가중치 벡터를 가져오는 것이다.

(그림7) 출처 : https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/

  • ( 그림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


Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×