한빛미디어의 <밑바닥부터 시작하는 딥러닝 2>를 요약 정리한 글이다.
PMI(Pointwise Mutual Information)는 두 단어가 기대보다 얼마나 자주 함께 등장하는지를 측정하는 지표이다.
단순 동시발생 빈도는 고빈도 단어에 편향될 수 있다. PMI는 실제 동시발생 빈도를 독립적으로 등장했을 때의 기대 빈도와 비교하여 이 문제를 완화한다.
SVD(Singular Value Decomposition)는 행렬을 여러 행렬의 곱으로 분해하는 방법이다. NLP에서는 PPMI 행렬에 SVD를 적용하여 고차원 단어-문맥 행렬을 저차원 단어 벡터로 압축할 수 있다.
단순 동시발생 빈도의 문제
단순히 단어 동시 등장 빈도(co-occurrence)를 기반으로 유사도를 계산하면 고빈도 단어 편향 문제가 발생한다.
예를 들어 the, and, of 같은 단어는 거의 모든 단어와 자주 함께 등장한다.
이런 단어들은 실제 의미적 관련성이 낮더라도 동시발생 빈도가 높게 계산될 수 있다.
즉, 단순 동시발생 빈도만 보면 의미적으로 가까운 단어인지, 단순히 자주 등장하는 단어인지 구분하기 어렵다.
PMI는 이런 고빈도 편향을 줄이기 위한 방법이다.
PMI
PMI는 다음과 같이 정의된다.
여기서 각 확률의 의미는 다음과 같다.
- : 단어 가 등장할 확률
- : 단어 가 등장할 확률
- : 단어 와 가 함께 등장할 확률
말뭉치의 동시발생행렬 를 이용하면 다음과 같이 쓸 수 있다.
여기서 각 기호의 의미는 다음과 같다.
- : 단어 와 가 동시발생한 횟수
- : 단어 의 등장 횟수
- : 단어 의 등장 횟수
- : 말뭉치에 포함된 전체 단어 수
식을 정리하면 다음과 같다.
이 식은 실제 함께 등장한 정도와 독립적으로 등장했을 때 기대되는 정도를 비교한다.
분자는 실제 함께 등장한 횟수에 전체 단어 수를 곱한 값이다.
분모는 두 단어가 독립적으로 등장한다고 가정했을 때의 기대 빈도에 해당한다.
따라서 PMI는 다음 비율을 로그로 측정하는 값이라고 볼 수 있다.
PMI의 직관
PMI의 핵심 직관은 두 단어가 우연히 같이 등장하는 수준보다 얼마나 더 자주 등장하는지를 보는 것이다.
희귀 단어 두 개는 독립적으로 등장했을 때 기대값이 낮다. 따라서 조금만 같이 등장해도 PMI 값이 크게 나올 수 있다.
반대로 매우 빈번한 단어는 기대값이 크다. 그래서 실제 동시출현 횟수가 많더라도 PMI 값은 상대적으로 낮아질 수 있다.
비율 관점에서 보면 다음과 같이 해석할 수 있다.
- 비율이 1이면 예상한 정도로 함께 등장하는 것이다.
- 비율이 1보다 크면 예상보다 자주 함께 등장하는 것이다.
- 비율이 1보다 작으면 예상보다 덜 함께 등장하는 것이다.
PMI는 이 비율에 를 적용한다.
예를 들어 실제 동시발생이 기대보다 2배 많으면 다음과 같다.
기대보다 4배 많으면 다음과 같다.
기대보다 0.5배라면 다음과 같다.
즉, PMI는 두 단어가 예상보다 얼마나 더 많이 또는 적게 함께 등장하는지를 비트 단위로 측정한다.
PPMI
PMI에는 문제가 있다.
두 단어의 동시발생 횟수가 0이면 로그 안의 값도 0이 된다.
또한 음수 PMI 값은 단어 벡터 표현에서 다루기 불편할 수 있다.
그래서 음수 값을 0으로 잘라낸 PPMI(Positive PMI)를 사용한다.
PPMI는 양의 상호정보량만 남긴다.
즉, 기대보다 더 자주 함께 등장하는 관계만 양수로 표현하고, 기대보다 덜 등장하는 관계는 0으로 처리한다.
SVD
SVD(Singular Value Decomposition)는 특잇값 분해이다.
임의의 행렬 를 다음 세 행렬의 곱으로 분해한다.
이때 와 는 직교행렬이며, 각 열벡터는 서로 직교한다.
는 대각행렬이다.
SVD 기본 정의
행렬 이 다음과 같다고 하자.
SVD는 을 다음과 같이 분해한다.
각 행렬의 의미는 다음과 같다.
는 왼쪽 특이벡터 행렬이다. NLP의 단어-문맥 행렬에서는 단어 방향 정보를 가진다고 볼 수 있다.
는 대각행렬이며, 대각 성분은 특잇값이다. 각 특잇값은 대응하는 축의 중요도를 나타낸다.
는 오른쪽 특이벡터 행렬이다. 단어-문맥 행렬에서는 문맥 방향 정보를 가진다고 볼 수 있다.
여기서 은 행렬 의 rank이다.
PPMI 행렬과 SVD
NLP에서는 단어와 문맥의 동시발생 정보를 바탕으로 PPMI 행렬을 만들 수 있다.
이 행렬은 다음과 같은 형태를 가진다.
이 PPMI 행렬에 SVD를 적용하면 다음과 같다.
이때 단어 벡터는 와 를 이용해 만들 수 있다.
문맥 벡터는 와 를 이용해 만들 수 있다.
즉, PPMI 행렬을 SVD로 분해하면 단어와 문맥을 각각 벡터 공간에 배치할 수 있다.
차원 축소
PPMI 행렬은 단어 수와 문맥 수가 커질수록 매우 큰 고차원 행렬이 된다.
SVD를 사용하면 이 행렬을 저차원으로 근사할 수 있다.
상위 개의 특잇값과 특이벡터만 사용하면 다음과 같이 근사할 수 있다.
각 행렬의 크기는 다음과 같다.
이때 단어 벡터는 다음과 같이 축소된다.
문맥 벡터는 다음과 같이 축소된다.
결과적으로 SVD는 PPMI 행렬의 중요한 구조만 남기고 차원을 줄이는 역할을 한다.
요약
단순 동시발생 빈도는 고빈도 단어 편향 문제가 있다.
PMI는 실제 동시발생 빈도를 독립 등장 기준 기대 빈도와 비교하여 두 단어의 관련성을 측정한다.
PPMI는 PMI의 음수 값을 0으로 잘라낸 값이다.
SVD는 PPMI 행렬을 분해하여 단어와 문맥을 벡터로 표현할 수 있게 한다.
상위 개의 특잇값만 사용하면 고차원 PPMI 행렬을 저차원 단어 벡터로 근사할 수 있다.