[CS224n] Chapter1: Introduction and Word Vectors

투빅스·2022년 4월 8일
0

[CS224n] Chapter1: Introduction and Word Vectors

  • Language is not a formal system, language is glorious chaos!
  • 언어는 사람들에 의해 구성되고 해석되는 사회적 시스템

인간이 다른 동물에 비해 발전할 수 있었던 이유는 무엇일까? 언어를 통해 의사소통하고, 후대로 지식을 전달할 수 있었기 때문이다.

How do we represent the meaning of word?

의미를 표현하는 방법을 생각해보자.

언어학자들이 생각하는 일반적 방식은 signifier(symbol):signified(idea or thing)의 방식이다. 즉 기표(의미하는 것)과 기의(단어가 의미하는 바)를 매칭시키는 것이다. 이는 다시말해 표시적 의미론(denotational semantics)라고 부른다.

쉽게 말해 사전을 생각하면 되는데, 전통적으로 NLP에서는 유의어 사전을 사용하는 경우가 많았다. 동의어와 상위어 리스트가 포함된 사전인 WordNet이 바로 이전에 가장 흔했던 NLP solution이다.

WordNet은 유용한 자원이나, 여러 한계점을 가지고 있다.

먼저, 단어의 뉘앙스를 파악하지 못한다는 점이다. "proficient"와 "good"은 비슷한 의미이나 동일한 뜻을 가지지는 못한다. 이 두 단어가 동의어라는 말은 몇몇 경우에만 성립한다.

또한, 단어의 새로운 뜻을 반영하지 못한다는 한계가 있다. 단어를 최신 뜻을 가지도록, 최신 정보를 가지도록 유지하는 것은 불가능하다. 뿐만 아니라 주관적이라는 점, 노동력이 든다는 점, 단어의 유사도를 계산할 수 없다는 점 등이 한계점이다.

그렇다면 동의어 관계가 아니라, 유사성에 대해서 이야기 하면 어떨까? 이 관점에서 나온 것이 바로 Word2vec이다.

다시 이전으로 돌아가서, 전통적인 NLP에서는 우리는 단어를 discrete symbols로 취급했다. 다시 말해 localist representation 방식을 사용했다는 것이다. 이 경우, 단어들은 one-hot vector로 표현된다는 뜻이므로, 단어 하나가 하나의 차원이 된다. 다시말해, 단어의 뜻은 총 단어의 수만큼의 차원을 가진 vector로 표현이 된다.

이는 많은 문제를 야기한다. 만약에 단어가 십만개가 주어진다고 생각해보자. 단어가 십만개라면, 벡터의 차원도 십만개가 된다. 차원수가 높으면 훈련 데이터를 많이 필요로 하게 되는데다가, 메모리 사용이 늘어나고, 계산 복잡도가 매우 늘어나게 되는 '차원의 저주'에 빠질 수 있다. 단 하나의 값만 1을 가지고 9만 9999개의 값은 0을 가지는 희소행렬 문제를 갖게 되기에, 저장 공간 측면에서도 매우 비효율적인 방법이다. one-hot vector는 각각이 독립적인 축을 가지고 있기에 단어 간 유사성을 알 수 없다. 하지만 우리 모두 알고 있듯이 현실에서는 단어들이 서로 의미적인 관계를 갖고 있다.

이러한 Localist representation 방식의 문제를 해결하기 위해 등장한 개념이 바로 Distributed Representation이다. Distributed Representation은 기본적으로 distributional hypothesis라는 가정 하에서 나온 방법이다.

💡 distributional hypothesis
A word's meaning is give by the words that frequently appear close-by(비슷한 위치에서 자주 등장하는 단어들은 비슷한 의미를 가진다)

distributional hypothesis은 이 가설에 따라 단어들을 학습하고, 벡터에 단어의 의미를 여러 차원에 분산하여 표현한다. 다시말해, one-hot encoding은 각각의 속성을 독립적인 차원에 나타냈던 것과 다르게 분산 표현은 우리가 정한 차원에 대응하여 표시된다. 즉, 원핫인코딩 처럼 하나의 차원이 하나의 속성을 명시적으로 표현하는 것이 아니라, 여러 차원들이 조합되어 나타내고자 하는 속성들을 표현한다.

다시 말해, 우리는 더 이상 각 단어의 의미를 표현할 수 있는 vector로 sparse vector가 아닌, dense real valued vector를 만들고자 하며, 이 때 단어의 의미는 단어 근처에서 자주 출현하는 단어에서 얻을 수 있다는 것이다.

Word2vec

word2vec의 아이디어는 다음과 같다.

  • 우리는 많은 텍스트 말뭉치(corpus)를 가지고 있다.
  • 고정된 vocabulary의 모든 단어는 벡터로 표현된다.
  • 위치 t의 텍스트는 중심 단어(center word) c와 맥락 단어(context word) o를 가진다.
  • c와 o에 대한 word vectors의 유사도를 이용해 c가 주어졌을 때 o가 나타날 확률을 계산한다.
  • 이 확률을 최대화하기 위해 word vectors를 계속 조정해나간다.

Word2vec의 아키텍처(skip-gram)

위 아키텍처에서 핵심은 가중치 행렬 WW, WW’이다. 이 때 아래의 식에서 vv는 입력층-은닉층을 잇는 가중치 행렬 WW의 행벡터, uu는 은닉층-출력층을 잇는 가중치 행렬 WW’의 열벡터를 의미한다.

Likelihood

중심단어 c에 대한 Likelihood는 다음과 같다.
L(θ)=t=1Tmjm, j0p(wt+jwt;θ)L(\theta) = \prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} p(w_{t+j} | w_t; \theta)

즉, 각 포지션((t=1T)(\prod_{t=1}^{T}))의 중심단어 c=wtc=w_t에 대해, wtw_t가 주어졌을 때 다른 문맥단어 o=wt+jo=w_{t+j}가 나오는 확률 p(wt+jwt;θ)p(w_{t+j} | w_t; \theta)을 가능하게 만드는 θ\theta를 구하는 것을 의미한다. 이에 따라 Likelihood를 최대화 하는 것이 목적이 된다.

그러나 우리는 Gradient Descent를 사용하고자 하고, 이를 위해 위 식을 Negative Log Likelihood로 변형해서 쓰고자 한다. 즉, Maximizing Likelihood를 Minimizing objective function 문제로 변환하였다.

minJ(θ)=1Tt=1Tmjm, j0logp(wt+jwt)\min J(\theta) = -\dfrac{1}{T} \sum_{t=1}^T \sum_{-m \leq j \leq m,\ j \neq 0} \log p(w_{t+j} | w_t)

log\log를 취해줌에 따라, \prod\sum로 바뀌고, 0~1 사이의 값일 L(θ)L(\theta) 값이 log\log를 만나 음수 값이 되며, 이는 1T-\dfrac{1}{T}를 만나 양수 값이 된다. 따라서 최소화 문제로 이를 변환할 수 있다.

minJ(θ)=1Tt=1Tmjm, j0logp(wt+jwt)\min J(\theta) = -\dfrac{1}{T} \sum_{t=1}^T \sum_{-m \leq j \leq m,\ j \neq 0} \log p(w_{t+j} | w_t)

그렇다면, 단어가 등장할 확률은 어떻게 구해야할까?

p(oc)=exp(uoTVc)w=1Vexp(uwTVc)p(o|c) = \dfrac{\exp(u_o^T V_c)}{\sum_{w=1}^V \exp(u_w^T V_c)}

분자를 증가시킨다는 말은 exp\exp의 지수를 크게 한다는 말이다. exp\exp 지수는 두 벡터의 내적값이 된다. 즉, 이 값이 커지면 벡터 간의 θ\theta 값은 줄어들고, 즉 유사도를 높인다는 뜻이다.

다시 말해 위 식을 풀이하자면, 중심단어와 주변단어 벡터의 유사도는 높이고(분자), 중심단어와 학습 말뭉치 내 모든 단어를 각각 내적한 것의 총합은 작어져야 한다(분모). 즉, 분모를 줄이려면 주변단어가 아닌 단어와 중심 단어의 유사도는 낮아져야 한다.

profile
투빅스 16&17기 텍스트 세미나입니다.

2개의 댓글

comment-user-thumbnail
2022년 4월 25일

투빅스 17기 홍종현

전통적인 NLP방식에서는 동의어와 상위어 리스트인 WordNet 단어 사전을 이용했지만 여러 한계점이 존재했습니다. 그래서 단어의 뜻 하나를 차원으로 하여 표현하는 localist representation 방법인 one-hot vector를 사용했습니다. 그러나 one-hot vector에도 여러 문제점이 존재했는데 차원이 매우 늘어나게 되고 단어의 의미를 담지 못한다는 점입니다. 이러한 문제점을 극복하고자 embedding 기법 중 하나인 Word2Vec이 도입되었습니다. Word2Vec은 중심단어와 주변단어를 vector로 표현하여 vector 공간에 embedding 하는 알고리즘입니다. 그리고 Word2vec으로 window에 해당하는 주변 단어들을 바탕으로 target 단어가 나올 확률을 구한 뒤, 가장 확률이 높은 단어를 예측하는 방식입니다.

답글 달기