[CS224N] Lecture 2: Word Vectors and Word Senses
0. 이 강의가 던지는 질문
Lecture 1에서 Word2Vec의 기본 아이디어를 배웠다. 하지만 실제로 학습시키려면 몇 가지 문제가 있다:
- Softmax의 분모를 계산하려면 전체 어휘에 대한 합산이 필요한데, 이건 너무 비싸지 않나?
- 단어 간의 전체적인 통계 정보를 활용할 수는 없을까?
- 학습된 Word Vector의 품질을 어떻게 평가할 수 있을까?
이번 강의는 이 질문들에 답한다.
1. Word2Vec 복습 및 효율화
1.1 CBOW와 Skip-gram
Lecture 1에서 다룬 Word2Vec의 두 가지 변형을 다시 정리하면:
| 모델 | 입력 | 출력 | 특징 |
|---|---|---|---|
| CBOW | 맥락 단어들 (window × 2) | 중심 단어 | 학습 속도 빠름 |
| Skip-gram | 중심 단어 | 맥락 단어들 (window × 2) | 소규모 데이터에서 성능 좋음 |
CBOW의 학습 과정:
- 맥락 단어 벡터 × 가중치 행렬 \(U\) → Hidden layer
- Hidden layer에서 요소별 평균 계산
- Hidden layer × 가중치 행렬 \(V\) → Output layer
- Softmax 적용하여 확률 분포 생성
- Loss 계산 후 Gradient Descent로 가중치 업데이트
1.2 Stochastic Gradient Descent (SGD)
전체 코퍼스에 대해 gradient를 계산하면 비용이 너무 크다. 해결책: 미니배치(Mini-batch) 를 사용하여 일부 샘플만으로 gradient를 추정한다.
문제점: Sparse vector에서 대부분의 위치가 0이므로, 해당 위치의 gradient는 업데이트되지 않는다. 이는 불필요한 계산을 유발한다.
1.3 Negative Sampling
Softmax의 분모에서 전체 어휘에 대해 합산하는 것은 계산량이 막대하다. Negative Sampling은 이 문제를 해결하는 핵심 기법이다.
핵심 아이디어:
- 전체 어휘에 대한 다중 분류(Multi-class) 를 이진 분류(Binary) 로 근사
- 실제 context word(positive)와 랜덤으로 뽑은 noise word(negative)만 사용
목적함수:
\[L = \log \sigma(u_o^\top v_c) + \sum_{k=1}^{K} \log \sigma(-u_k^\top v_c)\]- \(v_c\): 중심 단어 벡터
- \(u_o\): 실제 맥락 단어(positive) 벡터
- \(u_k\): 노이즈 단어(negative) 벡터
- \(\sigma\): 시그모이드 함수
- \(K\): negative sample 개수
직관적 해석:
- True pair \((c, o)\): 두 벡터의 내적(유사도)이 클수록 \(\sigma(u_o^\top v_c) \to 1\), 손실 → 0
- Noise pair \((c, k)\): 두 벡터의 내적이 작을수록 \(\sigma(-u_k^\top v_c) \to 1\), 손실 → 0
즉, 실제 함께 등장하는 단어 쌍은 가깝게, 랜덤으로 뽑힌 단어 쌍은 멀게 학습한다.
1.4 Subsampling Frequent Words
“the”, “a”, “is” 같은 고빈도 단어는 의미 정보를 거의 제공하지 않으면서 학습 데이터를 지배한다.
해결책: 빈도가 높은 단어를 확률적으로 제거한다.
\[P(w_i) = 1 - \sqrt{\frac{t}{f(w_i)}}\]- \(f(w_i)\): 단어 \(w_i\)의 빈도 비율 (출현 횟수 / 전체 단어 수)
- \(t\): threshold (보통 \(10^{-5}\))
빈도가 높을수록 \(P(w_i)\)가 커져서 해당 단어가 학습에서 제외될 확률이 높아진다.
2. Co-occurrence Matrix (동시 출현 행렬)
Skip-gram은 각 위치에서의 조건부 확률만 학습하므로, 전체 말뭉치의 글로벌 통계 정보를 활용하지 못한다는 한계가 있다.
이를 보완하는 것이 Count-based 접근법인 동시 출현 행렬이다.
2.1 Window-based Co-occurrence Matrix (단어-문맥 행렬)
윈도우 내에서 두 단어가 함께 출현한 횟수를 기록한 행렬이다.
특징:
- Syntactic 정보 (문법적 관계)와 Semantic 정보 (의미적 관계)를 모두 포착
- 행렬이 대칭(symmetric)
2.2 Word-Document Matrix (단어-문서 행렬)
각 문서에서 단어의 출현 횟수를 기록한 행렬이다.
용도:
- LSA (Latent Semantic Analysis): 문서의 잠재적 의미 분석
- 문서 간 유사도 측정
2.3 차원 축소: SVD
단어 수가 증가하면 행렬의 차원이 폭발적으로 커진다. 이를 해결하기 위해 SVD(Singular Value Decomposition, 특이값 분해) 를 적용한다.
\[A = U \Sigma V^\top\]- \(U\): 좌특이벡터 행렬 (단어 벡터)
- \(\Sigma\): 특이값 대각 행렬
- \(V^\top\): 우특이벡터 행렬
Truncated SVD: 상위 \(k\)개의 특이값만 남겨서 차원을 축소한다. 이렇게 하면 원래 행렬을 최소 오차로 근사하면서도 저차원 벡터를 얻을 수 있다.
2.4 LSA (Latent Semantic Analysis)
Co-occurrence matrix에 SVD를 적용하여 잠재적 의미(Latent Semantics) 를 추출하는 방법이다.
차원 축소를 통해 노이즈를 제거하고, 단어 간의 숨겨진 의미적 관계를 파악할 수 있다.
3. GloVe (Global Vectors for Word Representation)
GloVe는 Count-based 방법과 Direct prediction 방법의 장점을 결합한 모델이다.
- Word2Vec의 장점: 임베딩된 벡터 간 유사도 측정이 용이
- Co-occurrence matrix의 장점: 말뭉치 전체의 통계 정보 반영
3.1 핵심 인사이트
두 단어 벡터의 내적 = 동시 출현 확률의 로그값
이것이 GloVe의 출발점이다.
3.2 동시 출현 확률의 비(Ratio)
먼저 용어를 정의한다:
- \(X_{ik}\): 단어 \(i\)와 \(k\)의 동시 출현 횟수
- \(X_i = \sum_k X_{ik}\): 단어 \(i\)의 총 출현 횟수
- \(P_{ik} = X_{ik} / X_i\): \(i\)가 주어졌을 때 \(k\)가 등장할 조건부 확률
GloVe의 핵심은 확률의 비(ratio) 를 보는 것이다:
\[\frac{P_{ik}}{P_{jk}}\]예를 들어, \(i = \text{ice}\), \(j = \text{steam}\)일 때:
- \(k = \text{solid}\)이면 \(P_{ik} / P_{jk}\)이 매우 큼 → “solid”는 ice와 관련
- \(k = \text{gas}\)이면 \(P_{ik} / P_{jk}\)이 매우 작음 → “gas”는 steam과 관련
- \(k = \text{water}\)이면 \(P_{ik} / P_{jk} \approx 1\) → 둘 다와 관련
이 비율이 단어 간 관계를 잘 드러낸다.
3.3 목적함수 도출
Step 1. 확률 비를 벡터의 함수로 표현:
\[F(w_i, w_j, \tilde{w}_k) = \frac{P_{ik}}{P_{jk}}\]Step 2. 벡터 차이의 내적으로 변환:
\[F(w_i - w_j, \tilde{w}_k) = \frac{P_{ik}}{P_{jk}}\]좌변은 벡터 공간의 차이, 우변은 확률의 비율이므로, 이 둘을 연결하려면 지수함수가 필요하다.
Step 3. \(F = \exp\)로 결정하면:
\[w_i^\top \tilde{w}_k = \log X_{ik} - \log X_i\]Step 4. \(\log X_i\)를 bias 항 \(b_i\)로 흡수:
\[w_i^\top \tilde{w}_k + b_i + \tilde{b}_k = \log X_{ik}\]3.4 최종 손실함수
\[J = \sum_{i,k} f(X_{ik}) \left( w_i^\top \tilde{w}_k + b_i + \tilde{b}_k - \log X_{ik} \right)^2\]- \(f(X_{ik})\): 가중치 함수 — 빈도가 극단적으로 높은 단어 쌍의 과도한 영향을 조절
3.5 GloVe의 장점
- 빠른 학습 속도: 전체 코퍼스를 한 번 스캔하여 행렬을 만든 후 학습
- 소규모 말뭉치에서도 우수한 성능
- 말뭉치 크기 증가에 따른 성능 변화가 안정적
3.6 GloVe의 실험 결과
유사 단어 검색
“frog”과 유사한 단어로 형태적·의미적으로 관련된 단어들이 효과적으로 선택됨
반의어 관계
brother-sister, uncle-aunt 등 반의어 쌍이 벡터 공간에서 비슷한 거리와 방향으로 분포
의미 관계 (Company-CEO)
회사와 CEO의 관계가 벡터 공간에서 일정한 방향으로 유지됨
등급 관계 (Superlatives)
원형 → 비교급 → 최상급이 벡터 공간에서 선형 구조를 이룸
4. Word Embedding 평가
학습된 Word Vector가 얼마나 좋은지 어떻게 측정할까?
4.1 평가 방식 분류
| 방식 | 설명 | 예시 |
|---|---|---|
| Extrinsic | 실제 NLP 태스크에서 성능 측정 | 기계번역, 감정분석, 개체명 인식 |
| Intrinsic | 임베딩 자체의 품질을 직접 평가 | Word Analogy, 유사도 상관관계 |
4.2 Intrinsic: Word Analogy (유추 테스트)
형식: \(a : b :: c : ?\)
예) man : woman :: king : queen
수식:
\[\hat{d} = \arg\max_{d} \cos(d - c + a, \; b)\]벡터 연산 \(b - a + c\)에 가장 가까운 벡터 \(d\)를 찾는다.
Semantic Analogy (의미적 유추)
- 도시 - 국가: Paris : France :: Tokyo : Japan
- 성별: brother : sister :: king : queen
Syntactic Analogy (문법적 유추)
- 비교급: big : bigger :: small : smaller
- 최상급: big : biggest :: small : smallest
4.3 다양한 하이퍼파라미터의 영향
GloVe 논문에서 실험한 결과:
| 설정 | 최적값 | 비고 |
|---|---|---|
| Window 방향 | 양방향 (symmetric) | 단방향보다 성능 우수 |
| Window 크기 | 10 | - |
| 벡터 차원 | 300 | - |
| 소규모 데이터 최적 | dim=100, window=8 | - |
추가 관찰:
- Over-parametrization: 차원이 지나치게 커져도 성능 저하가 크지 않음
- 훈련 시간: 더 오래 훈련할수록 성능 향상
- 데이터 품질: 정보가 풍부한 텍스트(Wikipedia)가 뉴스(Gigaword)보다 성능이 좋음
4.4 Intrinsic: Correlation (상관관계 평가)
- 단어 쌍을 구성한다
- 사람이 유사도 점수를 매긴다
- 모델의 코사인 유사도와 인간 평가 점수의 상관관계를 계산한다
평가 지표: Spearman / Pearson 상관계수
GloVe는 이 평가에서도 우수한 성능을 보인다.
5. 다의어 문제와 해결 (Word Sense Ambiguity)
“bank”라는 단어는 은행일 수도, 강둑일 수도 있다. 하나의 벡터로 여러 의미를 표현하는 것은 한계가 있다.
5.1 Multiple Prototypes (Huang et al., 2012)
방법:
- 특정 단어가 등장하는 모든 윈도우를 수집
- 윈도우의 context를 기반으로 클러스터링 (bank₁, bank₂, bank₃ …)
- 각 클러스터별로 별도의 벡터를 재학습
→ 하나의 단어에 여러 개의 벡터를 부여한다.
5.2 Linear Algebraic Structure (Arora et al., 2018)
방법:
- 각 의미에 빈도 기반 가중치 부여
- 다의어 벡터 = 각 의미 벡터의 선형 결합(Linear Combination)
- Sparse coding 기법으로 개별 의미 벡터를 복원 가능
→ 하나의 벡터 안에 여러 의미가 중첩(superposition) 되어 있으며, 이를 분리할 수 있다.
6. 추가: FastText와 ELMo
FastText (2016)
- Word2Vec과 유사하지만 subword(부분 단어) 를 활용
- 단어를 n-gram 조각으로 분해하여 학습
- 미등록 단어(OOV) 에 대해서도 벡터를 추론할 수 있음
예) “where” → <wh, whe, her, ere, re>
ELMo (2018)
- 문맥 의존적(Contextualized) 임베딩
- 같은 단어라도 문장에 따라 다른 벡터를 생성
- Bidirectional LSTM 기반으로 전체 문장을 고려
- 다의어 문제를 근본적으로 해결
→ 이후 BERT, GPT 등 Transformer 기반 모델의 등장으로 이어진다.
7. 핵심 요약
| 개념 | 내용 |
|---|---|
| Negative Sampling | 다중 분류 → 이진 분류 근사로 학습 효율화 |
| Subsampling | 고빈도 단어를 확률적으로 제거 |
| Co-occurrence Matrix | 전체 말뭉치의 통계 정보를 행렬로 표현 |
| SVD / LSA | 차원 축소를 통한 잠재 의미 추출 |
| GloVe | Count-based + Prediction-based의 장점 결합 |
| Word Analogy | \(a:b::c:?\) 형태의 임베딩 품질 평가 |
| 다의어 해결 | Multiple Prototypes, Linear Superposition |
| FastText | Subword 활용, OOV 대응 |
| ELMo | 문맥 의존적 임베딩, 다의어 해결 |
8. 마무리
Lecture 2는 Word2Vec의 실용적 한계를 극복하는 다양한 기법을 다룬다.
Negative Sampling으로 학습 효율을 높이고, Co-occurrence matrix로 글로벌 통계를 활용하며, GloVe로 두 접근법의 장점을 결합한다.
나아가 다의어 문제를 인식하고, 이를 해결하기 위한 시도(Multiple Prototypes, ELMo)까지 살펴보았다.
다음 강의에서는 이 Word Vector를 활용한 Neural Network 기반 NLP 모델로 확장해 나간다.
Leave a comment