Deep Learning/CS224N

[CS224N] SVD, Word2Vec를 통한 NLP

언킴 2021. 7. 20. 09:58
반응형

스탠포드 대학에서 열리는 Natural Language Processing with Deep Learning CS224N 강의를 요약했다. 

 

- Introduction to NLP

- Word Vectors

   $\cdot$ Representations

   $\cdot$ Count-Based Models (SVD Methods)

   $\cdot$ Neural Network-Based Models (Word2Vec)

 


Human Language가 특별한 이유는 무엇인가? 사람의 언어는 의미를 전달하기 위해 특별하게 구성된 시스템이라고 말한다. 언어는 signifier(기호) 에 매핑된 signified(개념, 의미)라고 한다. 사람이 Rocket이라는 단어(signifier)를 보고 로켓을 연상해 낸다.

 

자연어는 discrete, symbolic, categorical system이라고 할 수 있다. 

 

 

 

NLP란 무엇인가?

컴퓨터가 어떠한 작업을 수행하기 위해 인간의 언어를 '이해'할 수 있도록 알고리즘을 설계하는 것이며, NLP의 종류에 대표적인 것으로는 기계번역, 정보검색, 감성분석, 정보추출, 질의응답 등이 있다.

 

 

 

WordNet

컴퓨터에게 단어를 표현하는 가장 간단한 방법으로는 WordNet과 같이 유의어(synonym)와 상위어(hypernym) 시소러스(사전)를 사용하는 것이다. 상위어라는 개념은 '밑바닥부터 시작하는 딥러닝', '점프 투 파이썬' 을 상위어에 해당하는 '책'으로 표현하는 것처럼 포괄적인 의미라 할 수 있다.  하지만 이러한 어휘 사전에는 아래와 같은 문제점이 생긴다.

 

 

문제점

1. 단어에 대한 의미의 차이가 있다. ( 특정 문장에서만 유의어에 해당하는 문제 )

2. 신조어에 대해 일일이 반영해 주기 힘듦. ( 만반잘부, 인싸 등 )

3. 사람마다 단어를 보는 의미가 주관적이다.

4. 단어와 단어간의 유사도를 계산할 수 없다. 

 

시소러스

 

 

 

One-hot Vector

단어를 벡터로 표현할 수 있는 가장 간단한 방법 중 하나이다. one-hot vector는 단어 하나하나를 discrete symbols로 간주하여 벡터로 나타내는데 이를 'localist' representation 이라고도 한다. 벡터로 표현할 때에는 해당 인덱스의 값만 1이고 나머지는 0으로 표현하고 벡터의 차원은 $\mathbb{R^{|v| \times 1}}$가 된다.

하지만 $w = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$ 형태로 단어들 간 orthogonal(직교) 하기 때문에 유사도 계산이 불가하고, $|v|$의 개수가 커지면 matrix내의 공간이 sparse 하며 차원이 커지게 되는 문제점이 있다. 

 

 

 

 

Representing words by their context

one-hot vector의 문제점을 해결하고자 분포 가설을 이용한 Representing words by their context가 제안되었다.분포 가설은 동일한 문맥에서 사용되는 단어는 비슷한 의미를 가지는 경향이 있음을 의미한다. 단어 w가 출현할 때 window-size 내 단어들의 집합인 w의 context는 주변에 나타난다는 뜻이다. w 주변의 context를 사용해 해당 단어w의 representation을 생성한다.  

 

 

위와 같은 Word Vector Representation 하는 방법은 총 두가지 방법이 있다. 

1. Count-Based Models 

2. Neural Network-Based Model

 

 

 

1. Count-Based Models

Count-Based Models에서 가장 대표적인 방법은 SVD(Singular Value Decomposition) 이라는 방법이 있다. SVD는 단어 벡터 차원을 축소하는 한 가지 방법이고, SVD를 통해 나온 행렬 U의 행이 단어 벡터를 의미한다. SVD는 행렬 M이 있으면 그 행렬을 outer-product를 통해서 $U$(Left singular vectors), $\Sigma$(Singular values), $V^{T}$(Right singular vectors)로 분해한다. 기하학적 관점으로 바라보면 선형 변환 M에 의한 도형의 변환 결과는 형태적으로 봤을 때 M의 특이값($\Sigma$)에 의해서만 결정된다. $U$와 $V^{T}$은 축만 회전시키는 역할을 한다.

 

 

 

 

여러 문장들을 조합해 BoW를 만들고, 해당하는 단어가 나타나는 횟수를 카운팅해 Co-occurrence Matrix를 만들어준 후 SVD를 적용하게 된다. SVD를 적용하게 되면 아래와 같이 $M=U\Sigma V^{T}$로 2개의 eigen vector와 하나의 eigen value로 출력이 된다.  ${\Sigma^{k}_{i = 1} \sigma_{i} \over \Sigma^{|V|}_{i=1} \sigma_{i} } > \theta $를 만족하는 k를 구해 k개의 차원으로 축소시킨다.

 

 

문제점

1. 새로운 단어 출현으로 인해 Matrix의 차원이 자주 바뀐다. $\rightarrow$ SVD를 다시 계산해야된다. 

2. 대부분의 단어가 동시에 출현하지 않으므로 Matrix가 매우 sparse하다.

3. 일반적으로 Matrix는 매우 높은 차원을 가진다.

4. 계산 비용이 높다 $\rightarrow$ mxn Matrix인 경우 $mn^{2}$의 복잡도를 가짐.

 

해당 문제점을 보완하기 위해서는 stop words를 제거해주거나 Window size에서 단어의 거리를 반영해주는 ramp window를 적용 혹은 단순 카운팅이 아닌 Pearson correlation & negative count를 사용해주는 방법 등이 있다. 

(ramp window = 단어에 대한 거리가 떨어질 때마다 가중치를 다르게 주는 방법)

 

 

 

 

2. Neural Network-Based Models - Word2Vec


Word2Vec은 기존 모델들 보다 계산 속도도 빠르고, 성능도 좋은 신경망 모델이다. Word2Vec에는 Continuous Bag-of-Words (CBOW)와 Skip-gram 두 개의 알고리즘이 있다. 

 

CBOW

CBOW는 주변 context 단어들로 부터 하나의 타겟 단어를 예측하는 모델이다. NNLM에서 비선형 은닉층을 제거한 구조와 유사하며, Bag-of-Word 모델과 동일하게 단어의 순서를 고려하지 않기 때문에 CBOW라고 부른다. 기존의 NNLM모델에서 hidden layer를 줄였기 때문에 계산의 속도가 빨라졌다고 할 수 있다. CBOW의 loss function은 cross entropy를 사용하게 된다. 

 

주황색 : 행 벡터, 초록색 : 열벡터

 

 

Skip-gram

Skip-gram은 CBOW와 반대로 하나의 단어에서 주변 context 단어를 예측하는 모델이다.  CBOW와 다른 점은 input을 하나의 단어가 들어가고 output으로는 주면 context의 단어 window-size만큼 출력이 된다. 마찬가지로 negative log를 취해서 loss function으로 사용한다. 

 

 

문제점

$W,W^{\prime}$ 두 벡터가 별개의 Words Vectors 이기 때문에 각각을 학습시키기에 다소 비효율적이다. 그리고 전체 단어에 대한 softmax값을 취해줘야해서 계산량이 많아지고, 해당 window-size가 커지면 커질수록 학습시켜야 되는 양이 많아지면서 계산 시간이 오래걸리는 문제가 발생할 수 있다. Word2Vec의 효율적인 학습을 위해 다음과 같은 방법을 제시했다. 

$\cdot$ Subsampling of Frequent Words 

$\cdot$ Hierarchical Softmax 

$\cdot$ Negative Sampling (NEG)

 

 

Subsampling of Frequent Words : 너무 자주 출현하는 단어는 적게 나타내는 단어들 보다 정보의 가치가 없다고 가정하고 해당 단어들의 학습을 덜시키는 것이 Subsampling의 목적이다. 

 

 

 

Hierarchical Softmax Morin & Bengio가 처음으로 제안한 방법이며, 모든 단어의 $|V|$를 출력하는 것이 아니라 이진 트리( Binary Tree ) 형태로 나타낸 방법이다. 원래 모델과 동일하지만 마지막 softmax 부분에서 Hierarchical Softmax를 적용하게 된다. 해당 논문에서는 Softmax를 적용할 때 Huffman Tree를 사용했다고 한다. Huffman Tree는 text 압축을 위해 많이 사용되는 방법이며, 해당 단어와 빈도수가 주어졌을 경우 해당 빈도수가 많은 순서로 단어를 나열해 준다. 그리고 해당 빈도수가 적은 쪽에서 부터 짝을 이루어나가면서 이진 트리를 구성하는 방법이다.  

 

 

 

Negative Sampling (NEG) : NEG는 Noise Contrastive Estimation(NCE)의 변형이며 '좋은 모델은 로지스틱 회귀를 통해 노이즈를 구별할 수 있어야 한다'라는 것이 가정이다.