간단히 말해 행렬 분해이다.
하지만 기존의 행렬의 정보를 가지고 2개의 행렬로 분해하는 것이 아니라
충분히 작은 랜덤값을 가진 행렬 두개를 생성하고
그 두 행렬의 곱이 원래의 행렬과 유사해지도록
목적함수를 만든 다음 그 값을 줄여나가는 것이다.
공부에 참고한 자료는 다음과 같다
1. 원래 행렬을 A , 분해 후 행렬을 Q,P 라 하자
그렇다면 다음을 만족도록 우리는 충분히 작은 랜덤값으로 차있는 행렬 Q,P를 업데이트 할 것이다.
2. 업데이트를 위한 목적함수를 구한다.
여기서 rui 는 예측행렬의 원소(원래 행렬 원소) 이고 , qiT,pu는 각각 QT행렬의 행벡터, p행렬의 열벡터이다.
그렇다면 qTx p 는 내적처럼 스칼라값으로 나올 것이고 이 값을 rui와 같았으면 하는 것이 목적이다.
오른쪽의 더해진 값은 모델이 과적합되지 않도록 정규화(일반화) 시켜주는 역할을 한다.
(저 값이 더해짐으로 인해 목적함수에 q,p 변수가 끼치는 영향이 줄어든다.
=> 상수가 고정적으로 더해지므로 변수에 따라서만 변하였던 기존의 예민했던 함수가 둔해진다.)
이때 사용하는 방법이 2가지가 소개되었다.
1. SGD (확률적 경사 하강법)
확률적 경사 하강법을 위해서는 오차가 필요하다. 오차를 변수로 편미분 할 것이기 때문이다.
이제 업데이트를 위한 식을 구해보면 다음과 같다.
+ 이를 통해 Q와 P가 업데이트 된다면 자연어 처리분야에서는 qTx p 가 내적의 성질을 띄는것을 이용해
코사인 유사도로 인식하고 업데이트 된 qT의 행벡터, p의 열벡터에서 단어벡터를 뽑아 낼 수 있다.
2. ALS (Alternating Least Sequares)
이름에서 보이다 싶이 바꿔가면서 업데이트를 한다.
즉, Q를 고정시켜놓고 P를 업데이트를 한다. => 이제는 P를 고정시켜놓고 Q를 업데이트 한다 => ...
이 과정을 상황에 맞게 충분히 반복한다.
이때 업데이트 하는 방법은 당연히 목적함수를 고정시키지 않은 변수로 편미분 한다음
그 값이 0이 되는 행렬 Q와 P를 찾는 것이다.
행렬&벡터&스칼라 간의 미분에 대해 잘 정리한 글이 있어서 공유하겠다.
'Tensorflow 2 NLP(자연어처리) > 단어 임베딩' 카테고리의 다른 글
[3-7] PMI 행렬 만드는 법 (0) | 2021.11.13 |
---|---|
[3-6] Glove란? (0) | 2021.11.13 |
[3-4] 잠재 의미 분석(LSA,Latent Semantic Analysis) 이란? (0) | 2021.11.13 |
[3-3] FastText란? (0) | 2021.11.13 |
[3-2] Word2Vec란? (0) | 2021.11.12 |