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

[CS224N] Lecture 2 - Word Vectors and Word Senses

by misconstructed 2020. 8. 11.
728x90

Vector Space

  • word vector를 vector space에 위치시켰을 때, 유사한 의미를 보유하고 있으면 가까이 위치한다는 것을 알 수 있다.
    • high dimensional vector space에서는 한 단어가 다양한 다른 단어와 서로 다른 방향으로 인정합 수 있다.
    • 2차원 공간에 이러한 벡터들을 나타내는 경우, 이런 관계를 표현하지 못할 수 있다.
  • 벡터의 방향성에도 의미가 있다는 것을 알 수 있다.

Optimization

Gradient Descent

Gradient Descent

  • 손실 함수인 $ J(\theta) $ 를 최소화해야 한다.
    • 손실 함수의 gradient(기울기)를 계산해서, gradient의 반대 방향으로 조금씩 이동하게 된다.
      • 계속해서 기울기 반대 방향으로 이동하다 보면, 최종적으로 최소점으로 이동하게 된다.

$$ \theta^{new} = \theta^{old} - \alpha \triangledown_{\theta} J(\theta) $$

  • 위의 식에서 $ \alpha $ 는 step size(learning rate)을 의미한다.
    • 한 번에 얼마큼 이동할지 결정하게 된다.
  • $ \triangledown_{\theta} J(\theta) $ 는 손실 함수의 gradient(기울기)을 의미한다.
    • 전체 parameter( $ \theta $ ) 에 대해서 계산하는 것은 비용이 매우 크다(expensive to compute)
      • 그러므로 Stochastic Gradient Descent 방식을 사용한다.

Stochastic Gradient Descent 

  • 전체 데이터 중 일부 sample 만 사용한다.
    • 해당 sample 에 대해서만 gradient 를 계산해서 parameter를 업데이트한다.
    • 결국 점진적으로 최소점으로 이동하게 된다.
    • 상대적으로 noise 가 크다.
  • 여러개의 sample을 모아서 mini-batch 라고 부른다.
    • 보통 32개, 64개의 sample로 구성된다.
    • 장점으로는 여러개의 sample을 사용하기 때문에, noise가 줄어들고, 병렬화가 가능하다는 점이다.
      • 빠른 학습이 가능하다.

Word2vec

  • word2vec을 생성할 수 있는 두 가지 방법이 있다.
    1. Continuous Bag of Words(CBOW) : 모든 외부 단어로 가운데 단어를 예측하는 방식
    2. Skip-grams(SG) : 가운데 1개의 단어로 외부의 모든 단어를 예측하는 방식(Lecture1에서 설명한 방식)

Co-occurrence matrix

co-ocurrence matrix 예시

  • 과거에는 "window based co-occurrence matrix" 를 사용했다.
    • 전체 corpus 에 대한 co-occurrence 정보를 사용하는 방법이다. 
    • 특정 크기의 window 내에 나타나는 단어들을 모두 count
      • A라는 단어가 B에 인접하게 몇 번 사용되었는지 확인해서 matrix를 구성한다.
    • 유사한 쓰임/의미를 보유하고 있는 단어들끼리는 비슷한 벡터 구성을 보유하게 된다.
      • 왜냐하면 비슷한 단어들은 비슷한 환경/문맥에서 사용되기 때문에, 비슷한 단어들과 인접하게 된다.
    • 문제점
      1. sparse matrix를 형성하게 된다.
      2. 단어 수가 많아지는 경우 matrix의 크기가 커진다.
  • co-occurrence matrix로 생성된 word vector 들을 시각화해보니 syntactic/semantic pattern 이 발견되었다.
    • 유사한 형태의 단어들이 인접하게 위치
      • ex) take, taken, taking, took 등
    • linear property가 단어들 사이에 형성
      • ex) (janitor - clean) + swim = swimmer 근처의 벡터를 형성
      • 단순한 vector subtraction 만으로도 이러한 관계를 형성할 수 있다.

Count Based Vs Direct Prediction

  • Count based
    1. LSA, HAL, COALS, PCA 등
    2. Training 속도가 빠르다.
    3. 통계 정보를 효율적으로 사용한다.
    4. 단어의 유사도를 계산하는데만 사용할 수 있다.
      • 단어 사이의 관계를 확인할 순 없다.
      • 복잡한 패턴을 인식할 수 없다.
  • Direct prediction
    1. NNLM, HLBL, RNN, Skip-gram/CBOW 등
    2. 전체적인 통계 정보를 활용하지 않는다. (window 내의 데이터만 사용하기 때문)
    3. 대부분의 영역에서 좋은 성능을 내는 모델 생성할 수 있다.
    4. 단어 유사도에 대해 복잡한 패턴도 잡아낼 수 있다.

GloVe

  • word2vec은 window 내의 정보만 사용한다는 점에서 전체적인 문장에 대한 이해가 떨어진다는 단점을 가지고 있다.
  • Direct Prediction과 count based 방식을 합쳐서 적용
    • 임베딩된 단어벡터 간의 유사도 측정을 가능하게 하면서 corpus 전체의 통계정보도 함께 사용할 수 있도록 해보자
  • 임베딩된 두 단어벡터의 내적이 corpus 전체에서의 동시에 등장하는 확률의 로그값이 되도록 목적함수를 정의했다.

$$ w_i w_j = log{P(i|j)} $$

  • objective function(목적 함수)는 다음과 같이 정의한다.

objective function for GloVe

  • 장점
    • 작은 규모의 corpus에 대해서도 효과적으로 학습이 가능하다.
    • 자주 등장하지 않는 단어에 대해서도 효과적인 word vector를 생성할 수 있다.
    • 학습이 상대적으로 빠르다.

GloVe 예시

Word vector evaluation

  1. intrinsic evaluation : 올바르게 task 를 해결했는지 확인하는 방법
    • 쉽고 빠르게 검증할 수 있다.
    • 실제로 서비스에서 사용할 때 그 정도의 성능을 낼 수 있는지에 대한 보장은 하지 못한다.
    • ex) word vector analogy

word vector analogy

  1. extrinsic evaluation : 실제 시스템에서 사용해서 성능을 확인하는 방법
    • real task (application) 에서 성능을 확인한다.
    • ex) Named Entity Recognition (NER)

Word ambiguity

  • 많은 단어들은 여러개의 의미를 보유한다.
    • 그렇기 때문에, 한 단어를 사용해도 다른 의미로 사용되는 경우가 발생한다.
  • 동일한 단어의 서로 다른 의미를 표현하는 방법은 다음과 같다.

Multiple sensors for a word

  • 하나의 단어가 벡터 공간에서 서로 다른 cluster를 형성하는 경우, 해당 단어를 여러개로 분류해서 벡터를 생성한다.
    • ex) $ apple_1, apple_2, ..., apple_n $
  • 대부분의 의미를 확장되어서 사용되기 때문에 어느정도 연관이 있다.
    • 그렇기 때문에 의미를 구분하는 것이 명확하지 않을 수 있다.

Weighted average

  • 한 단어의 서로 다른 의미를 나타내는 벡터들에 가중치를 부여해서 weighted average를 사용한다.
    • ex) pike 라는 단어에 대해서 $ v_{pike_1}, v_{pike_2}, ... , v_{pike_n} $ 의 벡터가 존재한다면, pike 에 대한 최종 벡터 $ v_{pike} $ 는 다음과 같이 정의한다.

$$ v_{pike} = \alpha_1v_{pike_1} + \alpha_2v_{pike_2} + ... + \alpha_nv_{pike_n} $$

$$ \alpha_1 = \frac{f_1}{f_1 + f_2 + ... + f_n} $$

  • weighted average를 사용하는 경우 실제로 유의미한 결과를 제공한다.
    • 고차원 영역에서 해당 단어의 각 의미를 나타내는 벡터들을 sparse 하게 표현되기 때문에, 전체 벡터의 일부에 단어의 의미를 나타낼 수 있다.
728x90

댓글