'단어-문서 행렬', 'TF-IDF 행렬' '단어-문맥 행렬' , 'PMI 행렬' 과 같은 단어와 단어, 문장간의 등장 빈도를 행렬로 나타내어 단어를 벡터로 표현할 수 있었지만, 차원이 너무 커 계산상의 효율성을 키우기 위해 차원은 축소하되 단어가 담고있는 의미를 보존하기 위해(정교하게 뽑아냄으로써 잠재 의미를 드러내기 위해)잠재 의미 분석이라는 방법이 등장했다.
이는 성능이 아주 뛰어나지는 않지만, 뒤에 나오는 GloVe나 Swivel 과 같은 곳에 행렬 분해 기법으로서 사용된다.
PMI는 두 확률 변수 사이의 상관성을 계량화한 지표이다.
i 가 일어날 확률, j가 일어날 확률과 i,j가 동시에 일어날 확률을 가지고 다음과 같은 식으로 표현하면,
PMI는 i,j가 자주 같이 등장할수록 커지고, i,j가 등장할 확률이 적음에도 불구하고 i,j가 서로 같이 등장하는 경향이 있을수록 커진다.
하지만, 보통 말뭉치에서 단어 하나의 등장확률은 0.001 이하로 작은 편이다. 그래서 log 내의 값이 1보다 작아지는 경우와 심지어는 0이 되는 경우가 있어 자연어 처리 분야에서는 PPMI를 사용한다
PPMI (Positive Pointwise Mutual Information) 양의 점별 상호 정보량은 PMI가 음수로 나올경우 0으로 치환해준다는 것이다.
PMI가 음수로 나온다는 것은 단어 두개가 동시 등장한 경우가 거의 없다는 뜻이기에 이는 의미가 별로 없는 정보로 판단하여 0으로 치환하는 것이다.
여기서 더 나아가 Shifted PMI가 있는데 이는 PMI에서 log(k)를 빼준 값이다(k는 임의의 양의 상수)
여기서 k는 자연어 처리에서 동시에 등장하지 않은 단어 쌍의 개수를 뜻한다. log성질에 따라 k는 분모로 들어가게 된다. 이때 k가 증가하면 행렬의 모든 원소의 값이 전체적으로 k에 비례하여 작아진다는 것을 확인 할 수 있다. 이는 학습하는 네거티브 샘플 개수(k) 가 많아질수록 임베딩 품질이 저하된다고 볼 수 있다.
왜냐하면 k가 커질수록 벡터들의 방향을 나타내는 값들이 작아져 모든 벡터가 그들의 정보를 서서히 잃는다.
ex) (1,2) 와 (0.2)는 확실히 차이가 난다. 하지만
1000으로 모두 나누면 (0.001,0.002), (0,0.002) 로 되며 두 벡터는 서로 같을정도로 차이가 미미하다.
이제 잠재 의미 분석을 행렬 분해로 이해해보자.
이는 특이값 분해[SVD](내 블로그 NLP 카테고리 초반에 있음)로 설명 가능한데
원래 행렬을 3개의 행렬로 나누어 표현하고, 그중에서 의미를 많이 가지는 부분만 살리고
의미가 별로 없는 부분(노이즈)을 없에서 잠재 의미를 끌어낼 수 있다고 이해 가능하다.
최종적으로 Word2Vec을 행렬 분해로 이해 할 수 있다.
Levy&Goldberg(2014) https://proceedings.neurips.cc/paper/2014/file/feab05aa91085b7a8012516bc3533958-Paper.pdf
다음 논문에서는 Word2Vec 의 학습은 Shifted PMI 행렬을 두개의 행렬로 분해하여 가능하다고 말한다.
이를 흐름에 따라 정리해보았다.
자주 같이 등장하는 단어들간 빈도수값과, 두 벡터의 내적값(코사인 유사도 값) 을 행렬 분해를 통해 연관시킬 수 있게 되어 이를 정보를 활용햐 단어 임베딩을 할 수 있다.
코드로 구현해보았지만 실수로 터미널 창을 꺼버려서 이번은 넘어간다.
KorQuAD와 네이버 영화 말뭉치를 사용했고
결과값으로 코사인 유사도 상위 단어 목록 5개를 체크했다.
그 결과값은 앞선 Word2Vec과, Fasttext 만큼 좋지는 않았다.
'Tensorflow 2 NLP(자연어처리) > 단어 임베딩' 카테고리의 다른 글
[3-6] Glove란? (0) | 2021.11.13 |
---|---|
[3-5] Matrix Factorization이란? (0) | 2021.11.13 |
[3-3] FastText란? (0) | 2021.11.13 |
[3-2] Word2Vec란? (0) | 2021.11.12 |
[3-1] NPLM이란? (0) | 2021.11.12 |