본문 바로가기

머신러닝/[기타]

Co-occurence, PPMI, Similarity matrix

논문을 읽다보면, Co-occurence, PPMI, Similiarty matrix 라는 단어가 종종 나오는데, 애매하게 알고 있던 감이 있어 다시 한 번 정리해 둘게요. 그리고 해당 글 작성을 위해 [한경훈님의 유튜브 강의]를 참고하였다는 것을 밝힙니다.

3개 행렬에 대해 설명하기 앞서 예제 하나를 고정하고 가겠습니다. 

"You say goodbye and i say hello."

1. Co-occurence matrix

"You shall know a word by the company it keeps"
                                                 - John R.Firth

 "단어는, 사용된 맥락에서 그 의미를 가진다." 라는 말이네요. 사용된 맥락을 조금 더 쉽게 풀면, 어떤 단어의 주변에는 어떤 단어들이 존재했는가- 라는 뜻이 됩니다. 앞서 고정했던 예시에서, say 라는 단어의 의미는, 주변에 있는 you와 goodbye로부터 이끌어내질 수 있다는 말이네요. 다시, 다른 표현으로 말하면, 한 문장에서 say와 함께 등장했던, 동시에 등장했던 단어들이, say를 표현하기 위해 필요합니다.

 이제 Co-occurence matrix를 생각해볼게요. Co-occurence, 동시 발생이라는 뜻입니다. 앞에서 언급한 흐름과 들어맞네요. 다만, 아직 '주변' 이라는 표현에 대해 해석하지 않았습니다. 그냥 동시에 등장했던 단어로 따지면, 아래와 같은 그림을 만들 수 있을 거에요. 참고로 각 행과 열은 유니크한 단어가 들어갑니다.

  you say goodbye and i hello
you 0 1 1 1 1 1
say 1 0 1 1 1 1
goodbye 1 1 0 1 1 1
and 1 1 1 0 1 1
i 1 1 1 1 0 1
hello 1 1 1 1 1 0

 그런데, 생각을 해보면, you 라는 단어는 문장 안에서 사용된 모든 단어와 연관이 있긴할텐데, 문장이 정말 길어지면, 그 때도 정말 제일 앞에 있는 단어와 가장 끝에 있는 단어가, 바로 옆에 붙어있는 단어처럼 큰 영향을 끼칠까- 하는 생각이 들 수 있습니다. 앞서 말한 것 처럼 '주변' 단어가 더 영향력이 있어야하지 않을까요? 때문에, 동시발생 행렬에서는 Window 라는 개념을 도입합니다. 예를 들어, Window size를 1로 설정한다면, say를 표현하기 위해 양옆 1칸에 존재하는 단어인 you, goodbye만 사용하자는 것입니다. 그럼 아래와 같은 표가 되겠지요.

  you say goodbye and i hello
you 0 1 0 0 0 0
say 1 0 1 0 1 1
goodbye 0 1 0 1 0 0
and 0 0 1 0 1 0
i 0 0 0 1 0 0
hello 0 1 0 0 0 0

 이런 동시발생 행렬의 i-th row는 그 자체로, i-th word에 대한 벡터 표현이 됩니다. 그런데, 이런 단순 카운팅 방식의 측정은, 한 가지 의문점을 발생시킵니다. "단순히 많이 등장한 것이, 가장 영향력이 높은 단어인가?" - 라는 의문인데, [the, car, drive] 라는 단어 셋을 생각해 보겠습니다. 해당 단어가 포함된 문장에서 동시발생 행렬 C 를 만들었을 때, C(the,car)와 C(car,drive)를 계산해보면, 어떤 놈이 높은 값을 가질까요. the는 관사라는 특성상, car가 등장할 때 마다 등장하게 됩니다. 그래서 무조건 전자가 더 많을 수 밖에 없어요. 그런데, 의미적으로는 the가 car를 표현하는데 유용할지, drive가 car를 표현하는데 유용할지를 생각해보면, 당연히 후자란 말입니다. 이런 문제를 해결하기 위해 정보 이론의 개념을 가져오게 됩니다.

2. Positive Pointwise Mutual Information matrix (PPMI matrix)

 이 부분은, 수식 입력이 귀찮아서 필기 내용으로 대체합니다,,.

 이런 내용을 바탕으로, 동시발생 행렬을 기반으로, 모든 PPMI(word, word) 를 계산하면 아래와 같은 표를 완성할 수 있겠네요.

  you say goodbye and i hello
you 0 1.58 0 0 0 0
say 1.58 0 0.58 0 1.58 1.58
goodbye 0 0.58 0 1.58 0 0
and 0 0 1.58 0 2.58 0
i 0 0 0 2.58 0 0
hello 0 1.58 0 0 0 0

 다만, 또 다른 문제는, 동시발생 행렬이나, PPMI 행렬이나 둘 다 한 단어를 표현하기 위한 벡터의 크기가, 너무 커요. 클렌징 처리를 잘해서, 전체 Vocabulary 사이즈를 줄이더라도, 해결될 문제는 아닌 것 같습니다. 세상에 존재하는 무수한 색상을 표현하기 위해서는 고작 RGB라는 3차원으로도 충분한데, 문장을 표현하는데 있어 과도하게 큰 차원을 사용하고 있는 것 같습니다. 그럼 이제 어떻게 해줘야할까- 에 대한 답안이 Dimension reduction method 입니다. 간단한 PCA부터, Deep learning 기반의 Embedding 방법론 등이 있습니다. 

3. Similarity matrix

 먼저 주의할 점은, Simiar matrix 또는 Matrix similarity와 혼동하지 말아야한다는 점입니다. 

Similarity matrix is a matrix of scores which express the similarity between two data points

 Similarity matrix의 정의는 위와 같습니다. 위 예제를 다시 긁어오면, similarity(you,say), similarity(you,i) 이런 값들을 계산해서 행렬을 만들면 그게 Similarity matrix라는 뜻이네요. 이런 유사도를 측정하려면, you와 같은 단어들을 표현하는 벡터가 필요한데, 이걸 위에서 이미 다뤘구요. 그럼 유사도를 측정하는 방식에는 무엇이 있느냐- 정도가 남았는데, 이건 대표적으로 코사인 유사도 등이 있고, 나머지는 위키에서 보셔도 충분할 듯 합니다.