요약

별점은 사람들이 잘 남기지 않지만, 누르고 보고 산 기록은 넘치게 쌓인다. 이 기록은 “했다(1)”만 있고 “싫다”는 없다. 단일 클래스 협업 필터링은 이 1과 빈칸만으로 “이 사람이 이것을 좋아할까”를 예측한다. 핵심 어려움은 빈칸이 싫어서 안 한 것인지 몰라서 안 한 것인지 모른다는 점이다. WRMF는 빈칸에 작은 무게만 주고, BPR은 “한 것이 안 한 것보다 위에 오게” 순서를 직접 배운다.

예시로 보기

평점(1~5) 예측은 추천의 목표와 어긋난다. 모델 A가 아이템 C를 3.6으로 예측해 5위에 올리고, 모델 B가 4.2로 예측해 20위에 올렸다면 어느 쪽이 나은가? 평점의 정확도보다 순위가 중요하다. 또 별점은 사용자가 일부러 남겨야 해서 아주 희소하고, 사람마다 아이템마다 복잡한 편향이 있다.

사용자 20명이 아이템 10개를 쓴 기록(1)에서 사용자마다 쓴 아이템 하나를 숨기고, 숨긴 아이템이 쓰지 않은 아이템들보다 위에 오는 비율(AUC)을 쟀다1.

방법 AUC
무작위 점수 0.51
WRMF (빈칸 무게 0.1) 0.81
WRMF (빈칸 무게 1, 모든 빈칸을 확실한 0으로) 0.70
BPR 0.76

빈칸을 모두 확실한 “싫어함”으로 믿으면, 숨겨진 좋아하는 아이템까지 0으로 맞추려 해 순위가 나빠진다.

검증: 위 표(시험할 아이템을 숨긴 실험), BPR 쌍의 수, 시그모이드 값 — 45_one-class-cf_impl.py

정의

단일 클래스 협업 필터링(OCCF)은 대상 사용자가 아이템을 좋아할지(상호작용할지)를 예측한다.

  • 추천의 목표와 맞는다. 사용자·아이템 편향을 잡을 필요가 없다.
  • 암묵적 피드백(클릭, 시청, 구매)을 써서 명시적 피드백보다 덜 희소하다.
  • 어려움: 빈칸을 어떻게 읽나? 일부러 안 한 음성일 수도 있고, 아직 몰라서 안 한 잠재적 양성일 수도 있다.

WRMF (가중 정칙화 행렬 분해)

상호작용한 칸은 1, 안 한 칸은 0으로 두고, 모든 사용자-아이템 쌍에서 무게 붙은 제곱 오차를 줄인다.

\[\min_{P, Q}\sum_{u,i}c_{ui}\left(x_{ui} - \mathbf p_u^\top\mathbf q_i\right)^2 + \lambda\left(\Vert \mathbf p_u\Vert ^2 + \Vert \mathbf q_i\Vert ^2\right)\]

\(c_{ui}\)는 사용자 \(u\)와 아이템 \(i\)의 칸에 주는 무게다. 상호작용한 칸은 \(c_{ui} = 1\)이다. 빈칸의 무게는 여러 방식으로 정한다.

  • 고르게: \(c_{ui} = \delta \in [0, 1]\). 빈칸을 약한 음성으로 본다.
  • 사용자 쪽: \(c_{ui} \propto \sum_i R_{ui}\). 상호작용이 많은 사용자의 빈칸일수록 음성일 가능성이 크다.
  • 아이템 쪽: \(c_{ui} \propto m - \sum_u R_{ui}\). 상호작용이 적은(인기 없는) 아이템의 빈칸일수록 음성일 가능성이 크다.

재구성하면 상호작용한 칸은 1 근처, 빈칸은 0 근처의 값을 받고, 빈칸 중 값이 큰 것을 추천한다.

BPR (베이즈 개인화 순위)

점별 학습(각 칸의 값을 맞추기, 회귀와 같음)은 두 아이템의 순서를 직접 보지 않는다. 모델 A가 4.20 < 4.23, 모델 B가 3.45 > 3.33으로 예측했다면 오차는 A가 작아도 순서는 B만 맞을 수 있다. 그런데 추천은 정밀도·재현율·MRR·nDCG 같은 순위 지표로 평가된다. BPR은 쌍별 학습으로 바꾼다.

\[\hat x_{ui} = \mathbf p_u^\top\mathbf q_i, \qquad \max\sum_{(u,i,j)}\ln\sigma(\hat x_{ui} - \hat x_{uj}) - \lambda\Vert \Theta\Vert ^2\]

\((u, i, j)\)는 사용자 \(u\)가 상호작용한 아이템 \(i\)와 안 한 아이템 \(j\)의 쌍이다. \(\sigma(x) = \frac{1}{1 + e^{-x}}\)(시그모이드)는 차이가 클수록 1에 가깝다. 상호작용한 아이템의 점수가 안 한 아이템보다 크게 벌어지도록 학습한다. \(\Theta\)는 모든 학습 값이다.

두 방법을 견주면 이렇다.

  자료 학습 손실 목표
WRMF 암묵적 점별 무게 붙은 MSE 선호 예측
BPR-MF 암묵적 쌍별 BPR 순위

최근에는 같은 단일 클래스 설정과 BPR 손실에 신경망(NeuMF)과 그래프 신경망(NGCF, LightGCN) 표현을 더한다.

활용

  • 구현: 45_one-class-cf_impl.py
  • BPR의 쌍은 너무 많아(사용자마다 상호작용 수 × 빈칸 수) 매 단계 무작위로 뽑아 확률적 경사 상승을 한다1.

연결

확인 문제

C1 WRMF의 목적 함수와 빈칸 무게를 정하는 세 방식을 쓰라.

답: \(\min\sum_{u,i}c_{ui}(x_{ui} - \mathbf p_u^\top\mathbf q_i)^2 + \lambda(\Vert \mathbf p_u\Vert ^2 + \Vert \mathbf q_i\Vert ^2)\). 상호작용한 칸은 \(c = 1\). 빈칸은 고르게(\(\delta\)), 사용자 쪽(상호작용이 많은 사용자일수록 크게), 아이템 쪽(상호작용이 적은 아이템일수록 크게).

C2 아이템 8개 중 3개와 상호작용한 사용자 한 명에 대해 BPR이 만들 수 있는 \((u, i, j)\) 쌍은 몇 개인가? 두 아이템 점수가 같으면 \(\sigma(\hat x_{ui} - \hat x_{uj})\)는?

답: 상호작용 3개 × 빈칸 5개 = 15쌍. 차이가 0이면 \(\sigma(0) = 0.5\).

C3 점별 학습으로 평점 오차를 줄이는 것보다 BPR의 쌍별 학습이 추천에 더 잘 맞는 이유를 설명하라.

답: 추천은 상위 몇 개의 순서로 평가된다. 점별 학습은 각 값의 크기만 맞추므로 두 아이템의 순서가 뒤바뀌어도 오차는 작을 수 있다(4.20 대 4.23). BPR은 상호작용한 아이템이 안 한 아이템보다 위에 오도록 순서 자체를 목표로 학습한다.

C4 WRMF에서 빈칸 무게 \(c_{ui}\)를 1보다 작게 주는 것이 하는 일을 한 문장으로 쓰라.

답: 빈칸이 정말 싫어서 비었는지 확실하지 않으므로 그 칸의 0을 덜 믿게 해서, 아직 몰라서 비어 있는 좋아할 아이템이 0으로 끌려 내려가지 않게 한다.

  1. 구현 코드로 확인했다. ↩ ↩2