PMI, SVD

NLP 글 목록

한빛미디어의 <밑바닥부터 시작하는 딥러닝 2>를 요약 정리한 글이다.

PMI(Pointwise Mutual Information)는 두 단어가 기대보다 얼마나 자주 함께 등장하는지를 측정하는 지표이다.

단순 동시발생 빈도는 고빈도 단어에 편향될 수 있다. PMI는 실제 동시발생 빈도를 독립적으로 등장했을 때의 기대 빈도와 비교하여 이 문제를 완화한다.

SVD(Singular Value Decomposition)는 행렬을 여러 행렬의 곱으로 분해하는 방법이다. NLP에서는 PPMI 행렬에 SVD를 적용하여 고차원 단어-문맥 행렬을 저차원 단어 벡터로 압축할 수 있다.

단순 동시발생 빈도의 문제

단순히 단어 동시 등장 빈도(co-occurrence)를 기반으로 유사도를 계산하면 고빈도 단어 편향 문제가 발생한다.

예를 들어 the, and, of 같은 단어는 거의 모든 단어와 자주 함께 등장한다.

이런 단어들은 실제 의미적 관련성이 낮더라도 동시발생 빈도가 높게 계산될 수 있다.

즉, 단순 동시발생 빈도만 보면 의미적으로 가까운 단어인지, 단순히 자주 등장하는 단어인지 구분하기 어렵다.

PMI는 이런 고빈도 편향을 줄이기 위한 방법이다.

PMI

PMI는 다음과 같이 정의된다.

PMI(x,y)=log2P(x,y)P(x)P(y)PMI(x,y) = \log_2 \frac{P(x,y)}{P(x)P(y)}

여기서 각 확률의 의미는 다음과 같다.

  • P(x)P(x): 단어 xx가 등장할 확률
  • P(y)P(y): 단어 yy가 등장할 확률
  • P(x,y)P(x,y): 단어 xxyy가 함께 등장할 확률

말뭉치의 동시발생행렬 CC를 이용하면 다음과 같이 쓸 수 있다.

PMI(x,y)=log2C(x,y)NC(x)NC(y)NPMI(x,y) = \log_2 \frac{\frac{C(x,y)}{N}} {\frac{C(x)}{N}\frac{C(y)}{N}}

여기서 각 기호의 의미는 다음과 같다.

  • C(x,y)C(x,y): 단어 xxyy가 동시발생한 횟수
  • C(x)C(x): 단어 xx의 등장 횟수
  • C(y)C(y): 단어 yy의 등장 횟수
  • NN: 말뭉치에 포함된 전체 단어 수

식을 정리하면 다음과 같다.

PMI(x,y)=log2C(x,y)NC(x)C(y)PMI(x,y) = \log_2 \frac{C(x,y) \cdot N}{C(x)C(y)}

이 식은 실제 함께 등장한 정도와 독립적으로 등장했을 때 기대되는 정도를 비교한다.

분자는 실제 함께 등장한 횟수에 전체 단어 수를 곱한 값이다.

분모는 두 단어가 독립적으로 등장한다고 가정했을 때의 기대 빈도에 해당한다.

따라서 PMI는 다음 비율을 로그로 측정하는 값이라고 볼 수 있다.

실제 동시발생 빈도독립 등장 기준 기대 빈도\frac{\text{실제 동시발생 빈도}}{\text{독립 등장 기준 기대 빈도}}

PMI의 직관

PMI의 핵심 직관은 두 단어가 우연히 같이 등장하는 수준보다 얼마나 더 자주 등장하는지를 보는 것이다.

희귀 단어 두 개는 독립적으로 등장했을 때 기대값이 낮다. 따라서 조금만 같이 등장해도 PMI 값이 크게 나올 수 있다.

반대로 매우 빈번한 단어는 기대값이 크다. 그래서 실제 동시출현 횟수가 많더라도 PMI 값은 상대적으로 낮아질 수 있다.

비율 관점에서 보면 다음과 같이 해석할 수 있다.

  • 비율이 1이면 예상한 정도로 함께 등장하는 것이다.
  • 비율이 1보다 크면 예상보다 자주 함께 등장하는 것이다.
  • 비율이 1보다 작으면 예상보다 덜 함께 등장하는 것이다.

PMI는 이 비율에 log2\log_2를 적용한다.

예를 들어 실제 동시발생이 기대보다 2배 많으면 다음과 같다.

log22=1\log_2 2 = 1

기대보다 4배 많으면 다음과 같다.

log24=2\log_2 4 = 2

기대보다 0.5배라면 다음과 같다.

log20.5=1\log_2 0.5 = -1

즉, PMI는 두 단어가 예상보다 얼마나 더 많이 또는 적게 함께 등장하는지를 비트 단위로 측정한다.

PPMI

PMI에는 문제가 있다.

두 단어의 동시발생 횟수가 0이면 로그 안의 값도 0이 된다.

log20=\log_2 0 = -\infty

또한 음수 PMI 값은 단어 벡터 표현에서 다루기 불편할 수 있다.

그래서 음수 값을 0으로 잘라낸 PPMI(Positive PMI)를 사용한다.

PPMI(x,y)=max(0,PMI(x,y))PPMI(x,y) = \max(0, PMI(x,y))

PPMI는 양의 상호정보량만 남긴다.

즉, 기대보다 더 자주 함께 등장하는 관계만 양수로 표현하고, 기대보다 덜 등장하는 관계는 0으로 처리한다.

SVD

SVD(Singular Value Decomposition)는 특잇값 분해이다.

임의의 행렬 XX를 다음 세 행렬의 곱으로 분해한다.

X=USVTX = USV^T

이때 UUVV는 직교행렬이며, 각 열벡터는 서로 직교한다.

SS는 대각행렬이다.

SVD 기본 정의

행렬 MM이 다음과 같다고 하자.

MRm×nM \in \mathbb{R}^{m \times n}

SVD는 MM을 다음과 같이 분해한다.

M=USVTM = U S V^T

각 행렬의 의미는 다음과 같다.

URm×rU \in \mathbb{R}^{m \times r}

UU는 왼쪽 특이벡터 행렬이다. NLP의 단어-문맥 행렬에서는 단어 방향 정보를 가진다고 볼 수 있다.

SRr×rS \in \mathbb{R}^{r \times r}

SS는 대각행렬이며, 대각 성분은 특잇값이다. 각 특잇값은 대응하는 축의 중요도를 나타낸다.

VRn×rV \in \mathbb{R}^{n \times r}

VV는 오른쪽 특이벡터 행렬이다. 단어-문맥 행렬에서는 문맥 방향 정보를 가진다고 볼 수 있다.

여기서 rr은 행렬 MM의 rank이다.

r=rank(M)r = \text{rank}(M)

PPMI 행렬과 SVD

NLP에서는 단어와 문맥의 동시발생 정보를 바탕으로 PPMI 행렬을 만들 수 있다.

M=PPMI matrixM = \text{PPMI matrix}

이 행렬은 다음과 같은 형태를 가진다.

MRwords×contextsM \in \mathbb{R}^{\text{words} \times \text{contexts}}

이 PPMI 행렬에 SVD를 적용하면 다음과 같다.

M=USVTM = U S V^T

이때 단어 벡터는 UUSS를 이용해 만들 수 있다.

Word vectors=US\text{Word vectors} = U S

문맥 벡터는 VVSS를 이용해 만들 수 있다.

Context vectors=VS\text{Context vectors} = V S

즉, PPMI 행렬을 SVD로 분해하면 단어와 문맥을 각각 벡터 공간에 배치할 수 있다.

차원 축소

PPMI 행렬은 단어 수와 문맥 수가 커질수록 매우 큰 고차원 행렬이 된다.

SVD를 사용하면 이 행렬을 저차원으로 근사할 수 있다.

상위 kk개의 특잇값과 특이벡터만 사용하면 다음과 같이 근사할 수 있다.

MUkSkVkTM \approx U_k S_k V_k^T

각 행렬의 크기는 다음과 같다.

UkRm×kU_k \in \mathbb{R}^{m \times k} SkRk×kS_k \in \mathbb{R}^{k \times k} VkRn×kV_k \in \mathbb{R}^{n \times k}

이때 단어 벡터는 다음과 같이 축소된다.

Reduced word vectors=UkSk\text{Reduced word vectors} = U_k S_k

문맥 벡터는 다음과 같이 축소된다.

Reduced context vectors=VkSk\text{Reduced context vectors} = V_k S_k

결과적으로 SVD는 PPMI 행렬의 중요한 구조만 남기고 차원을 줄이는 역할을 한다.

요약

단순 동시발생 빈도는 고빈도 단어 편향 문제가 있다.

PMI는 실제 동시발생 빈도를 독립 등장 기준 기대 빈도와 비교하여 두 단어의 관련성을 측정한다.

PPMI는 PMI의 음수 값을 0으로 잘라낸 값이다.

SVD는 PPMI 행렬을 분해하여 단어와 문맥을 벡터로 표현할 수 있게 한다.

상위 kk개의 특잇값만 사용하면 고차원 PPMI 행렬을 저차원 단어 벡터로 근사할 수 있다.