Text Embedding은 사람이 이해할 수 있는 text를, 컴퓨터가 이해할 수 있는 vector 형태로 나태낸 것을 의미합니다. 본 포스트에선 통계 기반 단어 임베딩부터, Word2Vec 이전의 NNLM 모델을 거쳐 Word2vec까지 설명하겠습니다.
1. Word Embedding
Word Embedding은 단어를 제한된 차원의 vector로 나타내는 방법입니다.
One-hot encoding과 달리, 단어 벡터 간의 유사도를 코사인 유사도로 구할 수도 있고, 필요한 벡터 차원의 수도 적습니다. 근처에 나온 단어, 비슷한 단어일수록 벡터 간의 유사도가 높습니다. 벡터의 위치와 거리가 실제 단어 간의 관계를 반영합니다.
2. 통계 기반 단어 임베딩
2-1. 분포 가설(distributional hypothesis)
분포 가설이란, 단어의 의미는 주변 단어에 의해 형성된다는 것을 의미합니다. 즉, 비슷한 문맥을 가진 단어는 비슷한 의미를 갖습니다. 단어를 벡터로 표현하는 최근 연구도 대부분 이 가설을 따라 형성됩니다.
2-2. 분산 표현(distributional representation)
단어의 의미를 정확하게 파악할 수 있는 벡터 표현입니다.
2-3. 동시발생 행렬
동시발생 행렬이란, 어떤 단어 기준으로, 그 단어 주변에 다른 단어가 몇 번 나오는지 세어 집계한 행렬입니다. 예를 들어, "you say goodbye and I say hello."라는 문장이 있고, window size가 1일 때 동시발생 행렬은 아래와 같이 나타낼 수 있습니다.
word | you | say | goodbye | and | I | say | hello | . |
---|---|---|---|---|---|---|---|---|
you | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
say | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
각 단어별 동시발생 행렬의 코사인 유사도(Cosine Similarity)를 구하면, 두 단어가 얼마나 비슷한지 구할 수 있습니다.
2-4. 점별 상호정보량(Pointwise Mutual Information, PMI)
점별 상호정보량이란, 두 확률변수 간의 연관성을 나타내는 척도입니다. 확률변수 x하고 y가 독립이라면 0 값을 가지고, 연관도가 높을수록 큰 값을 가지게 됩니다.
2-5. 차원 감소 (Dimensionality Reduction)
차원 감소는, 중요한 정보는 최대한 유지하면서 벡터의 차원을 줄이는 기법입니다.
종류는 특이값분해(SVD), PCA, t-SNE(Stochastic Neighbor Embedding) 등이 있습니다.
1) 특이값분해(Singular Value Decomposition, SVD)
$X = USV^T$
특이값분해란, 하나의 행렬들 두 개의 직교행렬 U, V와, 대각행렬 S로 분해하는 것을 의미합니다.
U, V는 직교행렬(orthogonal matrix)이고, 그 열벡터는 서로 직교합니다.
S는 대각행렬(digonal matrix)이며, 해당 축의 중요도로 간주할 수 있는 특이값(singular value)이 큰 순서대로 나열되어 있습니다. 이 행렬에서 특이값이 적은 원소를 잘라내면 벡터 차원을 축소할 수 있습니다.
3. word2vec 이전의 모델
사람이 사용하는 자연어를 벡터로 나타내기 전에도, 다양한 시도를 이용해 자연어 처리를 시도해 왔습니다. Naive Bayes를 이용한 스팸 분류기 등이 있습니다.
성능 자체는 좋았지만, 단어가 다른 단어와 어떤 차이점을 가지는지 이해할 수 없다는 문제점이 있었습니다. 이 문제를 해결하기 위해 자연어를 벡터화하는 방법을 고안했습니다.
NNLM -> RNNLM -> CBOW, Skip-gram (2013) -> word2vec
3-1. NNLM(Feed-Forward Neural Net Language Model)
현재 단어 이전의 N개를 보아, Output layer가 현재 단어의 One-hot encoding이 되도록 Proejction layer와 Hidden layer를 학습하는 모델입니다.
이 모델은 Input layer, projection layer, hidden layer, output layer로 구성되어 있습니다. 이 layer들은 아래와 같은 방법으로 학습합니다.
- 문장에서 현재 보고 있는 단어 이전의 단어 N개를 one-hot encoding으로 vector화 합니다.
- vocab size를 V라 하고, projection layer의 size를 P라 했을 때, 1.의 vector들은 VxP 크기의 projection matrix에 의해 다음 레이어로 들어갑니다.
- 2.의 값을 input이라 생각하고, 크기 H의 hidden layer를 거쳐 output layer에서 각 단어들이 나올 확률을 계산합니다. loss 함수는 모델의 출력값 $\hat{y}$과 $y$ 간의 cross entropy 값입니다.
- 이를 back-propagation해서 네트워크의 weight를 최적화합니다.
1-4에서 사용하게 될 단어의 vector들은 projection layer의 값으로서, 각 단어들은 크기 P의 vector가 됩니다.
NNLM 모델의 단점은 아래와 같습니다.
- 몇개의 단어를 볼 건지에 대한 파라미터 N이 고정되어야 하고, 따로 정해줘야 합니다.
- 이전의 단어들에 대해서만 신경쓰고 뒤의 단어는 고려하지 못합니다.
- 계산량이 많아서 학습 속도가 느립니다.
c. 계산 시간
- 단어들을 projection 시키는 것 (2) : NxP
- projection layer에서 hidden layer로 넘어가는 것 (3) : NxPxH
- hidden layer에서 output layer로 넘어가려면 모든 단어에 대한 확률 계산 (3) : HxV
=> parameter 개수 = NxP + NxPxH + HxV
- 보통 vocab size V는 1,000만 개 정도. N=10, P=500, H=500.
=> O(HxV) = O(50억)
d. 개선
HxV -> Hxln(V) : O(NxPxH) = O(250만)
3-2. RNNLM(Recurrent Neural Network)
NNLM을 RNN으로 변형하여 projection layer를 없앴습니다.
이 모델은 input layer, hidden layer로 구성되어 있습니다. Hidden layer에 recurrent한 연결이 있어서 직전의 hidden layer 입력이 다시 입력되는 방식입니다. 위 이미지에서 U 값을 word embedding으로 사용합니다. Hidden layer의 크기는 H로 나타냅니다.
RNNLM은, NNLM과 다르게 앞의 몇 개의 단어를 볼 지 정해줄 필요가 없습니다. 학습시켜줄 글의 단어를 순차적으로 입력하는 방식으로 학습을 진행하기 때문입니다. 즉, recurrent한 부분이 short-term memory 연할을 하면서 이전 단어를 보는 효과가 있습니다.
NNLM에 비해서 RNNLM의 연산량은 적습니다. 복잡도도 낮아져서 $O(H \times H + H \times V)$ 입니다.
- input layer에서 hidden layer로 넘어가는 것 : H
- hidden(t-1)에서 hidden(t)로 넘어가는 vector 계산 : HxH
- hidden layer에서 output결과를 내기 위해 모든 단어에 대해 확률계산 : HxV
V를 $ln(V)$로 개선하면 복잡도를 더 낮출 수 있습니다. 따라서 H=500일 때 O(HxH) = 24만 입니다. NNLM이 250만이었던 것을 생각하면 복잡도가 상당히 낮아졌습니다.
4. Word2Vec
NNLM이나 RNNLM은 Word Embedding은 잘 만들지만 속도가 매우 느리다는 단점이 있습니다.
Word2Vec은 Word Embedding을 만드는 속도를 개선했습니다. 학습 네트워크로는, 앞/뒤 단어를 다 보고 현재 단어를 추론하는 CBOW, 현재 단어만 보고 앞/뒤 단어를 추론하는 Skip-gram이 있습니다.
- 자세히 보기: Word2Vec
-
딥러닝 기반 자연어처리 기법의 최근 연구 동향: 2017년 8월 기준.
- 쉽게 쓰여진 Word2Vec
- Word2Vec 관련 이론 정리
- Word2Vec의 학습 방식
- 단어들의 벡터 표현 (텐서플로우 문서 한글 번역본)
- The backpropagation algorithm for Word2Vec : link
5. Doc2Vec
한 문장이나 문단, 문서를 하나의 Vector로 임베딩하는 방법입니다.
6. Sent2Vec
Sent2Vec은 문장 하나를 하나의 vector로 embedding하는 방법입니다. CBOW를 window size를 문장 전체로 고정하고, subsampling을 사용하지 않도록 변형해서 context를 학습합니다.
문장의 모든 n-gram을 조합하여 학습할 수 있도록 window size를 문장 전체로 고정합니다. 중요한 n-gram 쌍 생성을 방해하지 않도록 subsampling을 사용하지 않습니다. 이 변형된 CBOW를 이용해 문자 n-gram 쌍, 단어 n-gram 쌍을 context로 하여 학습합니다. 여기서 n-gram이란 bi-gram의 최대 거리를 이용합니다. Sent2Vec을 구할 땐 가능한 모든 Context vector의 평균을 내어 구합니다.
Word2Vec과 마찬가지로, Sent2Vec 간의 코사인 유사도를 구하면 문장 간의 유사도를 구할 수 있습니다.
7. word2vec과의 성능 비교: Analogy Reasoning Task
Analogy Reasoning Task는 Word Embedding의 성능을 비교하기 위한 Task입니다. Sementic, Syntatic 두 부분 모두 테스트를 합니다. 즉, Word embedding의 위치와 거리가 단어 간의 관계를 나타내는 것입니다.
예를 들어, (Athens, Greece) 단어 쌍을 주고, Oslo라는 단어를 주면 결과로 Norway를 주어야 합니다. 아테네와 그리스는 "국가의 수도"라는 관계가 있으므로, 오솔로를 보고 노르웨이라는 단어를 추론해야 합니다. 이 것을 수식으로 나타내면 $v(Greece)-v(Athens)+v(Oslo) = v(Norway)$ 입니다.
4-1. 모델 비교
단어 벡터 길이는 640으로 하였습니다. RNNLM, NNLM에 비해 CBOW나 Skip-gram 모델이 Semantic, Syntatic 둘 다에 대해 더 좋은 결과를 보여주었습니다.
모델을 300차원 Skip-gram 모델로 고정했을 때 subsampling 방법에 따른 성능 차이는 아래와 같습니다.
3) 모델을 300dimension Skip-gram으로 고정한 결과
- NEG-k : k개 단어를 선택한 negative sampling
- HS-Huffman : Huffman Tree를 이용한 Hierarchical Softmax
- NCE-k : negative sampling과 유사한 방법. Noise Contrastive Estimation
- 이 방법을 기초로 하여 목적함수를 조금 바꿔 negative sampling 생성
전체적으로 Hierarchical softmax를 사용한 것보다 negative sampling이 더 좋은 결과를 보입니다. 즉, 자주 등장하는 단어를 subsampling하면 학습시간이 줄어들고, 성능도 향상된다고 볼 수 있습니다.
여기서 Hierarchical softmax가 안좋게 나왔다고 실제 나쁜 방법은 아닙니다. Task에 따라서 성능은 언제든지 달라질 수 있습니다.
관련 논문
'활용 > NLP' 카테고리의 다른 글
TextCNN (0) | 2020.04.12 |
---|---|
Natural Language Processing (0) | 2020.04.12 |
Word2vec 만들어보기 (0) | 2020.04.12 |
Word2vec (0) | 2020.04.12 |