Tensorflow 2 NLP(자연어처리)/단어 임베딩

[3-5] Matrix Factorization이란?

Suhd 2021. 11. 13. 11:49

간단히 말해 행렬 분해이다.

하지만 기존의 행렬의 정보를 가지고 2개의 행렬로 분해하는 것이 아니라

충분히 작은 랜덤값을 가진 행렬 두개를 생성하고

그 두 행렬의 곱이 원래의 행렬과 유사해지도록

목적함수를 만든 다음 그 값을 줄여나가는 것이다.

공부에 참고한 자료는 다음과 같다

Recommender-Systems Matrix Factorization.pdf
1.48MB

1. 원래 행렬을 A , 분해 후 행렬을 Q,P 라 하자

그렇다면 다음을 만족도록 우리는 충분히 작은 랜덤값으로 차있는 행렬 Q,P를 업데이트 할 것이다.

 

 

Q옆의 T는 전치를 뜻한다. 즉 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를 찾는 것이다.

행렬&벡터&스칼라 간의 미분에 대해 잘 정리한 글이 있어서 공유하겠다.

https://darkpgmr.tistory.com/141

 

벡터 미분과 행렬 미분

논문을 읽거나 어떤 이론을 이해할 때, 그리고 자신이 수식을 전재할 때 종종 벡터, 행렬에 대한 미분이 필요한 경우가 종종 있습니다. 저의 경우는 주로 함수 최적화 기법(Least Squares, Weighted Lest

darkpgmr.tistory.com