How to encode natural language inputs into vectors?

Sentiment analysis task (positive / negative)를 예시로 뉴럴넷으로 해결하고자 할 때, 자연어 문장은 어떤 형식으로 입력되어야 할까?

정답은 토큰화 (tokenization)을 거쳐 (여기서는 whitespace 기준) 각 퍼셉트론마다 하나의 토큰을 입력해주면 된다.

 

컴퓨터는 자연어가 아닌 숫자만 인식할 수 있기 때문에 우리는 자연어로 된 문장을 컴퓨터가 이해할 수 있도록 어떠한 규칙을 가지고 숫자들로 구성된 입력으로 변환해주어야 한다. 이것을 벡터화 (vectorization) 또는 인코딩 (encoding) 이라고 한다. 우리가 할 수 있는 가장 쉬운 인코딩 방식은 데이터셋에서 나타나는 모든 단어에 대해서 해당 단어에 해당하는지 (1) 또는 해당하지 않는지 (0)를 표시하는 것이다.

 

이러한 인코딩 방식을 원-핫 인코딩 (One-hot encoding)이라 부르고, 결과로 얻어지는 각 단어의 벡터의 크기는 |V|, 즉 전체 데이터셋의 고유한 단어의 총 개수이다. 원-핫 인코딩은 간단하게 뉴럴넷을 위한 벡터들을 얻을 수 있지만, 치명적인 결점이 존재했다.

 

 

첫번째로는 Curse of dimensionality, 차원의 저주이다. 고유한 단어들 전체에 대해 해당되지 않을 때도 0이라는 값을 배정해야하기 때문에 인코딩된 벡터들의 행렬은 sparse (대부분의 값들이 0)일 수밖에 없다. 이러한 불필요하게 많은 정보들은 뉴럴넷이 처리해야하는 정보의 질을 저하시키고 메모리를 많이 차지하게 되며 따라서 계산 시간도 증가시킨다.

 

 

두번째는 orthogonality이다. 원-핫 인코딩된 서로 다른 두 단어의 유사도를 계산하기 위해 dot product를 할 때, 항상 그 값은 0이 되어 유사도의 계산이 불가능하다는 문제점이 있다.

 

Curse of dimensionality를 해결하기 위해 사용하는 방법으로는 차원 축소 (dimensionality reduction)가 있다. 차원 축소는 고차원의 데이터들을 상대적으로 저차원의 벡터를 갖는 데이터로 압축하되 유사한 정보를 갖도록 하는 방식이다. 주성분분석(PCA, principal component analysis), 선형판별분석 (LDA, Linear discriminant analysis) 등의 알고리즘들이 여기에 속한다.

 주성분분석(PCA, principal component analysis)을 통한 차원 축소

 

주성분분석 (PCA)은 현재 데이터들이 표현된 벡터 공간에서 각 데이터들이 투영(projection)되었을 때 데이터들의 분산을 최대화하는 선형부분공간을 찾는 알고리즘이다. PCA는 동시에 기존 벡터와 투영된 벡터 간의 거리를 최소화하는 방향으로도 차원 축소를 진행한다.

 

 

 

이러한 차원 축소는 manifold hypothesis에 기반하는데, manifold hypothesis는 고차원의 데이터들이 집중되어 분포하는 어떠한 저차원의 매니폴드가 존재하고, 이 매니폴드에서 멀어질 수록 데이터들의 분포가 희박해진다는 가설이다. 수학적으로 증명되지는 않았지만 해당 가설이 잘 작동하는 도메인들이 존재한다고 한다.

 

Autoencoder (오토인코더)

오토인코더 (autoencoder)는 항등 함수 (identity function)를 학습하는 뉴럴넷을 의미한다. 입력 데이터에 대해 오토인코더는 동일한 출력값을 내도록 학습되지만, 입력 데이터를 저차원의 벡터로 압축하는 인코더 (encoder)와 압축된 데이터를 다시 입력 데이터와 동일하게 복원하는 디코더 (decoder) 구조를 통해 저차원의 압축된 representation을 얻을 수 있다.

 

저차원의 벡터로 축소한 뒤, 이 벡터를 다시 입력 데이터와 동일하게 복원하는 학습 방식을 통해 오토인코더는 가장 중요한 feature들을 선택할 수 있도록 학습되고 MSE loss function은 오토인코더의 입력과 출력이 동일하도록 한다.

 

 

오토인코더의 학습 이후, 차원 축소를 위해서는 오토인코더의 인코더만 사용하게 된다.

 

원-핫 인코딩의 결점을 보완하기 위해 등장한 워드 임베딩 (word embeddings)은 이러한 차원 축소 방식을 이용한 자연어 인코딩 방식이다.

 

 

Word embeddings : Word2Vec

Distributional hypothesis

Distributional hypothesis는 유사한 단어들은 유사한 문맥에서 나타난다는 가설이다. 

Moon, Trump, Jinping은 동일한 문맥 상에서 나타나며, 다른 사람이지만 '같은' 대통령을 지칭하고 있다.

워드 임베딩 알고리즘은 이러한 distributional hypothesis에 기반하고 있다.

 

 

Word2Vec 논문은 CBOW (Continuous Bag-Of-Words)와 Skip-gram 방식의 단어 임베딩 학습 방식을 제안했다.

먼저 CBOW를 살펴보자.

 

CBOW

 

문장이 주어졌을 때, Trump라는 단어의 벡터를 학습하기 위해 주변 단어를 뉴럴넷에 입력하고 중앙 단어인 Trump를 예측하는 방식이 CBOW이다. 학습하는 모든 단어에 대해서 임베딩 행렬은 사전에 정해진 차원으로 초기화되고, 학습에 추가로 사용되는 weight matrix와 함께 각 단어의 벡터를 학습하게 된다.

 

1. 먼저 주변 단어들을 임베딩 행렬에서 찾는다 (look-up)

첫번째 단계로 먼저 t 위치 단어의 벡터를 학습하기 위해 주변 단어들의 벡터를 원-핫 인코딩된 벡터의 곱을 통해 찾는다 (look-up).

 

2. 고정된 길이의 벡터로 인코딩

두번째로 학습을 위해 모은 여러 단어들을 하나의 벡터로 합치고, weight matrix를 곱해 |V|의 실수값을 출력하도록 한다.

 

3. Softmax 함수를 통해 중앙 단어를 예측

세번째로 구해진 |V| 값들에 softmax 함수를 적용하여 전체 단어들에 대한 확률로 변환하고 분류 문제로써 뉴럴넷을 학습하게 된다.

 

 

Skip-gram

Skip-gram은 CBOW와 반대로 중앙 단어를 통해 주변 단어들을 예측함으로써 각 단어의 벡터를 학습하는 방식이다.

Skip-gram

 

원-핫 인코딩을 통해 중앙 단어의 벡터를 찾고 (look-up), weight matrix를 곱해 주변 단어들에 대해 softmax 확률을 가지고 분류 학습을 통해 단어 벡터를 학습하게 된다.

 

CBOW와 Skip-gram의 차이점은 CBOW는 학습이 빠르고 자주 등장하는 단어에 대해 더 나은 성능을 보인다고 하며, Skip-gram의 경우 적은 양의 학습 데이터로도 잘 학습되며 자주 등장하지 않는 단어나 구에 대해서도 잘 학습되는 특징이 있다고 한다.

 

 

Other techniques in Word2Vec

위 word2vec의 loss function에서 확인할 수 있듯이 데이터셋의 모든 vocabulary V에 대해 확률을 구하는 normalization 과정은 계산량이 불필요하게 많은 단점이 있었다.

 

이를 해결하기 위해 hierachical softmax와 negative sampling이 제안되었다.

 

- Hierarchical softmax : 여러 개의 이진 트리 (binary tree)로 예측 문제를 분리하여 예측하고자 하는 단어에 이르는 경로(path) 상의 확률들을 최대화하는 방식으로 학습

- Negative sampling : 예측하고자 하는 단어 하나에 대해서 나머지 V-1개의 단어를 사용하지 않고 5~20개의 negative sample들을 사용하여 학습

 

 

Conclusion

단어 임베딩은 각 단어들을  distributed continuous space 상에 배치하여 기존의 curse of dimensionality로 고통받던 discrete 인코딩의 문제를 해결하였다. Word2vec으로 대표되는 단어임베딩은 단어 간의 similarity 계산을 더 자유롭게 가능하게 하였고, 단어 벡터 간의 연산을 가능하게 하는 결과를 가져왔다.

 

+ Recent posts