행렬 분해

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

  • 사용자 임베딩 행렬 \(U \in \mathbb R^{m \times d}\) 여기서 row i는 사용자 i의 임베딩입니다.
  • 항목 임베딩 행렬 \(V \in \mathbb R^{n \times d}\), 여기서 row j는 항목 j에 대한 임베딩입니다.

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

임베딩은 곱이 \(U V^T\) 피드백 행렬 A의 적절한 근사치입니다. 다음 \((i, j)\) 항목의 \(U . V^T\) 는 내적을 말합니다. \(\langle U_i, V_j\rangle\) 사용자 임베딩 중 \(i\) \(A_{i, j}\)에 가깝게 만들고 싶은 항목 \(j\)도 있습니다.

목적 함수 선택

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

\[\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2.\]

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

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

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

\[\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \|A - U V^T\|_F^2.\]

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

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

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

\[\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2 + w_0 \sum_{(i, j) \not \in \text{obs}} (\langle U_i, V_j\rangle)^2.\]

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

\[\sum_{(i, j) \in \text{obs}} w_{i, j} (A_{i, j} - \langle U_i, V_j \rangle)^2 + w_0 \sum_{i, j \not \in \text{obs}} \langle U_i, V_j \rangle^2\]

여기서 \(w_{i, j}\) 는 쿼리 i와 항목 j의 빈도에 대한 함수입니다.

목적 함수 최소화

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

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

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

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

  • \(V\) \(U\) 해결 및 해결
  • \(U\) \(V\) 해결 및 해결

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

SGD와 WALS 비교

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

SGD

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

동시 로드 가능.

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

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

WALS

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

동시 로드 가능.

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

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