GloVe: Global Vectors for Word Representation
저자 : Jeffrey Pennington, Richard Socher, Christopher D. Manning 외
학회 : Empirical Methods in Natural Language Processing(EMNLP)
연도 : 2014년
실험 목적
기존 기법 종류
1. 통계 기반 예측 모델링 : LSA 등이 해당
장점 : 코퍼스 전체적으로 담겨있는 정보를 잘 활용
단점 : 디테일한 맥락 정보(옆 단어와의 관계 등)를 학습하는데에 어려움
2. local context window methods : Skip-gram 등이 해당
장점 : 디테일한 맥락 정보를 잘 활용함
단점 : 코퍼스 전체적으로 담겨있는 정보를 활용하는데에 어려움
=> 둘의 trade-off를 극복할 모델의 구상 필요!
GloVe 개요
Notation
일단 본격적인 설명을 하기 전에 context에 관한 정의를 다시 말씀드리고 가겠습니다.
다음과 같은 문장이 있고, cream 주변으로 양 옆 2단어 씩을 cream과 관련있는 단어라고 가정해봅시다. (window size = 2 선택)
She scooped ice cream into their bowls
이 문장 내에서는 cream 단어의 context 내에 scooped, ice, into, their의 단어가 등장한 경우라고 보시면 됩니다.
\( X \)를 단어와 단어 사이 상호 등장 빈도에 관련된 행렬이라고 놓고, 이를 Glove에서 추정하는 방법을 유도하는 과정을 보여드리겠습니다.
행렬 내 각 \( X_{ij} \) 성분은 i번째 단어의 context 내에 j번째 단어가 등장한 횟수로 정의합니다.
\( X_{i} = \sum_{k} X_{ik} \)는 i번째 단어 주변에 context로 등장하는 모든 단어의 횟수 합으로 정의합니다. 이는 아마도 i번째 단어의 출현 빈도와도 깊은 관련이 있을 것으로 생각됩니다.
\( P_{ij} = \frac{X_{ij}}{X_i} \)는 i번째 단어 주변의 context로 j번째 단어가 등장할 확률을 의미할 것입니다. 이 관계를 통해서 단어의 전체 빈도에 대한 보정을 진행하여 단어 간의 밀접한 정도를 학습할 수 있습니다.
자 이제 예시를 하나 들어볼까요?
i = ice, j = stream 으로 놓고, k 단어를 변동시키며, \( r = P_{ik} / P_{jk} \)의 값의 변동을 보겠습니다.
1) k = solid : i 단어와는 밀접한 관계이지만, j 단어와는 관계가 멀어보입니다. r 값은 비교적 큰 값을 나타낼 것입니다.
2) k = gas : i 단어와는 거리가 멀지만, j 단어와는 상당히 관련 있어보입니다. r 값은 비교적 작은 값을 나타낼 것입니다.
3) k = water : i단어, j단어 모두 밀접한 관계를 가지는 단어로 보입니다. r 값은 1에 가까운 값을 나타낼 것입니다.
4) k = fashion : i단어, j단어 모두 먼 관계를 가지는 단어로 보입니다. r 값은 1에 가까운 값을 나타낼 것입니다.
우리는 이제 \( r = P_{ik} / P_{jk} \)에 대한 정보를 모델링 하기 위하여 함수 \( F \)를 다음과 같이 정의하고 싶습니다.
$$ F(w_i, w_j, \tilde{w_k}) = \frac{P_{ik}}{P_{jk}}$$
여기서, \( w, \tilde{w} \) 는 모두 단어를 d 차원의 공간으로 임베딩한 단어 벡터에 해당하며, 이 둘은 사실 같은 방식으로 학습된 서로 다른 두 단어 벡터를 의미하는데, 이렇게 하는 이유는 뒷 파트에서 다시 설명드리겠습니다.
두 단어 벡터의 차가 두 단어의 관계를 의미한다고 보는 것을 원하는 상황이므로, 다음과 같이 재정의를 합니다.
ex) Vector(King) - Vector(Man) + Vector(Woman) = Vector(Queen)
$$ F(w_i - w_j, \tilde{w_k}) = \frac{P_{ik}}{P_{jk}}$$
우변의 값은 확률에서 확률을 나눈 스칼라 값이기에 좌변도 스칼라 값으로 결과가 출력되어야 학습 상황에서 유용할 듯 합니다. 또한, a -> b 단어와 b -> a 단어의 관계를 같은 것으로 간주하려고 \( X = X^T \)의 관계도 성립시키게 정의하고 싶습니다. 따라서, 여기서는 두 단어 벡터의 관계를 내적으로 표시하고 이 값을 확률과 비례하게 하는 식으로 진행합니다.
$$ F((w_i - w_j)^T\tilde{w_k}) = \frac{F(w_i^T \tilde{w_k})}{F(w_j^T \tilde{w_k})}$$
위의 정의를 이용하게 되면, i번째 단어 주변의 context로 k번째 단어가 등장할 확률 \(P_{ik}\) 는 다음의 관계를 가지게 됩니다.
$$ F(w_i^T \tilde{w_k}) = P_{ik} = \frac{X_{ik}}{X_i}$$
이제 F를 비교적 간단한 함수인 \(e^x\) 등으로 놓아봅시다. 그럼 다음과 같이 식을 쉽게 정리해볼 수 있습니다.
$$ w_i^T \tilde{w_k} = log(P_{ik}) = log(X_{ik}) - log(X_i)$$
\( X = X^T \)의 관계를 만들기 위해서, \( log(X_i)\) 텀을 취급하지 않는 것을 고려할 수 있습니다. 또한, bias 텀인 \( b_i, \tilde{b_k}\) 를 추가하여 식을 다음과 같이 만들어보겠습니다.
$$ w_i^T \tilde{w_k} + b_i + \tilde{b_k} = log(X_{ik})$$
참고로, \( X_{ik} = 0\)인 상황에서 로그 값의 계산 불가의 상태를 막기 위하여 \( log(X_{ik})\) 대신 \( log(1 + X_{ik})\) 등을 사용하는 것을 고려할 수도 있습니다.
단어 벡터 학습 단계 - 빈도 고려 Loss function
이제 우리의 목표는 \((w_i^T \tilde{w_k} + b_i + \tilde{b_k})\)(예측값)를 \( log(X_{ik})\)(실제값)와 유사하게 \( W, \tilde{W}, b, \tilde{b}\)를 학습시키는 것입니다.
이를 위해서 모든 단어 pair의 경우에 대해서 두 값의 차의 제곱을 더하는 방식(MSE)를 사용해보는 것을 Loss 함수로 고려할 수 있습니다.
그러나, 코퍼스 전체의 통계적 특징을 잘 반영하기 위해서는, 빈도가 높은 관계에 가중치를 더 주고, 빈도가 낮은 관계에는 가중치를 덜 주는 방식이 반영되는 것이 좋을 것 입니다.
실제로, 모든 단어 pair의 관계 중 데이터셋에 따라 행렬 \(X\) 내 75~95% 정도의 원소(\(X_{ij}\))가 0을 차지하고, 이들에게 같은 가중치를 주는 것은 noise만 증가시키는 결과를 불러올 수 있습니다.
이제 우리는 빈도에 가중치가 적용된 Weighted MSE loss function을 다음과 같이 정의하려 합니다.
$$ J = \sum_{i, j = 1}^{V} f(X_{ij})(w_i^T \tilde{w_j} + b_i + \tilde{b_j} - log(X_{ij}))^2$$
여기서, \(f(X_{ij})\)는 단어 pair의 빈도에 따른 가중치 함수이며, 다음과 같은 성질을 만족해야 합니다.
1. \(f(0) = 0\)이어야 합니다. \(log(0) = -\infty\) 이기에 이를 상쇄해야하기 때문이고 이에 \( \lim_{x \to 0} f(x)log^2 x\) 도 유한한 값을 가져야합니다.
2. \(f(x)\)는 non-decreasing 함수이어야 낮은 빈도에 적은 가중치, 높은 빈도에 큰 가중치 관계를 성립시킬 수 있습니다.
3. \(f(x)\)는 큰 \(x\)값에서도 너무 큰 값을 가져서는 안됩니다. 높은 빈도의 단어 pair에만 가중치가 쏠리는 것을 막기 위함입니다.
이 논문에서는 위의 성질들을 만족하는 \(f(x)\)로 다음 함수를 채택했습니다.
$$ f(x) = \begin{cases} (x / x_{max})^\alpha & if \;x < x_{max} \\ 1 & o.w. \end{cases} $$
이 식에서 \( x_{max} = 100 \), \( \alpha = 3/4 \)을 채택했는데요, 이 의미는 100번 이상 등장한 단어 pair에 대해서는 전부 동등한 가중치를 부여하고, 그 이전에는 낮은 빈도이더라도 비교적 높은 가중치를 부여하겠다는 것입니다. \( \alpha < 1 \)이면 낮은 빈도에도 선형 관계보다 높은 가중치를 가져갈 수 있지요.
이 함수는 대략 다음의 개형을 따른다고 보시면 됩니다.
이후 뒷 파트에 Skip-gram 기법에서 사용했던 loss 함수와 위에서 정의한 loss 함수가 근본적으로는 거의 비슷한 점을 의미한다는 내용을 유도하는 파트가 등장하고,
학습 시간 복잡도가 행렬 \(X\) 내에 0인 원소들은 계산을 생략해도 되어, 코퍼스 개수 |C|에 대해 \(O(|C|)\)보다 효율적인 \(O(|C|^{0.8})\)정도라는 것을 유도하는 파트가 등장합니다만, 이번 포스팅에서는 이 내용들에 대한 자세한 설명은 생략하도록 하겠습니다.
GloVe 성능 평가
1. 평가 방법
- 평가는 지난 skip-gram이나 CBOW를 평가할 때 사용했던 word analogy 방법을 기본으로 사용하였습니다.
a is to b as c is to _ 문항에서 _에 해당하는 단어를 맞추는 정확도를 측정하는 방법입니다.
- 또한, 단어 유사도 측정이나 개체명 인식(ex. 서울 -> 지명, 호랑이 -> 동물)을 하는 방법도 성능 평가 지표로 같이 사용하였습니다.
2. 세부 학습 조건
- 코퍼스 데이터셋은 Gigaword, Wikipedia, Common Crwal 등에서 가져왔습니다.
- 소문자화, 토크나이저(Stanford tokenizer 활용)를 적용하여 단어를 전처리해주었습니다.
- 단어 context에서 해당 단어와 d 단어만큼 떨어진 경우 1/d의 가중치를 반영하는 방법을 사용했습니다.
예를 들면, 바로 옆 단어는 가중치 1, 두 단어 옆은 가중치 1/2, ... 이런 식으로 바로 옆일수록 가장 큰 가중치를 주는 방법입니다.
- \( W, \tilde{W} \) 를 초기화조건만 다르고 같은 방법으로 학습이 되도록 설정을 하고 최종 단어 벡터로는 \( W + \tilde{W} \)를 반영하는 식으로 진행하였는데, 이는 과적합 방지 및 일반화에서 약간의 진전을 보이게 해줄 수 있었습니다.
- 그 외 단어 임베딩 차원 및 코퍼스 사이즈를 변경해가며 실험했으며, skip-gram, CBOW, SVD 등 여러 기존 기법과 성능을 비교했습니다.
3. 결과
- word analogy 테스트에서는 300차원 임베딩, 420억 코퍼스 일 때, 75%의 정확도로 최대 60%를 기록한 다른 모델들을 압도하였고, 의미론, 문법론 쿼리 모두 다른 모델에 비해서 강한 모습을 보였음
- 단어 유사도 측정과 관련된 Spearman rank correlation on word similarity tasks에서도 GloVe가 모든 경우에 대해 강한 모습을 보였고, 개체명 인식에서도 한 경우를 제외하고는 모두 GloVe가 우세한 모습을 보임
4. 벡터 차원 및 context window size 영향 분석
- 벡터 차원 : 200 ~ 300차원까지는 성능이 증가하다 그보다 더 크게 늘렸을 때는 성능 향상 효과 미미
- context window size, 왼쪽 방향으로만 늘려가는 경우와 양쪽 방향으로 모두 늘려가는 경우에 대해서 테스트, window size = 6까지는 성능 향상 효과가 큰 편이었으나, 그 이후로는 미미
5. 코퍼스 사이즈 영향 분석
300차원 임베딩에 대해서 테스트, 문법론 쿼리의 경우는 코퍼스가 커질수록 정확도가 향상되는 경향이 뚜렷했지만, 의미론 쿼리의 경우는 코퍼스가 더 커졌음에도 정확도가 감소하는 경우도 있었음, 전체 정확도도 항상 증가하는 것은 아니었음
6. 다른 모델과의 조건에 대한 영향 차이 분석
same corpus, vocabulary, window size, and training time 조건에 있어서 GloVe가 대체로 우세한 조건을 보임