GloVe 논문 리뷰
abstract
벡터 공간에서 단어 벡터를 표현하고자하는 연구는 많이 이루어졌지만 global matrix factorization, 예를 들면, LSA(latent semantic analysis), 은 단어간의 의미거리를 제대로 파악하지 못하고 skip-gram은 단어간 의미상 차이는 잘 반영하지만 단어의 전역적인 통계는 반영하지 못하는 문제가 있다.
단어-단어의 공출현 빈도를 기반으로한 weighted least squares model을 사용하였다.
결과적으로 word analogy dataset에서 75%의 정확도를 기록하였고(state-of-art) NER task에서도 기존 방법들 보다 나은 성능을 보였다.
연구의 배경
사전에서는 단어를 <뜻>에 해당하는 문장으로 정의를 하지만 이외에도 단어를 나타낼 수 있는 방법은 많다. 공출현 빈도가 높은 다른 단어들과의 관계로 단어를 정의하는 방법이 NLP분야에서 word를 정의하는 방법인 것 같다. (이렇게하면 장점도 많지만 한계도 있는데, 그것은 나중에 정리하도록 하자.)
두 단어가 공출현인지 아닌지 정의하려면 말뭉치의 범위를 지정해야한다. 범위가 큰것은 문서 전체 또는 문단 전체가 될 수 있고 범위가 작은 것은 문장, 혹은 bi-gram 등의 n-gram이 될 수 있다. LSA는 문서 전체를 이용한다. 흔히 많이 쓰이는 word2vec의 CBOW와 skip-gram은 작은 범위를 공출현을 이용한다. 전자의 approach를 (1) global co-occurence 후자를 (2) local window로 나누어서 설명을 하겠다. (단순히 범위가 이 둘의 명확한 구분이 되지 않을지도? 알고리즘 자체가 다르니...)
(1) global co-occurence
matrix factorization(행렬 분해)는 높은 차원의 벡터를 성질(?)을 근사하게 유지하면서 낮은 차원으로 줄이는 방법이다. LSA가 대표적인 방법으로 말뭉치 전체의 통계를 행렬로 먼저 만든 뒤 singular value decomposition(SVD)를 통해 term-document의 lower rank approximation 2차원 행렬로 만드는 것이다.
Hyperspace Analogue to Language(HAL)은 term-term 형태의 행렬을 만드는데, 행과 열은 단어이며 내용은 공출현 빈도이다.
그러나 HAL은 너무 자주 등장하는 단어(the, a)가 의미상 관련이 없는 문제가 있다. 이를 해결하기 위한 연구로는 COALS, PPMI, HPCA등이 있다. COALS는 공출현 행렬을 먼저 entropy 또는 correlation-based 정규화를 시킨다. PPMI는 positive pointwise mutual information으로 행렬을 변환시키고 HPCA는 Hellinger PCA의 형태의 square root type 행렬 변환을 시킨다.
(2) local window
유명한 Word2Vec이 이러한 방법을 쓴다. n-gram 크기의 window를 지정해서 이를 sliding하면서 공출현하는 단어의 관계를 파악한다.
방법론
GloVe의 아이디어는 공출현 빈도가 높은 단어의 쌍으로 단어를 정의한다는 것이다. 이때 단순 공출현 확률이나 두 단어간의 조건부 확률로 이를 나타내는 것이 아니라, 제3의 단어를 들여와서 3단어의 공출현 빈도를 살펴서 기존 단어쌍의 관계성을 파악하는 것이다.
표에서 마지막 3번째 행이 GloVe의 단어 벡터를 훈련하는 척도가 되는 값이다. 두 단어의 3번째 행의 값이 높을수록 비슷한(가까운) 벡터가 되도록 훈련 시키는 아이디어인것 같다.
(초기화는 랜덤으로하고 점차 변화시키는 것이겠지?)
그래서 훈련시키고자하는 함수는 F이며 입력값으로 3개의 벡터가 주어졌을 때, 이전에 구했던 3번째 행의 값이 나오도록 파라미터를 설정하고 싶다.(그럼 loss funtion은 값의 차이가 되겠구나)
이때 입력은 벡터이고 결과값은 스칼라여야되므로 벡터를 스칼라로 바꾸어주는 연산이 필요하다. 그래서 두 벡터를 빼준 뒤(벡터 연산은 선형적이므로 결과는 차이 없다) dot product을 입력값으로 한다. 논문에서는 설명하지 않았지만 내적이 두 벡터의 similarity 지표가 되기도 한다고 한다.(일반적으로 두 벡터의 성분의 분포가 비슷할 때, 가까운 벡터일수록 내적이 커진다고 한다...이건 확인해 봐야겠다)
마지막으로 식을 깔끔하게 만들고 싶은데 지금의 식은 일반 word와 context word 간의 구분이 있다. context word를 일반 word로 표현하고자하면(???) 다음처럼 나타내면 된다.
이게 homorphism(?)이라는 개념인데, 이를 만족하는 F는 지수함수여야한다. 그래서 아래의 도출된 식에 log를 취해서 정리하자면,(Xi는 bi로 흡수하고 bk 추가함)
위 식의 좌변과 우변이 같도록 weight와 bias를 구해야 한다.
그러나 log는 입력이 0일때 마이너스로 발산하기 때문에 위식은 문제가 있다. 해결방법으로 +1을 해준다 등의 방법이 있다.
공출현 빈도를 셀 때 문제가 같이 잘 등장하지 않은 단어들은 noise가 심하다는 것이다. 그래서 weight function을 도입하여 문제를 최소화하고자 하였다.
그래서 최종 loss function은 weight function을 곱해서 다음과 같이 정의하였다.
이때 f(X_{i,j})가 weight function이 되어서 특정 범위의 값에 weight를 더한다.
이 weight function은 다음과 같이 생겼고 점진적으로 증가하다 특정 값을 넘어가면 1이라는 상수가 되어 더이상 증가하지 않는다.
배운점
word2vec이 named entity recognition 및 similarity task에 직접적인 해답이 될 수 있다.
그리고 딥러닝 모델의 weight가 유용할수도 있겠구나?
벡터 공간에서 단어 벡터를 표현하고자하는 연구는 많이 이루어졌지만 global matrix factorization, 예를 들면, LSA(latent semantic analysis), 은 단어간의 의미거리를 제대로 파악하지 못하고 skip-gram은 단어간 의미상 차이는 잘 반영하지만 단어의 전역적인 통계는 반영하지 못하는 문제가 있다.
단어-단어의 공출현 빈도를 기반으로한 weighted least squares model을 사용하였다.
결과적으로 word analogy dataset에서 75%의 정확도를 기록하였고(state-of-art) NER task에서도 기존 방법들 보다 나은 성능을 보였다.
연구의 배경
사전에서는 단어를 <뜻>에 해당하는 문장으로 정의를 하지만 이외에도 단어를 나타낼 수 있는 방법은 많다. 공출현 빈도가 높은 다른 단어들과의 관계로 단어를 정의하는 방법이 NLP분야에서 word를 정의하는 방법인 것 같다. (이렇게하면 장점도 많지만 한계도 있는데, 그것은 나중에 정리하도록 하자.)
두 단어가 공출현인지 아닌지 정의하려면 말뭉치의 범위를 지정해야한다. 범위가 큰것은 문서 전체 또는 문단 전체가 될 수 있고 범위가 작은 것은 문장, 혹은 bi-gram 등의 n-gram이 될 수 있다. LSA는 문서 전체를 이용한다. 흔히 많이 쓰이는 word2vec의 CBOW와 skip-gram은 작은 범위를 공출현을 이용한다. 전자의 approach를 (1) global co-occurence 후자를 (2) local window로 나누어서 설명을 하겠다. (단순히 범위가 이 둘의 명확한 구분이 되지 않을지도? 알고리즘 자체가 다르니...)
(1) global co-occurence
matrix factorization(행렬 분해)는 높은 차원의 벡터를 성질(?)을 근사하게 유지하면서 낮은 차원으로 줄이는 방법이다. LSA가 대표적인 방법으로 말뭉치 전체의 통계를 행렬로 먼저 만든 뒤 singular value decomposition(SVD)를 통해 term-document의 lower rank approximation 2차원 행렬로 만드는 것이다.
Hyperspace Analogue to Language(HAL)은 term-term 형태의 행렬을 만드는데, 행과 열은 단어이며 내용은 공출현 빈도이다.
그러나 HAL은 너무 자주 등장하는 단어(the, a)가 의미상 관련이 없는 문제가 있다. 이를 해결하기 위한 연구로는 COALS, PPMI, HPCA등이 있다. COALS는 공출현 행렬을 먼저 entropy 또는 correlation-based 정규화를 시킨다. PPMI는 positive pointwise mutual information으로 행렬을 변환시키고 HPCA는 Hellinger PCA의 형태의 square root type 행렬 변환을 시킨다.
(2) local window
유명한 Word2Vec이 이러한 방법을 쓴다. n-gram 크기의 window를 지정해서 이를 sliding하면서 공출현하는 단어의 관계를 파악한다.
방법론
GloVe의 아이디어는 공출현 빈도가 높은 단어의 쌍으로 단어를 정의한다는 것이다. 이때 단순 공출현 확률이나 두 단어간의 조건부 확률로 이를 나타내는 것이 아니라, 제3의 단어를 들여와서 3단어의 공출현 빈도를 살펴서 기존 단어쌍의 관계성을 파악하는 것이다.
표에서 마지막 3번째 행이 GloVe의 단어 벡터를 훈련하는 척도가 되는 값이다. 두 단어의 3번째 행의 값이 높을수록 비슷한(가까운) 벡터가 되도록 훈련 시키는 아이디어인것 같다.
(초기화는 랜덤으로하고 점차 변화시키는 것이겠지?)
그래서 훈련시키고자하는 함수는 F이며 입력값으로 3개의 벡터가 주어졌을 때, 이전에 구했던 3번째 행의 값이 나오도록 파라미터를 설정하고 싶다.(그럼 loss funtion은 값의 차이가 되겠구나)
이때 입력은 벡터이고 결과값은 스칼라여야되므로 벡터를 스칼라로 바꾸어주는 연산이 필요하다. 그래서 두 벡터를 빼준 뒤(벡터 연산은 선형적이므로 결과는 차이 없다) dot product을 입력값으로 한다. 논문에서는 설명하지 않았지만 내적이 두 벡터의 similarity 지표가 되기도 한다고 한다.(일반적으로 두 벡터의 성분의 분포가 비슷할 때, 가까운 벡터일수록 내적이 커진다고 한다...이건 확인해 봐야겠다)
마지막으로 식을 깔끔하게 만들고 싶은데 지금의 식은 일반 word와 context word 간의 구분이 있다. context word를 일반 word로 표현하고자하면(???) 다음처럼 나타내면 된다.
이게 homorphism(?)이라는 개념인데, 이를 만족하는 F는 지수함수여야한다. 그래서 아래의 도출된 식에 log를 취해서 정리하자면,(Xi는 bi로 흡수하고 bk 추가함)
위 식의 좌변과 우변이 같도록 weight와 bias를 구해야 한다.
그러나 log는 입력이 0일때 마이너스로 발산하기 때문에 위식은 문제가 있다. 해결방법으로 +1을 해준다 등의 방법이 있다.
공출현 빈도를 셀 때 문제가 같이 잘 등장하지 않은 단어들은 noise가 심하다는 것이다. 그래서 weight function을 도입하여 문제를 최소화하고자 하였다.
그래서 최종 loss function은 weight function을 곱해서 다음과 같이 정의하였다.
이때 f(X_{i,j})가 weight function이 되어서 특정 범위의 값에 weight를 더한다.
이 weight function은 다음과 같이 생겼고 점진적으로 증가하다 특정 값을 넘어가면 1이라는 상수가 되어 더이상 증가하지 않는다.
배운점
word2vec이 named entity recognition 및 similarity task에 직접적인 해답이 될 수 있다.
그리고 딥러닝 모델의 weight가 유용할수도 있겠구나?
댓글
댓글 쓰기