단어 임베딩 (Word Embedding) 학습
요약
단어 임베딩은 텍스트 단어를 계산 가능한 저차원의 밀집(dense) 수치 벡터로 변환하는 기술입니다. 이는 원-핫 인코딩의 비효율성을 극복하고, 단어 간의 유사성이나 숨겨진 의미론적 관계를 벡터 공간에 효과적으로 표현할 수 있게 합니다. 학습 방식은 전역 동시 출현 행렬을 이용하는 '카운트 기반' 접근법과, 국소 문맥에서 타겟 단어를 예측하는 '문맥 기반' 접근법(예: Skip-gram)으로 나뉩니다.
핵심 포인트
- 단어 임베딩은 텍스트 데이터를 저차원의 밀집 벡터로 변환하여 계산 효율성을 높인다.
- 임베딩 공간에서는 유사한 단어가 서로 가까운 거리에 위치하며 의미론적 관계를 반영한다.
- 카운트 기반 모델은 전역 동시 출현 행렬의 통계량에 의존하는 반면, 문맥 기반 모델은 국소 문맥을 이용해 타겟 단어를 예측한다.
- Skip-gram 모델은 주어진 타겟 단어와 주변 문맥 단어 쌍을 학습 샘플로 사용하여 임베딩 벡터를 최적화한다.
인간의 어휘는 자유 텍스트 (free text) 형태로 나타납니다. 머신러닝 (machine learning) 모델이 자연어를 이해하고 처리하게 하려면, 자유 텍스트 단어들을 수치 값으로 변환해야 합니다. 가장 단순한 변환 방식 중 하나는 원-핫 인코딩 (one-hot encoding)을 수행하는 것이며, 이 방식에서는 각 고유 단어가 결과 벡터의 하나의 차원을 나타내고, 이진 값 (binary value)을 통해 단어의 존재 여부 (1) 또는 부재 (0)를 나타냅니다.
하지만 원-핫 인코딩은 전체 어휘를 다룰 때 표현 방식이 수십만 개의 차원을 요구하기 때문에 계산적으로 비실용적입니다. 단어 임베딩 (Word embedding)은 단어와 구절을 훨씬 더 낮고 밀도가 높은 (denser) 차원의 (비이진) 수치 값 벡터로 표현합니다. 좋은 단어 임베딩을 위한 직관적인 가정은, 임베딩이 단어 사이의 유사성을 근사하거나 (예: "cat"과 "kitten"은 유사한 단어이므로 축소된 벡터 공간에서 가깝게 위치할 것으로 기대됨), 숨겨진 의미론적 관계 (semantic relationships)를 드러낼 수 있다는 것입니다 (예: "cat"과 "kitten"의 관계는 "dog"와 "puppy" 사이의 관계와 유추됨). 유사한 단어들은 종종 유사한 문맥 (context)에 나타날 수 있으므로, 문맥 정보는 단어의 의미와 관계를 학습하는 데 매우 유용합니다.
단어 임베딩을 학습하는 데에는 문맥적 지식에 의존하는 두 가지 주요 접근 방식이 있습니다.
카운트 기반 (Count-based): 첫 번째 방식은 비지도 학습 (unsupervised)으로, 전역 단어 동시 출현 행렬 (global word co-occurrence matrix)의 행렬 분해 (matrix factorization)에 기반합니다. 가공되지 않은 동시 출현 횟수 (Raw co-occurrence counts)만으로는 효과가 떨어지므로, 그 위에 스마트한 처리를 더하고자 합니다.
문맥 기반 (Context-based): 두 번째 방식은 지도 학습 (supervised)입니다. 국소 문맥 (local context)이 주어졌을 때, 타겟 단어 (target words)를 예측하는 모델을 설계하며, 동시에 이 모델은 효율적인 단어 임베딩 표현을 학습합니다.
카운트 기반 벡터 공간 모델 (Count-Based Vector Space Model)
카운트 기반 벡터 공간 모델 (Count-Based Vector Space Model)
카운트 기반 벡터 공간 모델 (Count-based vector space models)은 동일한 문맥에 있는 단어들이 유사하거나 관련된 의미를 공유한다는 가정하에, 단어 빈도 (word frequency)와 동시 출현 행렬 (co-occurrence matrix)에 크게 의존합니다. 이 모델들은 인접한 단어들 사이의 동시 출현 (co-occurrences)과 같은 카운트 기반 통계량을 작고 조밀한 단어 벡터 (dense word vectors)로 매핑합니다. PCA, 토픽 모델 (topic models), 그리고 신경 확률 언어 모델 (neural probabilistic language models)은 모두 이 범주의 좋은 예시입니다.
카운트 기반 접근 방식과 달리, 문맥 기반 (context-based) 방법은 주변 단어들이 주어졌을 때 특정 단어를 예측하는 것을 직접적인 목표로 하는 예측 모델을 구축합니다. 조밀한 단어 벡터는 모델 파라미터 (model parameters)의 일부입니다. 각 단어의 최적의 벡터 표현은 모델 학습 과정 중에 학습됩니다.
문맥 기반 (Context-Based): Skip-Gram 모델
문장을 따라 이동하는 고정된 크기의 슬라이딩 윈도우 (sliding window)가 있다고 가정해 봅시다. 가운데 있는 단어는 "타겟 (target)"이며, 슬라이딩 윈도우 내에서 그 왼쪽에 있는 단어들과 오른쪽에 있는 단어들은 문맥 단어 (context words)입니다. Skip-gram 모델 (Mikolov et al., 2013)은 주어진 타겟에 대해 특정 단어가 문맥 단어가 될 확률을 예측하도록 학습됩니다.
다음 예시는 문장을 따라 슬라이딩하는 5개 단어 크기의 윈도우에 의해 생성된, 여러 개의 타겟 및 문맥 단어 쌍을 학습 샘플로서 보여줍니다.
“The man who passes the sentence should swing the sword.” – Ned Stark
| 슬라이딩 윈도우 (크기 = 5) | 타겟 단어 | 문맥 |
|---|---|---|
| [The man who] | the | man, who |
| ... |
각 문맥-타겟 쌍은 데이터 내의 새로운 관측치 (observation)로 취급됩니다. 예를 들어, 위 사례에서 타겟 단어 “swing”은 네 개의 학습 샘플을 생성합니다: (“swing”, “sentence”), (“swing”, “should”), (“swing”, “the”), 그리고 (“swing”, “sword”).
어휘 사전 크기(vocabulary size)를 $V$라고 할 때, 우리는 크기가 $N$인 단어 임베딩 벡터 (word embedding vectors)를 학습하려고 합니다. 모델은 한 번에 하나의 타겟 단어 (입력)를 사용하여 하나의 문맥 단어 (출력)를 예측하는 법을 학습합니다.
그림 1에 따르면,
- 입력 단어 $w_i$와 출력 단어 $w_j$ 모두 크기가 $V$인 이진 벡터(binary vector) $\mathbf{x}$와 $\mathbf{y}$로 원-핫 인코딩 (one-hot encoded)됩니다.
- 먼저, 이진 벡터 $\mathbf{x}$와 크기가 $V \times N$인 단어 임베딩 행렬 (word embedding matrix) $W$를 곱하면 입력 단어 $w_i$의 임베딩 벡터 (embedding vector)를 얻을 수 있습니다: 이는 행렬 $W$의 $i$번째 행입니다.
- 새롭게 발견된 차원 $N$의 이 임베딩 벡터는 은닉층 (hidden layer)을 형성합니다.
- 은닉층과 크기가 $N \times V$인 단어 문맥 행렬 (word context matrix) $W'$를 곱하면 출력 원-핫 인코딩 벡터 $\mathbf{y}$가 생성됩니다.
- 출력 문맥 행렬 $W'$는 임베딩 행렬 $W$와는 다르게, 문맥으로서의 단어 의미를 인코딩합니다. 참고: 이름에도 불구하고, $W'$는 $W$의 전치 (transpose)나 역행렬 (inverse) 등이 아니며, $W$와는 독립적입니다.
문맥 기반: 연속 봉지 단어 (Continuous Bag-of-Words, CBOW)
연속 봉지 단어 (CBOW)는 단어 벡터를 학습하기 위한 또 다른 유사한 모델입니다. 이 모델은 소스 문맥 단어들(예: "sentence should the sword")로부터 타겟 단어(예: "swing")를 예측합니다.
문맥 단어가 여러 개 존재하기 때문에, 입력 벡터와 행렬 $W$의 곱으로 구성된 각 단어 벡터들의 평균을 구합니다. 평균을 내는 단계에서 분포 정보 (distributional information)의 상당 부분이 매끄럽게 처리(smoothes over)되기 때문에, 어떤 이들은 CBOW 모델이 작은 데이터셋에 더 적합하다고 믿습니다.
손실 함수 (Loss Functions)
skip-gram 모델과 CBOW 모델 모두 잘 설계된 손실/목적 함수 (loss/objective function)를 최소화하도록 학습되어야 합니다. 이러한 언어 모델을 학습시키기 위해 통합할 수 있는 여러 가지 손실 함수가 있습니다. 다음 논의에서는 손실이 어떻게 계산되는지 설명하기 위해 skip-gram 모델을 예로 사용하겠습니다.
전체 소프트맥스 (Full Softmax)
skip-gram 모델은 행렬 $W$를 통해 모든 단어의 임베딩 벡터 (embedding vector)를 정의하고, 출력 행렬 $W’$를 통해 문맥 벡터 (context vector)를 정의합니다. 입력 단어 $w_I$가 주어졌을 때, $W$의 해당 행을 벡터 $v_{w_I}$ (임베딩 벡터)로, $W’$의 해당 열을 $v’_{w_I}$ (문맥 벡터)로 라벨링하겠습니다. 최종 출력층은 $w_I$가 주어졌을 때 출력 단어 $w_O$를 예측할 확률을 계산하기 위해 소프트맥스 (softmax)를 적용하며, 따라서 다음과 같습니다:
이는 제시된 대로 정확합니다. 하지만 $V$가 매우 클 경우, 매 샘플마다 모든 단어를 훑으며 분모를 계산하는 것은 계산적으로 비실용적입니다. 더 효율적인 조건부 확률 추정 (conditional probability estimation)에 대한 요구는 *계층적 소프트맥스 (hierarchical softmax)*와 같은 새로운 방법론으로 이어집니다.
계층적 소프트맥스 (Hierarchical Softmax)
Morin과 Bengio (2005)는 이진 트리 (binary tree) 구조의 도움을 받아 합계 계산을 더 빠르게 만들기 위해 계층적 소프트맥스 (hierarchical softmax)를 제안했습니다. 계층적 소프트맥스는 언어 모델의 출력 소프트맥스 (softmax) 층을 트리 계층 구조로 인코딩하며, 여기서 각 리프 노드 (leaf node)는 하나의 단어를 나타내고 각 내부 노드 (internal node)는 자식 노드들의 상대적 확률을 나타냅니다.
각 단어 $w_i$는 루트 (root)에서 해당 리프 노드까지 이어지는 고유한 경로를 가집니다. 이 단어를 선택할 확률은 루트에서 트리 분기를 따라 이 경로를 따라 내려갈 확률과 동일합니다. 우리는 내부 노드 $n$의 임베딩 벡터 $v_n$을 알고 있으므로, 해당 단어를 얻을 확률은 모든 내부 노드 정지 지점에서 왼쪽 또는 오른쪽으로 회전할 확률의 곱으로 계산할 수 있습니다.
그림 3에 따르면, 한 노드의 확률은 다음과 같습니다 ($\sigma$는 시그모이드 함수 (sigmoid function)입니다):
입력 단어 $w_I$가 주어졌을 때 문맥 단어 $w_O$를 얻을 최종 확률은 다음과 같습니다:
여기서 $L(w_O)$는 단어 $w_O$로 이어지는 경로의 깊이이며, $\mathbb{I}_{\text{turn}}$은 $n(w_O, k+1)$이 $n(w_O, k)$의 왼쪽 자식인 경우 1을, 그렇지 않으면 -1을 반환하는 특수 지시 함수 (indicator function)입니다. 내부 노드 (internal nodes)의 임베딩 (embeddings)은 모델 학습 중에 학습됩니다. 트리 구조는 학습 시 분모 추정의 복잡도를 $O(V)$ (어휘 사전 크기, vocabulary size)에서 $O(\log V)$ (트리의 깊이, depth of the tree)로 크게 줄이는 데 도움을 줍니다. 하지만 예측 (prediction) 시에는 어떤 리프 노드 (leaf node)에 도달할지 미리 알 수 없기 때문에, 여전히 모든 단어의 확률을 계산하여 가장 좋은 것을 선택해야 합니다.
좋은 트리 구조는 모델 성능에 매우 중요합니다. 몇 가지 유용한 원칙은 다음과 같습니다: 단순한 속도 향상을 위해 Huffman tree에서 구현된 방식처럼 빈도수에 따라 단어를 그룹화하는 것; 유사한 단어들을 동일하거나 가까운 브랜치 (branches)로 그룹화하는 것 (예: 미리 정의된 단어 클러스터 (word clusters) 또는 WordNet 사용).
교차 엔트로피 (Cross Entropy)
또 다른 접근 방식은 softmax 프레임워크에서 완전히 벗어납니다. 대신, 손실 함수 (loss function)는 예측된 확률 $p$와 실제 이진 레이블 (binary labels) $\mathbf{y}$ 사이의 교차 엔트로피 (cross entropy)를 측정합니다.
먼저, 두 분포 $p$와 $q$ 사이의 교차 엔트로피는 $H(p, q) = -\sum_x p(x) \log q(x)$로 측정된다는 점을 상기해 봅시다. 우리의 경우, 실제 레이블 $y_i$는 $w_i$가 출력 단어일 때만 1이며, 그렇지 않으면 $y_j$는 0입니다. 파라미터 설정 $\theta$를 가진 모델의 손실 함수 $\mathcal{L}_\theta$는 예측값과 정답 (ground truth) 사이의 교차 엔트로피를 최소화하는 것을 목표로 합니다. 교차 엔트로피가 낮을수록 두 분포 사이의 유사도가 높음을 나타내기 때문입니다.
상기하면,
따라서,
SGD를 이용한 역전파 (back-propagation)로 모델 학습을 시작하려면 손실 함수의 그래디언트 (gradient)를 계산해야 합니다. 단순화를 위해 $z_{IO} = {v'{w_O}}^{\top}{v{w_I}}$라고 명명하겠습니다.
여기서 $Q(\tilde{w})$는 노이즈 샘플 (noise samples)의 분포입니다.
위 공식에 따르면, 첫 번째 항에 의해 정답 출력 단어는 양의 강화 (positive reinforcement)를 받는 반면 ($\nabla_\theta z_{IO}$가 클수록 더 좋은 손실 (loss)을 얻습니다), 두 번째 항에 의해 포착되는 바와 같이 다른 단어들은 부정적인 영향 (negative impact)을 받습니다.
전체 어휘 (vocabulary)를 모두 훑는 대신 노이즈 단어 (noise words)의 샘플 집합을 사용하여 $\mathbb{E}{w_i \sim Q(\tilde{w})} \nabla\theta {v’{w_i}}^{\top}{v{w_I}}$를 추정하는 방법이 바로 교차 엔트로피 (cross-entropy) 기반 샘플링 접근법을 사용하는 핵심입니다.
Noise Contrastive Estimation (NCE)
Noise Contrastive Estimation (NCE) 지표는 로지스틱 회귀 (logistic regression) 분류기 (Gutmann and Hyvärinen, 2010)를 사용하여 타겟 단어를 노이즈 샘플 (noise samples)로부터 구별하는 것을 목표로 합니다.
입력 단어 $w_I$가 주어졌을 때, 정답 출력 단어는 $w$로 알려져 있습니다. 동시에, 노이즈 샘플 분포 $Q$로부터 $N$개의 다른 단어를 샘플링하며, 이를 $\tilde{w}_1, \tilde{w}_2, \dots, \tilde{w}_N \sim Q$로 표기합니다. 이 이진 분류기 (binary classifier)의 결정을 $d$라고 라벨링하며, $d$는 이진 값만을 가질 수 있습니다.
$N$이 충분히 클 때, 대수의 법칙 (Law of large numbers)에 따라,
확률 $p(d=1 \vert w, w_I)$를 계산하기 위해, 우리는 결합 확률 (joint probability) $p(d, w \vert w_I)$에서 시작할 수 있습니다. $w, \tilde{w}_1, \tilde{w}_2, \dots, \tilde{w}_N$ 중에서, 조건부 확률 $p(w \vert w_I)$로부터 샘플링된 실제 단어 $w$를 선택할 확률은 $(N+1)$개 중 1개이며, 동시에 $q(\tilde{w}) \sim Q$로부터 각각 샘플링된 노이즈 단어를 선택할 확률은 $(N+1)$개 중 $N$개입니다. 따라서,
그렇다면 우리는 $p(d=1 \vert w, w_I)$와 $p(d=0 \vert w, w_I)$를 구할 수 있습니다:
최종적으로 NCE 이진 분류기의 손실 함수 (loss function)는 다음과 같습니다:
하지만 $p(w \vert w_I)$는 여전히 분모에서 전체 어휘 (vocabulary)를 합산하는 과정을 포함합니다. 분모를 입력 단어의 분할 함수 (partition function)인 $Z(w_I)$라고 라벨링하겠습니다. 소프트맥스 (softmax) 출력 레이어가 정규화 (normalized)될 것으로 기대한다는 점을 고려할 때, 일반적인 가정은 $Z(w) \approx 1$입니다 (Minh and Teh, 2012). 그러면 손실 함수는 다음과 같이 단순화됩니다:
노이즈 분포 $Q$는 조정 가능한 파라미터(tunable parameter)이며, 우리는 다음과 같은 방식으로 이를 설계하고자 합니다:
- 직관적으로 실제 데이터 분포 (real data distribution)와 매우 유사해야 합니다.
- 샘플링 (sampling)하기 쉬워야 합니다.
예를 들어, TensorFlow의 NCE 손실 (NCE loss)에 대한 샘플링 구현체(log_uniform_candidate_sampler)는 이러한 노이즈 샘플이 Zipf의 법칙 (Zipfian’s law)으로도 알려진 로그 균등 분포 (log-uniform distribution)를 따른다고 가정합니다. 로그 상에서 특정 단어의 확률은 그 순위 (rank)에 반비례할 것으로 예상되며, 이때 빈도가 높은 단어에는 낮은 순위가 할당됩니다. 이 경우, $q( ilde{w}) = \frac{1}{ \log V}(\log (r_{\tilde{w}} + 1) - \log r_{\tilde{w}})$이며, 여기서 $r_{\tilde{w}} \in [1, V]$는 빈도에 따른 단어의 내림차순 순위입니다.
네거티브 샘플링 (Negative Sampling, NEG)
Mikolov et al. (2013)이 제안한 네거티브 샘플링 (Negative Sampling, NEG)은 NCE 손실의 단순화된 변형입니다. 이는 특히 Google의 word2vec 프로젝트를 학습시킨 것으로 유명합니다. 소프트맥스 (softmax) 출력의 로그 확률 (log probability)을 근사적으로 최대화하려는 NCE 손실과 달리, 네거티브 샘플링은 자연어에서의 단어 분포를 모델링하기보다는 고품질의 단어 임베딩 (word embedding)을 학습하는 데 집중하기 때문에 추가적인 단순화를 거쳤습니다.
NEG는 이진 분류기 (binary classifier)의 출력을 다음과 같이 시그모이드 함수 (sigmoid functions)로 근사합니다:
최종 NCE 손실 함수는 다음과 같습니다:
단어 임베딩 학습을 위한 기타 팁
Mikolov et al. (2013)은 좋은 단어 임베딩 학습 결과를 얻을 수 있는 몇 가지 유용한 관행들을 제안했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Lilian Weng Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기