행렬 분해

행렬 분해는 간단한 임베딩 모델입니다. 주어진 피드백 행렬 A Rm×n, 여기서 m 는 사용자 (또는 검색어) 수, n 는 항목 수 모델은 다음을 학습합니다.

  • 사용자 임베딩 행렬 URm×d 여기서 row i는 사용자 i의 임베딩입니다.
  • 항목 임베딩 행렬 VRn×d, 여기서 row j는 항목 j에 대한 임베딩입니다.

영화 반복 예시를 사용한 행렬 분해 그림

임베딩은 곱이 UVT 피드백 행렬 A의 적절한 근사치입니다. 다음 (i,j) 항목의 U.VT 는 내적을 말합니다. Ui,Vj 사용자 임베딩 중 i Ai,j에 가깝게 만들고 싶은 항목 j도 있습니다.

목적 함수 선택

한 가지 직관적인 목적 함수는 제곱 거리입니다. 이렇게 하려면 관찰된 모든 항목 쌍에 대한 제곱 오차의 합을 최소화합니다.

minURm×d, VRn×d(i,j)obs(AijUi,Vj)2.

이 목적 함수에서는 관찰된 쌍 (i, j)에 대해서만 합산하고, 즉, 피드백 행렬에서 0이 아닌 값을 처리해야 합니다 그러나 좋은 생각은 아닙니다. 모든 1의 행렬은 손실을 최소화하고 효과적인 추천을 할 수 없는 모델을 생성 일반화가 잘 되지 않는 경우가 많습니다

관측된 행렬 분해, 가중치 분해, 단수 값 분해 세 가지 행렬 삽화

관측되지 않은 값을 0으로 처리하고 항목을 나타냅니다. 이렇게 하면 프로베니우스 제곱 A 과 근사값 UVT사이의 거리:

minURm×d, VRn×dAUVTF2.

다음을 통해 이 이차 문제를 해결할 수 있습니다. 행렬의 단수 값 분해 (SVD) 하지만 SVD도 좋은 솔루션이 아닙니다. 실제 애플리케이션에서는 행렬 A 은 매우 희소할 수 있습니다. 예를 들어 모든 동영상과 특정 사용자가 본 모든 동영상과 비교하여 YouTube에서 발생한 조회수입니다. 해법 UVT (모델의 근사값에 해당) 0에 가까울 가능성이 높으므로 일반화 성능을 향상시키는 데 도움이 됩니다.

반면에 가중치 행렬 분해는 목표를 분해합니다. 다음 두 합계로 나눈 값입니다.

  • 관찰된 항목의 합계입니다.
  • 관찰되지 않은 항목에 대한 합계입니다 (0으로 처리됨).

minURm×d, VRn×d(i,j)obs(AijUi,Vj)2+w0(i,j)obs(Ui,Vj)2.

여기서 w0 는 두 항에 가중치를 두는 초매개변수입니다. 둘 중 어느 하나가 지배적이지 않아야 합니다. 이 초매개변수를 조정하는 것은 매우 중요합니다.

(i,j)obswi,j(Ai,jUi,Vj)2+w0i,jobsUi,Vj2

여기서 wi,j 는 쿼리 i와 항목 j의 빈도에 대한 함수입니다.

목적 함수 최소화

목적 함수를 최소화하는 일반적인 알고리즘은 다음과 같습니다.

  • 확률적 경사하강법 (SGD) 손실 함수를 최소화하는 일반적인 방법입니다.

  • Weighted Alternating Least Squares (WALS)는 이 작업에 특화되어 있습니다. 확인할 수 있습니다

목표는 두 행렬 U와 V 각각에서 이차함수입니다(참고: 문제가 합동으로 볼록하지 않다는 점입니다). WALS는 임베딩을 무작위로 추출한 후 다음을 번갈아 가며 나타납니다.

  • V U 해결 및 해결
  • U V 해결 및 해결

각 단계는 선형 시스템의 해법을 통해 정확히 풀 수 있으며 배포될 수 있습니다 이 기법은 수렴이 확실히 보장됩니다. 왜냐하면 손실을 줄일 수 있습니다

SGD와 WALS 비교

SGD와 WALS에는 장단점이 있습니다. 아래 정보를 검토하여 비교해 보세요.

SGD

매우 유연하여 다른 손실을 사용할 수 있음 함수와 관련이 있습니다.

동시 로드 가능.

더 느립니다. 수렴 속도가 빠르지 않습니다.

관찰되지 않은 항목을 처리하기가 더 어렵습니다. 네거티브 샘플링 또는 중력을 사용하세요).

WALS

손실 제곱에만 의존합니다.

동시 로드 가능.

SGD보다 수렴 속도가 빠릅니다.

관찰되지 않은 항목을 더 쉽게 처리할 수 있습니다.