본문 바로가기
Coursera 강의/Deep Learning

NLP and Word Embeddings: Word2vec & GloVe

by 별준 2020. 12. 26.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 다섯 번째 강의 Recurrent Neural Network를 듣고 정리한 내용입니다. (Week 2)

 

[Learning word embeddings]

단어 임베딩(Word Embedding) 딥러닝 연구에서 초반에는 비교적 복잡한 알고리즘으로 시작했다. 그리고 시간이 지나면서, 훨씬 더 간단하고 단순한 알고리즘도 가능하고, 특히 큰 데이터셋에서 매우 좋은 결과를 얻을 수 있다는 것을 발견하게 되었다. 최근 가장 인기있는 몇몇의 알고리즘들은 너무 단순해서 마치 마법처럼 보일 수도 있을 정도이다.

 

단어 임베딩이 어떻게 동작하는지 직관적으로 이해하기 위해서 더 복잡한 알고리즘의 일부를 살펴보도록 하자.

 

Language model을 만들고, I want a glass of orange _______. 에서 orange 다음의 단어를 예측하려고 한다.

주어진 단어들은 위와 같은 index를 가지도록 했다. 

 

Neural language model은 embedding을 학습할 수 있는 방법이라고 밝혀졌다. 그리고 신경망 모델을 만들어서 연속적인 단어들을 통해서 다음 단어를 예측할 수 있는데, 첫번째 단어부터 시작해보자.

첫번째 단어 I의 one-hot vector \(o_{4343}\)이 있고, Matrix E를 통해서 vector \(e_{4343}\)을 얻을 수 있습니다. 다른 모든 단어도 동일하게 Matrix E를 통해서 vector를 얻을 수 있다. Matrix E를 통해서 얻은 vector들은 모두 300차원 vector이고, 이것을 신경망의 입력으로 사용하고 그 output은 softmax를 통해서 voca의 확률들로 변환된다.

신경망과 softmax layer는 각각의 weight와 bias 파라미터가 있고, 각 단어들은 300차원의 vector이므로 입력은 총 1800차원의 벡터가 된다.

 

일반적으로 fixed historical window를 사용하는데, 예를 들어, 다음 단어를 예측하는데 그 단어 앞의 4개의 단어만 사용하는 것이다. 따라서, 긴 문장이나 짧은 문장이나 항상 바로 앞의 4개의 단어만 살펴보는 것이다. 이것은 입력으로 1200차원의 vector를 사용해서 softmax output으로 예측하는 것을 의미한다. 

여기서 4개의 단어 사용은 하이퍼 파라미터로 설정할 수 있고, 이렇게 고정된 범위의 단어를 사용한다는 것은 입력의 크기가 항상 고정되어 있기 때문에 임의의 긴 문장들을 다룰 수 있다. 

따라서, 이 모델의 파라미터는 Matrix E와 \(W^{[1]}, b^{[1]}, W^{[2]}, b^{[2]}\)가 되며, Matrix E는 모든 단어에 동일하게 사용된다.

이 알고리즘은 꽤 괜찮은 word embedding을 학습하게 되고, 만약 orange가 아닌 apple이나 durian이 오더라도 유사한 단어라면 juice를 예측할 수 있게 되는 것이다.

 

중요한 것은 Matrix E를 학습한다는 것이고, 이제 이 알고리즘을 일반화해서 어떻게 더 단순한 알고리즘을 도출할 수 있는지 살펴보자.

좀 더 복잡한 문장 I want a glass of orange juice to go along with my cereal 이 있고, juice를 예측한다고 할 때, target은 juice가 된다. 그리고 앞서 살펴봤듯이 language model을 구성할 때, 입력으로 바로 앞의 4개의 단어를 선택했는데, 왼쪽과 오른쪽 4개의 단어를 선택할 수도 있고, 다른 Context를 선택할 수도 있다.

조금 더 단순하게 사용한다면 마지막 한 단어만 선택할 수도 있고, 가장 가까운 단어 하나를 사용할 수도 있다.

 

다음 영상에서 더 간단한 Context와 더 간단한 알고리즘을 통해서 어떻게 target word를 예측하게 되는지, 어떻게 좋은 단어 임베딩을 학습할 수 있는지 살펴보자.

 

[Word2Vec]

Word2Vec는 단어를 벡터로 바꾸어주는 알고리즘이고, 그 방법중의 하나인 Skip gram에 대해 알아보자.

Skip gram은 중심이 되는 단어를 무작위로 선택하고 주변 단어를 예측하는 방법으로, 중심 단어가 Context(입력)이 되고 주변 단어를 선택해서 Target(prediction)이 되도록 하는 superivsed learning이다. (주변 단어는 여러개를 선택할 수 있다)

 

다음으로 Skip gram의 모델이다.

1만개의 voca가 있고, 이 단어들을 통해서 Context c에서 Target t를 매핑하는 모델을 학습해야 한다. 

입력과 결과의 예를 들면, orange와 juice가 될 수 있다.

이전 강의에서 본 것처럼, 단어들의 one-hot vector와 Embedding Matrix E를 통해서 Embedding vector를 구할 수 있다. 그리고 이렇게 구한 Embedding vector를 입력으로 softmax layer를 통과해서 output \(\hat{y}\)를 구할 수 있다.

 

softmax output을 자세하게 나타내면 아래와 같이 나타낼 수 있다.

\[p(t|c) = \frac{e^{\theta_t^T e_c}}{\sum_{j=1}^{10,000}e^{\theta_j^T e_c}}\]

여기서 \(\theta_t\)는 output과 관련된 weight parameter고, bias는 생략했다.

 

Loss는 negative log liklihood를 사용해서 아래와 같이 구할 수 있다.

\[\mathscr{L}(\hat{y}, y) = -\sum_{i=1}^{10,000}y_i log\hat{y}_i\]

output \(\hat{y}\)는 1만 차원을 가지고, 가능한 1만개의 단어의 확률들을 포함한다.

 

하지만, 이 skip gram model에는 몇 가지 문제가 존재하는데, 주된 문제는 바로 계산 속도이다. 

특히 softmax model의 경우에 확률을 계산할 때 1만개의 단어를 계산해야한다. (\(p(t|c)\)의 분모항)

만약 10만개, 또는 100만개의 단어를 사용한다면 매번 분모를 합산하는 것은 매우 느리다.

이에 대한 몇 가지 해결 방법이 존재하는데, 그 중 한가지가 hierarchical softmax를 사용하는 것이다.

 

이 방법은 Tree를 사용하는 것인데, 자주 사용되는 단어일수록 Tree의 Top에 위치하고, 그렇지 않다면 Bottom에 위치하게 된다. 따라서 어느 한 단어를 찾을 때, Tree를 찾아 내려가기 때문에 선형 크기가 아닌 voca 사이즈의 log 사이즈로 탐색하게 되어 softmax보다 빠르다. 자세한 내용은 논문을 참조하면 된다.

 

Word2Vec의 또 다른 방법은 Negative Sampling인데, 이것에 대해 설명하기 전에 어떻게 Context c를 샘플링하는 지에 대해서 이야기를 해보자.

Context c를 샘플링하면, Target t를 context의 앞뒤 10단어 내에서 샘플링할 수 있다. 여기서 context c를 선택하는 한가지 방법은 무작위로 균일하게 샘플링하는 것이다. 하지만, 이렇게 무작위로 하게 된다면 the, of, a, to 등이 아주 빈번하게 샘플링된다. 따라서 샘플링할 때에는 빈번한 단어들과 그렇지 않은 단어들간의 균형을 맞추기 위해서 다른 방법을 사용해야 한다.

 

[Negative Sampling]

지금까지 Skip gram 모델을 살펴보았는데, skip gram 모델은 softmax 연산이 너무 느린 문제점이 있었다. 

다음으로 skip gram과 유사한 Negative Sampling이라는 알고리즘에 대해서 살펴볼 것인데, 이것이 skip gram보다 조금 더 효율적이다.

 

Negative sampling은 새로운 학습 문제를 정의한다. 예를 들어서 문제로 orange-juice와 같은 positive training set이 있다면, 무작위로 negative training set을 K개를 샘플링한다. 이때, 무작위로 negative 단어를 선택할 때에는 voca에 존재하는 단어 중에서 무작위로 선택하면 된다. 

하지만, 우연히 'of'라는 단어를 선택할 수도 있는데, 이는 context에 존재하는 단어이므로 실제로는 positive이지만, 일단 negative라고 취급한다.

 

negative sampling은 이렇게 training set을 생성하게 된다.

이 방법을 사용할 때에 작은 데이터 셋의 경우에는 K를 5~20의 값으로 추천하고, 큰 데이터 셋을 가지고 있다면 K를 더 작은 값인 2~5의 값으로 추천한다. 위 슬라이드에서는 K=4로 설정했다.

 

다음은 x->y mappling model이다.

앞서 본 softmax model이 있고, 이전 슬라이드에서 선택한 training set가 있다. 즉 context와 target이 input x가 되고, positive와 negative는 output y가 된다. 그래서 우리는 logistic regression model로 정의할 수 있게 된다. 

이렇게 하면 1만 차원의 softmax가 아닌 1만 차원의 이진분류 문제가 되어서 계산량이 훨씬 줄어들게 된다.

그리고 모든 iteration과정에서 한개의 positive와 K개의 negative 샘플만 학습하고 있다.

 

이 알고리즘에서 가장 중요한 점은 어떻게 negative sample을 선택하느냐인데, 한 가지 할 수 있는 방법은 말뭉치(corpus)에서의 empirical frequency(경험적 빈도)에 따라서 샘플링하는 것이다. 그래서 얼마나 자주 다른 단어들이 나타나는 지에 따라서 샘플링할 수 있다. 문제는 the, a, of, to와 같은 단어들이 자주 나타날 수 있다는 것이다.

 

또 다른 극단적인 방법은 1/voca size를 사용해서 무작위로 샘플링하는 것이다. 이 방법은 영어 단어의 분포를 생각하지 않는다.

논문의 저자는 경험적으로 가장 좋은 방법을 직접 찾아서 사용하는 것이 좋다고 한다. 논문에서는 단어 빈도의 3/4제곱에 비례하는 샘플링을 진행했다.

 

[GloVe word vectors]

단어 임베딩의 또 다른 알고리즘은 GloVe 알고리즘이다. Word2Vec or skip gram model만큼 사용되지는 않지만, 꽤 단순하기 때문에 사용된다.

 

GloVe는 gloval vectors for word representation를 뜻한다.

GloVe 알고리즘은 말뭉치(corpus)에서 context와 target 단어들에 대해서 i의 context에서 j가 몇 번 나타내는지(\(X_{ij}\)) 구하는 작업을 한다. 즉, 서로 가까운 단어를 캡처하며, context와 target의 범위를 어떻게 지정하느냐에 따라서 \(X_{ij} == X_{ji}\)가 될 수도 있고, 아닐 수도 있다.

 

GloVe 모델이 하는 것은 아래 식을 최적화하는 것이다.

\[\text{minimize }\sum_{i=1}^{10,000} \sum_{j=1}^{10,000}f(X_{ij})(\Theta_i^T e_j + b_i +b_j' - logX_{ij})^2\]

위 식에서 \(f(X_{ij})\)를 설정하는데, 이는 weighting term이고, 이것이 하는 일은 한번도 등장하지 않는 경우에는 0으로 설정해서 더하지 않게 해주고, 지나치게 빈도가 높거나 낮은 단어로 인해서 \(X_{ij}\)값이 특정값 이상으로 튀는 것을 방지하는 역할을 한다.

 

마지막으로 이 알고리즘에서 흥미로운 점은 \(\theta_i와 e_j\)가 완전히 대칭적이라는 것이다. 

 

[Sentiment classification]

Sentiment classification(감성 분류)는 NLP에서 중요한 구성요소 중의 하나이다. 감성 분류에서 중요한 점은 많은 dataset이 아니더라도 단어 임베딩을 사용해서 좋은 성능의 분류기를 만들 수 있다는 것이다.

 

Sentiment classification problem은 위와 같은 매핑 문제이다.

간단한 모델은 아래와 같이 구성할 수 있다.

'The dessert is excellent'라는 입력이 있을 때, 각 단어들을 임베딩 vector(300D)로 변환하고 각 단어의 벡터의 값들의 평균을 구해서 softmax output으로 결과를 예측하는 모델을 만들 수 있다. 

여기서 단어 임베딩을 사용했기 때문에, 작은 dataset이나 자주 사용되지 않는 단어(심지어 학습에 사용되지 않는 단어)가 입력으로 들어오더라도 해당 모델에 적용이 가능하다.

 

하지만 위 모델은 단어의 순서를 무시하고 단순 나열된 형태로 입력하기 때문에 별로 좋은 모델은 아니다.

예를 들어 'Completely lacking in good taste, good service, and good ambience'라는 리뷰가 있다면, good이라는 단어가 많이 나왔기 때문에 positive로 예측할 수도 있다는 것이다.

 

그래서 해당 문제점을 해결하기 위해서 RNN을 사용할 수 있다.

방금 예시처럼 부정의 리뷰를 입력으로 사용하더라도 시퀀스의 순서를 고려하기 때문에 해당 리뷰가 부정적이라는 것을 알 수 있게 된다. 따라서 이 모델로 학습하면 상당히 괜찮은 분류기가 된다. 또한 absent라는 단어가 training set에 존재하지 않았더라도 단어 임베딩에 포함이 된다면, 일반화되어서 제대로 된 결과를 얻을 수 있다.

 

[Debiasing word embeddings]

Machine Learning과 AI 알고리즘은 매우 중요한 결정을 하는데 도움이 되거나, 많은 도움을 줄 수 있다고 신뢰받고 있다. 그래서 우리는 bias(편견)에서 자유롭다는 것을 확인하고 싶어한다.(예를들어, 성이나 인종에 대한 편견을 가지지 않는 알고리즘이기를 원한다.)

이번 강의에서는 단어 임베딩에서 이러한 편견들이 있을때, 어떻게 이런 편견들을 제거하거나 감소시키는 방법에 대해서 알아보도록 하자.

 

단어 임베딩에서 성별이나 나이, 인종 등의 편견을 반영하기 때문에 이것을 없애는 것은 매우 중요하다. (많은 결정에서 AI가 사용되므로) 

 

단어 임베딩에서 편견은 다음과 같은 과정을 거쳐서 제거할 수 있다.

1. 먼저 bias의 direction을 구한다. 

만약 성별의 direction을 구한다면, \(e_{he} - e_{she}, e_{male}-e_{female}\) 등의 성별을 나타낼 수 있는 단어들의 차이를 구해서 구할 수 있는데, 남성성의 단어와 여성성의 단어의 차이를 구해서 평균으로 그 방향을 결정할 수 있다.

(실제로는 더 복잡한 SVD-특이값분해라는 알고리즘을 통해서 bias direction을 구한다)

그리고 이것은 1D의 bias direction과 나머지 299D의 non-bias direction으로 나눌 수 있다. 

 

2. 다음으로는 Neutralize(중성화) 작업을 수행한다.

bias가 없어야 하는 단어들에 대해서 bias 요소를 제거해야하는데, project를 통해서 각 단어 벡터의 bias direction 요소를 제거한다. doctor나 babysitter등의 단어의 성별 bias를 제거하는 것이다.

 

3. 마지막으로 Equalize pairs 작업을 수행한다.

즉, boy-girl / grandfather-grandmother과 같은 단어는 각 단어가 성별 요소가 있기 때문에, 이러한 단어들이 bias direction을 기준으로 같은 거리에 있도록 한다. 즉, 각 성별 요소가 있는 단어들은 bias direction과의 거리의 차이가 동일하도록 만들어주는 것이다.

 

전체 알고리즘은 조금 더 복잡한데, 논문에서 자세하게 설명하고 있으며, 또한 실습을 통해서 직접 수행해보도록 할 것이다.

댓글