본문 바로가기
대학원 이야기/CS224N : NLP with Deep Learning

[CS224N] Lecture 1 - Introduction and Word Vectors

by misconstructed 2020. 8. 10.
728x90

Stanford 에서 진행하는 CS224N : NLP with Deep Learning 을 듣고 정리한 내용입니다.


  • 과거에는 Human language 를 통해 지식을 전달했다.
    • 상대적을 slow network를 형성한다. (bandwidth 가 작다.)
      • 그러므로 내용을 축약해서 전달한다. : 대화하는 사람이 어느정도의 배경 지식을 보유하고 있다고 가정하고 대화를 한다. 그러므로 짧은 단어만 이용해서 더 많이 이해할 수 있다.
  • 우리가 이번 과정을 통해서 하고 싶은 것 : represent the meaning of words
  • common solution : WordNet 
    • 단어의 synonym 과 hypernyms 를 사용해서 dictionary 를 구성한다.
    • human labor를 통해서 구성된 hand-built resources이다.
    • 단어에 대한 어느정도의 의미를 제공할 수 있다. 
    • 문제점
      • 다양한 nuance를 놓친다.
      • 새로운 단어, slang 등에 취약하다. 해당 단어들에 대한 정보를 제공하지 못할 수 있다.
      • 단어들 사이의 similarity, relation을 제공할 수 없다.
        • 예를들어, good 와 marvelous, 두 단어는 서로 synset에 포함되어 있지 않지만, 어느 정도 서로의 의미를 포함하고 있다. WordNet을 사용하면 이러한 단어들 사이의 관계를 나타내기 힘들다.

One-hot vector

  • 과거(2012년 이전) NLP 에서 사용하던 word representation 방식
  • 각 단어에 대해 지정된 자리가 있다.
    • 해당 단어를 나타내기 위해서는 해당 단어의 지정된 자리만 1로 나타내고 나머지는 모두 0으로 나타낸다.
  • 문제점
    • 단어가 많아지면 벡터의 크기가 매우 커진다. 단어가 100만개 있다면, 벡터의 크기 또한 100만이 된다.
    • WordNet과 유사하게 단어들 사이의 관계를 나타내지 못한다.
      • 예를들어, motel을 검색하는 경우, hotel 이라는 연관된 단어를 제공하고 싶은데, one-hot 방식으로는 두 단어 사이의 관계를 인지할 수 없다.
  • 위 문제점들의 해결 방안으로 big table of word similarity를 사용할 수 있지만, $ N $ 개의 단어를 사용하는 경우, $ N^2 $ 크기의 테이블을 유지해야 하기 때문에 매우 비효율적이다.

Word vectors

  • word embedding 또는 word representation 이라고도 부른다.
  • 단어가 나타나는 context를 보고 해당 단어의 뜻을 예측한다.
  • one-hot 방식과는 달리, distributed representation을 사용한다.
    • 단어의 의미를 dense-vector로 표현한다. (모든 숫자가 0이 아닌 숫자로 구성된다.)
      • one-hot vector의 경우, 해당 단어를 나타내는 자리 하나만 1이고, 나머지는 모두 0으로 나타낸다.
    • 단어의 의미가 distributed over the dimensions
  • 모든 단어를 위치시킬 수 있는 vector space에 대해 생각해보자.
    • N 차원의 word vector를 우리가 보기 쉽게 시각화하기에는 한계가 있다.
    • 그러므로, 2차원 공간에 해단 벡터들을 투영해서 시각화한다.
      • 이러한 과정에서 일부 특징들이 사라졌을 수 있다.
    • 하지만, 단어들을 2차원 공간에 시각화하는 방식으로, 단어들 사이의 유사도를 시각적으로 볼 수 있다.

Word2Vec algorithm

  • simple, scalable way of learning vector representations
  • corpus(big pile of text)를 기반으로 생성한다.
    • 초반에는 모두 random vector 로 초기화한다.
    • 문장의 가장 첫 단어에서부터, 단어를 제공하면 단어 주변의 단어들을 예측하는 과정을 반복한다. (skip-gram 방식)
    • 이러한 과정을 계속해서 반복하다 보면, 해당 단어의 representation 을 생성해낼 수 있다.
  • 가운데 단어가 주어졌을 때, 인접한 단어가 나타날 확률을 계산한다.

$$ L(\Theta ) = \prod_{t=1}^{T} \prod_{-m\leq j \leq m}p(w_{t+j|w_t;\theta})) $$

  • $ P(w_t|w_{t+j}) $ : 가운데 단어 $ w_t $ 가 주어진 경우, 주변 단어 $ w_{t+j} $ 가 주어질 확률
  • $ m $ : window size
  • 전체 계산은 $ \Theta $ 에 의존적이다.
    • $ \Theta $ 는 vector representation for words = parameter
  • Objective function(손실 함수)는 다음과 같이 정의한다.

$$ J(\theta) = -\frac{1}{T} log{J(\Theta)} $$

  • 손식함수 $ J $ 가 작아지면, 다른 단어를 예측하는 성능이 좋아진다.
  • 학습 과정에서 한 단어에 2개의 vector 를 사용한다.
    • center word 일 때의 vector = $ v_w $
    • context word 일 때의 vector = $ u_w $
    • 최종적으로 두 벡터의 평균을 해당 단어의 word vector로 사용한다.

  • 위의 손실함수에서 $ P(o|c) $ 를 계산하는 방법은 위와  같다. 
    • categorical 문제에서 자주 사용하는 softmax distribution 을 사용한다.
      • $ exp() $ 내의 값이 크다면 결과값이 매우 커질 수 있도록(max) 한다.
    • 분자의 두 벡터 $ u^T_o, v_c $ 의 dot product는 두 벡터가 유사한(가깝게 위치하는) 경우 더 크게 나타난다.
      • similarity measure
      • $ exp() $ 는 최종적으로 probability 를 구해야 하기 때문에, 무조건 양수로 나올 수 있도록 한다.
    • 분모는 전체 vocab에 대해서 합을 구한다. 
      • 그러므로, 최종적으로 모든 단어의 확률의 합은 1이 될 수 있도록 한다.

gradient descent

  • Optimization : 어떻게 해야지 $ J(\theta) $ 의 값을 최소화할 수 있을까
    • parameter 값 ( $ \theta $ )을 변경해서, 기울기 반대 방향으로 이동하도록 한다.
      • 기울기 반대 방향으로 이동하면 결국 최소점으로 이동할 수 있다.
728x90

댓글