Data Science 6.Recommender System
이번 포스트는 Recommender System에 대해 다룬다.
Recommender Systems
Introduction to Recommender Systems
Motivation 정보 폭발의 시대
- 세상에 정보가 너무 많아졌다. (추천 시스템의 필요성 증대)

- Information Overload 발생
- 정보 과부하 : 선택지가 너무 많아서 사용자가 오히려 원하는 걸 못 찾는 현상
Recommender System
추천시스템의 목표
- 사용자의 정부 과부하 완화 + 만족도 최대화
-
유저가 좋아할만한 소수의 아이템을 골라서 제공
- 작동 흐름
- 사용자가 아이템을 구매 / 소비
- 시스템이 사용자의 선호도 분석
- 좋아할 만한 아이템 선별
- 사용자에게 추천
추천시스템의 핵심 도전과제
- 유저와 아이템을 어떻게 이해할 것인가?
| 질문 | 의미 |
|---|---|
| 사용자의 진짜 선호도를 어떻게 파악? | 클릭했다고 다 좋아하는 건 아님 |
| 비정형 데이터에서 아이템 특성 추출? | 영화 포스터, 상품 이미지 등 |
| 시간에 따라 변하는 선호도 모델링? | 어제 좋아하던 것 ≠ 오늘 좋아하는 것 |
| 단기 선호 vs 장기 선호 구분? | 일시적 관심 vs 진짜 취향 |
- 추천 품질을 어떻게 평가하고 공정하게 만들 것인가?
- 어떤 지표로 추천 품질을 측정할 것인가?
- 어떤 지표가 실제 사용자 만족도를 가장 잘 반영하는가
| 개념 | 의미 | 예시 |
|---|---|---|
| Diversity (다양성) | 비슷한 것만 계속 추천하지 않기 | 액션만 추천 , 다양한 장르 추천 |
| Fairness (공정성) | 특정 유저 그룹 차별 금지 | 인기 있는 아이템만 추천하면 소수 아이템 불이익 |
| Explainability (설명 가능성) | 왜 이걸 추천했는지 설명 | “당신이 액션 영화를 좋아해서 추천했어요” |
Recommend에 활용할 수 있는 정보 종류
- Content Information (콘텐츠 정보)
- 아이템 자체의 속성 정보
- Collaborative Information (협업 정보)
- 비슷한 취향의 사람들이 좋아한 것을 나도 좋아할 것이다.
- 같은 아이템을 소비한 유저들은 서로 비슷한 취향
- Social (Trust) Information (소셜 정보)
- SNS 친구 관계, 팔로우 관계
- 유저 - 유저 관계 + 유저 - 아이템 상호작용을 함께 활용
- External Knowledge (외부 지식)
- Knowledge Graph : 지식 그래프 활용
- 텍스트 기반 지식
Basic Recommendation Methods
Content-Based Recommendation
핵심 아이디어 : 사용자가 과거에 좋아했던 아이템과 내용이 비슷한 아이템을 추천
- Content = 아이템의 메타데이터
- 작동 과정
- 유저의 과거 소비 아이템 -> 유저 프로필 벡터 추출
- 전체 아이템 풀 -> 각 아이템 프로필 벡터 추출
- 유저 프로필 <-> 아이템 프로필 유사도 측정
- 유사도 높은 아이템 추천
Item Profile Representation : 좋은 feature 선택이 핵심
- 영화 : 상영시간보다 감독/배우가 더 좋은 피처
- 뉴스 : 카테고리만으로 부족 -> TF/IDF 사용
TF-IDF 란?
TF (Term Frequency) : 단어 빈도 \(TF_{i,j} = \frac{f_{i,j}} {\max_{z} f_{z,j}}\)
- 분자 : 뉴스에서 키워드가 등장한 횟수
- 분모 : 해당 문서에서 가장 많이 나온 단어의 빈도 (정규화 용도)
- 의미 : 이 문서에서 이 단어가 얼마나 자주 나오는가?
IDF (Inverse Document Frequency) : 역문서 빈도 \(IDF_i = \log \frac{N}{n_i}\)
- N : 전체 뉴스 기사 수
- n_i : 키워드 k가 등장한 문서 수
- 의미 : 이 단어가 전체 문서에서 얼마나 희귀한가?
최종 TF-IDF 수식 \(w_{i,j} = TF_{i,j} \times IDF_i\)
User Profile Representation : 유저가 읽은 아이템들의 콘텐츠를 합산 \(w_{ic} = \frac{1}{k} \sum_{j=1}^{k} w_j\)
- 유저 c가 읽은 k개 뉴스에서 키워드 k_i의 평균 가중치
- 집계 방법 종류 :
- 단순 평균, 가중 평균, Max Pooling, Linear Transformation
Utility Computation Recommendation
이 아이템을 추천할지 말지를 어떻게 결정하는가?
추천 결정 방법 2단계 과정
- 유저 프로필 c와 아치템 프로필 s의 유사도를 계산
- 유사도가 높은 순으로 상위 아이템 추천
Utility Function u(c, s) :
아이템 s가 유저 c에게 얼마나 유용한지를 나타내는 점수 \(u(c,s)=(ContentBasedProfile(c), Content(s))\)
\[u(c,s) = \cos(w_c,w_s) = \frac{w_c \cdot w_s} {\|w_c\|_2 \, \|w_s\|_2} = \frac{\sum_{i=1}^{K} w_{i,c} w_{i,s}} {\sqrt{\sum_{i=1}^{K} w_{i,c}^2}\sqrt{\sum_{i=1}^{K} w_{i,s}^2}}\]Model-based Method
추천 결정 방법 : 추천을 이진 분류 (Binary Classification) 문제로 보기
- 사용 가능한 모델 종류 : Bayesian Classifier, Decision Tree, Logistic Regression, Deep learning 등
예시) Naive Bayes Classifier
-
훈련 데이터로 학습 하여 추천
- 키워드들이 서로 독립적이라는 가정이 실제로는 연관이 있기에 한계 존재
Content-Based Approach의 한계점
1. 콘텐츠 분석의 어려움
| 문제 | 설명 |
|---|---|
| 멀티미디어 데이터 | 텍스트는 쉽지만 이미지/동영상/음악은 특징 추출 어려움 |
| 품질 구분 불가 | 같은 키워드여도 잘 쓴 글 vs 못 쓴 글을 구분 못함 |
2. Overspecialization (과도한 특화 = 다양성 부족)
- 항상 기존에 좋아하던 것만 추천
- 새로운 장르 / 분야 추천 불가
- filter bubble 현상 -> 세상이 좁아진다.
3. Cold-Start User Problem (신규 유저 문제)
- 과거 이력이 없는 신규 유저 -> 프로필 생성 불가 -> 추천 불가
- 어느 정도 아이템을 소비해야 추천이 가능해짐
CF-Based Recommendation
핵심 아이디어 : 아이템 내용이 아니라 다른 유저들의 행동을 활용해서 추천
- Collaborative Filtering (CF) : 다른 유저들이 뭘 좋아했는지를 참고
- User-based CF : 나랑 비슷한 유저가 좋아한 것
- Item-based CF : 내가 좋아한 것과 비슷한 아이템
핵심 질문 2가지:
Q1. 비슷한 유저/아이템을 어떻게 찾을 것인가?
Q2. 아이템의 평점을 어떻게 예측하는가?
Data Format
CF의 입력 데이터 : N x M 평점 행렬
- 행 : 각 유저의 평점 이력
- 열 : 해당 아이템에 평점을 준 유저 목록
- 빈칸 : 아직 평가 안 한 것으로 이것을 예측하는 것이 목표
User-Based CF
3단계 Process
Step 1. 나와 비슷한 유저(이웃) 찾기
- 유저간 유사도 측정 방법 2가지
1. Pearson Correlation Coefficient (PCC) \(\mathrm{sim}(x,y) = \frac{ \sum_{s \in S_{xy}} (r_{x,s}-\bar r_x) (r_{y,s}-\bar r_y) }{ \sqrt{\sum_{s \in S_{xy}} (r_{x,s}-\bar r_x)^2} \sqrt{\sum_{s \in S_{xy}} (r_{y,s}-\bar r_y)^2} }\)
- S_xy : x와 y 둘 다 평가한 아이템 집합
- ˉx : 유저 x의 평균 평점
- 평균을 뺀 후 상관관계 -> 평점 경향 차이 보정
2. Cosine Similarity \(\mathrm{sim}(x,y) = \cos(x,y) = \frac{ \sum_{s \in S_{xy}} r_{x,s}r_{y,s} }{ \sqrt{\sum_{s \in S_{xy}} r_{x,s}^{\,2}} \sqrt{\sum_{s \in S_{xy}} r_{y,s}^{\,2}} }\)
- 평점 자체의 방향(각도)으로 비교
- 평점 스케일 차이 보정 안 됨
Step 2. 이웃들의 평점으로 내 평점 예측
기본 방법 : 이웃 평점의 평균 \(r_{c,s} = \frac{1}{N} \sum_{c' \in \hat{C}} r_{c',s}\) 개선 방법
1. 유사도 가중 평균 \(r_{c,s} = \frac{ \sum_{c' \in \hat{C}} \mathrm{sim}(c,c') \, r_{c',s} }{ \sum_{c' \in \hat{C}} \mathrm{sim}(c,c') }\)
-
나와 더 비슷한 이웃의 평점을 더 많이 반영
-
덜 비슷한 이웃은 영향력을 낮춤
2. 평점 경향 차이 보정 (가장 정교한 방법) \(r_{c,s} = \bar r_c + \frac{ \sum_{c' \in \hat{C}} \mathrm{sim}(c,c') \left( r_{c',s} - \bar r_{c'} \right) }{ \sum_{c' \in \hat{C}} \mathrm{sim}(c,c') }\)
- r_c : 내 평균 평점 (나는 평소에 어느 정도의 점수를 주는 사람인가)
- (r_c’,s - r_c’) : 이웃이 이 아이템에 평균 대비 얼마나 더/덜 줬는가? (offset)
Step 3. 예측 평점이 높은 TOP-K 아이템 추천
최종 추천 방법 : 예측 평점이 높은 TOP-K 아이템을 추천
예시) 내 취향과 비슷한 u1, u2, u4가 봤는데 내가 안 본 영화들의 예상 별점을 계산해서 가장 높을 것 같은 것부터 추천
- Cold-Start 문제 : 평점이 거의 없는 신규 유저는 이웃을 찾기 어려워 추천 품질이 낮아지는 문제 존재
Item-Based CF
3단계 Process
Step 1. 타겟 아이템과 비슷한 아이템 찾기
- 같은 유저들이 함께 소비한 아이템
Step 2. 타겟 유저가 비슷한 아이템에 준 평점으로 예측
Step 3. 예측 평점 높은 Top-K 추천
CF의 3가지 중요 이슈
- Cold-Start User 문제
- User-based : 이 유저와 비슷한 유저를 찾는 것이 어렵다.
- Item-based : 아이템 유사도는 이미 계산되어 있다.
- 효율성
- User-based는 계산량이 훨씬 많다.
- 다양성
- 다양한 유저 추천 가능
- 내가 본 것만 비슷해서 Item-based는 다양성이 낮음.
Hybrid Approach
3가지의 Hybrid 방법이 존재
1. Content-based와 CF-based를 따로 돌리고 결과를 합침 \(\hat{r} = \alpha \hat{r}_{CF} + (1-\alpha)\hat{r}_{CB}\)
- Alpha : CF 결과에 얼마나 가중치를 줄지 조저하는 파라미터
- CF예측값과 Content-based 예측값의 선형 결합
둘 중 더 신뢰도 높은 추천 시스템 하나 선택도 괜찮다.
2. Content를 통한 협업
- 평점 행렬이 너무 sparse(빈칸이 많다)
- 공통으로 평가한 아이템이 적어서 유저 유사도 계산이 어렵다.
(1) Content-based 프로필로 이웃 찾기 보완
- 평점 + Content 프로필 둘 다 활용해서 평점이 적어도 콘텐츠 취향이 비슷하면 이웃
(2) Content-based 예측값으로 빈칸 채우기
- 평점 행렬의 빈칸 -> Content-based로 예측값 채우기
- 더 풍부한 행렬로 CF 계산이 가능하다.
3. 차원 축소로 더 좋은 Content 프로필 만들기
- 불필요한 feature, 노이즈
- 모든 유저의 Content 프로필을 행렬로 모아서 차원 축소 (SVD 등) 적용
① 모든 유저의 ContentBasedProfile 모음
→ n × d 행렬
② SVD 등 차원 축소 적용
→ n × k 행렬 (k << d)
③ 결과: CF-enhanced content profiles
→ 여러 유저의 협업 정보가 반영된 압축된 프로필
Evaluation of Recommender Systems
그렇다면 추천 시스템을 평가를 어떻게 할까?
평가 방법 3가지 : Prediction Accuracy, Top-N Recommendation Quality, Ranking Quality 가 존재
Prediction Accuracy
예측 평점 vs 실제 평점의 오차 측정
MAE (Mean Absolute Error) \(MAE = \frac{1}{N} \sum_{i=1}^{N} \left| \hat{r}_i - r_i \right|\)
- 오차의 절댓값 평균
- 평균적인 오차 크기를 알고 싶을 때 사용
- 직관적으로 해석하기 쉽다.
MSE (Mean Squared Error) \(MSE = \frac{1}{N} \sum_{i=1}^{N} \left( \hat{r}_i - r_i \right)^2\)
- 오차를 제곱해서 평균
- 큰 실수를 특히 더 벌주고 싶을 때 사용
- 큰 오차에 더 강한 페널티
| MAE | MSE | |
|---|---|---|
| 계산 | 절댓값 평균 | 제곱 평균 |
| 이상치(outlier) | 덜 민감 | 매우 민감 |
| 해석 | 직관적 | 단위가 제곱이라 해석 어려움 |
| 큰 오차 패널티 | 약함 | 강함 |
RMSE (Root Mean Squared Error) \(RMSE = \sqrt{ \frac{1}{N} \sum_{i=1}^{N} \left( \hat{r}_i-r_i \right)^2 } = \sqrt{MSE}\)
- MSE에 루트를 씌운 것
- 단위를 다시 원래 평점 스케일로 복원
- Prediction Accuracy의 한계
평점 예측 오차가 낮다고 해서 좋은 추천 목록이 되는 것은 아니다.
평점 분포에 집중할 뿐, 순위/목록 품질은 별개 문제
Top-N Evaluation
Precision@K : TOP-K 추천 목록 중 실제로 관련 있는 아이템이 몇 %인가? \(\mathrm{Precision@K}(u) = \frac{ \left| Rec_u^K \cap Rel_u \right| }{K}\)
- Rec : 유저 u에게 추천한 TOP-K 아이템
-
Rel : 유저 u가 실제로 좋아하는 아이템 집합
- Limitation
- 놓친 아이템을 고려 안 한다.
- 순위 위치 고려 안 한다.
Recall@K : 유저가 실제로 좋아하는 것 중 TOP-K에 몇 %나 포함됐나? \(\mathrm{Recall@K}(u) = \frac{ \left| Rec_u^K \cap Rel_u \right| }{ \left| Rel_u \right| }\)
- 분모 : 실제 좋아하는 아이템 수
- Precision과의 차이
- Limitation
- K를 늘리면 무조건 높아진다.
- 마찬가지로 순위 위치를 고려하지 않는다.
F1@K : Precision과 Recall의 균형 \(F1@K = \frac{ 2 \cdot Precision@K \cdot Recall@K }{ Precision@K + Recall@K }\)
HR@K : TOP-K 추천 목록에 관련 아이템이 하나라도 있으면 성공(1), 없으면 실패(0) \(HR@K(u) = \begin{cases} 1, & \text{if } Rec_u^K \cap Rel_u \neq \emptyset \\ 0, & \text{otherwise} \end{cases}\)
\[HR@K = \frac{1}{|U|} \sum_{u \in U} HR@K(u)\]- 추천 목록에 단 하나라도 관련 아이템이 있는 유저 비율
= 추천 시스템이 얼마나 많은 유저를 만족시키는가?
Rank-Based Evaluation
MR (Mean Rank) : 관련 아이템들이 추천 목록에서 평균 몇 번째에 위치하는가? \(MR(u) = \frac{1}{m} \sum_{j=1}^{m} r_j \qquad (\text{Lower is better } \downarrow)\)
- r_j : 관련 아이템의 순위 위치
- m : 관련 아이템 수
계산 예시)
추천 목록: [A, B, C, D, E]
실제 좋아하는 것: [B, D]
B의 순위 = 2번째
D의 순위 = 4번째
MR(u) = (2+4)/2 = 3
→ "관련 아이템이 평균 3위에 위치"
- MR의 Limitation
- 직관성이 낮다.
- 이상치가 민감하다.
- 선형 취급
- 1위와 2위 차이와 101위와 102위 차이를 동일하게 본다.
- 정규화가 없다.
MRR (Mean Reciprocal Rank) : 첫 번째로 등장하는 관련 아이템 순위의 역수 평균 : 얼마나 빨리 관련 아이템을 만나는가? \(RR(u) = \frac{1}{r_u}\)
\[MRR = \frac{1}{|U|} \sum_{u \in U} \frac{1}{r_u} \qquad (\text{Higher is better } \uparrow)\]- r_u : 추천 목록에서 첫 번째 관련 아이템의 순위
- MRR의 한계
- 오직 첫 번째 관련 아이템만 고려하기에 나머지는 무시된다.
nDCG : 전체 순위 목록의 품질 측정 + 상위 순위에 더 높은 가중치 부여
-
단계별 공식
-
Step 1. DCG (Discounted Cumulative Gain) \(DCG@K = \sum_{i=1}^{K} \frac{2^{rel_i}-1} {\log_2(i+1)}\)
- i 번째 아이템이 관련 있으면 1, 없으면 0
- Discount factor : 순위가 낮을수록 가중치 감소
-
Step 2. IDCG (Ideal DCG)
- 가장 이상적인 순서로 배열했을 때의 DCG
- 관련 아이템을 모두 맨 앞에 배치할 때
-
Step 3. nDCG \(nDCG@K = \frac{DCG@K}{IDCG@K} \qquad (\text{Higher is better } \uparrow)\)
-
- 의미 : 관련 아이템들이 상위권에 잘 배치되어 있는가?
- MRR은 첫 번째 아이템만 본다면, nDCG는 여러 관련 아이템까지 모두 고려
- Precision/Recall@K는 순위 위치는 무시한다면, nDCG는 위치까지 고려한다.
- 한계
- 이진 관련도만 지원하고 복잡하다.
| 지표 | 핵심 측정 | 여러 관련 아이템 고려? | 위치 민감? | 주요 단점 |
|---|---|---|---|---|
| MR | 관련 아이템 평균 순위 | Yes | Yes | 이상치에 민감 |
| MRR | 첫 관련 아이템 순위의 역수 | No | 강하게 | 나머지 관련 아이템 무시 |
| nDCG | 전체 순위 품질 | Yes | Yes | 복잡함 |
요약
단일 지표만으로는 추천 품질을 완전히 측정할 수 없다.
MR, MRR, nDCG 등 여러 지표를 함께 사용해야 한다.
MF-Based Recommendation
핵심 아이디어 : 평점 행렬 R을 두 개의 작은 행렬로 분해 \(R \approx UV^T \quad (\text{or } P \times Q^T)\)
| 행렬 | 의미 | 크기 |
|---|---|---|
| R | 원본 평점 행렬 | n×m (유저×아이템) |
| P (U) | User Latent Matrix | n×k |
| Q^T (V^T) | Item Latent Matrix | k×m |
- 유저 u의 잠재 벡터와 아이템 i의 잠재 벡터의 내적
- 예측 평점
- 유저와 아이템이 같은 공간에 있을 때 (벡터가 비슷할수록) 유저가 그 아이템을 좋아한다고 판단
왜 MF가 CF인가?
P와 Q는 독립적으로 학습되지 않는다.
- 유저 벡터 p_u 학습 방식
- 유저 u가 상호작용한 아이템들의 벡터(q_i)를 기반으로 학습
- 그 아이템 벡터들은 다른 유저들과 공유됨.
- 아이템 벡터 q_i 학습 방식
- 아이템 i와 상호작용한 유저들의 벡터(p_u)를 기반으로 학습
- 유저 벡터들은 다른 아이템들과 공유됨.
SVD in Recommender Systems
SVD (Singular Value Decomposition)
- 행렬을 3개 행렬의 곱으로 분해 \(R≈UΣVT\)
| 행렬 | 크기 | 의미 |
|---|---|---|
| U | n×d | 유저 잠재 행렬 |
| Σ | d×d | 특이값 대각행렬 (중요도) |
| V^T | d×m | 아이템 잠재 행렬 |
- n = 유저 수, m = 아이템 수, d = 잠재 차원 수
3가지 핵심 질문
Q1. 각 행렬의 행/열은 무엇을 의미하는가?
Q2. 왜 SVD가 추천 시스템에서 작동하는가?
Q3. 어떻게 추천하는가?
Full SVD
\[R \approx U \Sigma V^T\] \[U \in \mathbb{R}^{n \times n}, \quad \Sigma \in \mathbb{R}^{n \times m}, \quad V \in \mathbb{R}^{m \times m}\]- RR^T 의 뜻 : User-User Matrix
- 유저 i의 평점 벡터와 유저 j의 평점 벡터의 내적
- 두 유저의 평점 패턴이 얼마나 비슷한가
- R^TR의 뜻 : Item-Item Matrix
- 아이템 i와 아이템 j를 같이 평가한 패턴
Q1. 각 행렬이 의미하는 것? 에 대한 답변
- U : 유저들의 구매 패턴을 반영하는 벡터(축)
- V : 아이템들의 소비 패턴을 반영하는 벡터(축)
Q2. 왜 SVD가 Recommendation System에서 작동하는가? 에 대한 답변
- 유저와 아이템이 유저-아이템 상호작용 기반으로 잘 표현되기 때문
- User latent space : 비슷한 취향의 유저들이 같은 공간에 가깝게 위치
- Item latent space : 비슷한 성격의 아이템들이 같은 공간에 가깝게 위치
Q3. 어떻게 추천하는가? 에 대한 답변
- 유저 u의 잠재 벡터 : U의 u 번째 항
- 아이템 i의 잠재 벡터 : V^T의 i번째 열
- 예측 평점 = 유저 벡터 와 아이템 벡터의 내적
- 같은 방향을 가리킬수록 유저가 좋아하는 아이템
Pure SVD
개념 : SVD를 Recommend에서 가장 단순하게 적용한 방법
Step 1. 빈칸을 0 으로 채우기
- 평점 행렬 R에 빈칸이 많다. (sparse)
- SVD는 빈칸 없는 완전한 행렬에만 적용이 가능하다.
Step 2. SVD 분해 (Closed-form solution)
R → U × Σ × V^T
- 훈련 과정 없이 수학적으로 바로 분해
Step 3. 상위 d개 벡터로만 재구성 (Truncated SVD)
- Σ에서 가장 큰 d개 특이값만 선택
Pure SVD의 한계
-
Low Personalization
-
전체 평점 행렬의 전역 패턴을 포착하기에 대체로 사람들이 좋아하는 것에 찾는 것을 잘한다.
-
각 유저의 개인적인 취향, 특정 아이템의 고유한 특성, 유저마다 주는 편향 반영 X
-
-
빈칸 = 무조건 부정적 신호로 처리
- 아이템을 모르고 노출이 안된 것일수도 있는데, 부정적 신호로 처리
MF for Better Personalization
- 잠재 벡터를 직접 학습
-
Pure SVD : 고정된 R 행렬을 수학적으로 분해하기에 유연하지 않음.
-
P와 Q를 직접 학습 파라미터로 설정
- 관측된 평점에 맞게 최적화
- 유저별 / 아이템별 특성을 더 잘 반영하도록 함.
- 현실의 평점에 영향 주는 요소들을 반영
| 요소 | 설명 | 예시 |
|---|---|---|
| User bias | 어떤 유저는 항상 후하게/짜게 줌 | 항상 5점 주는 사람 |
| Item bias | 어떤 아이템은 평균적으로 높게/낮게 평가됨 | 블록버스터 영화 |
| Implicit feedback | 과거 상호작용 자체가 취향을 암시 | 구매 기록, 클릭 기록 |
- 목적 함수 \(\min_{P,Q} \sum_{(u,i)\in O} \left( r_{ui} - p_u^T q_i \right)^2 + \lambda \left( \|p_u\|^2 + \|q_i\|^2 \right)\)
| 항 | 의미 |
|---|---|
| $(r_{ui} - p_u^T q_i)^2 $ | 실제 평점과 예측 평점의 오차 (MSE) |
| $\lambda(|p_u|^2 + |q_i|^2) $ | L2 정규화 (과적합 방지) |
| $\mathcal{O} $ | 관측된 평점만 학습에 사용 |
- 예측
두 가지의 차이점
| PureSVD | 기본 MF | |
|---|---|---|
| 학습 방법 | 수학적 분해 (no training) | 경사하강법으로 직접 학습 |
| 빈칸 처리 | 0으로 채움 | 관측된 것만 학습 |
| 개인화 | 낮음 | 높음 |
Biased MF
핵심 = 상호 작용 + 편향 (Bias) \(\hat{r}_{ui} = \mu + b_u + b_i + p_u^T q_i\)
| 항 | 의미 |
|---|---|
| $\mu $ | 전체 평균 평점 (Global mean) |
| $b_u $ | 유저 편향: 이 유저가 평균보다 후하게/짜게 주는 정도 |
| $b_i $ | 아이템 편향: 이 아이템이 평균보다 높게/낮게 평가되는 정도 |
| $p_u^T q_i $ | 개인화된 상호작용: 유저와 아이템의 실제 취향 궁합 |
SVD++ : Biased MF + Implicit Feedback 추가 \(\hat{r}_{ui} = \mu + b_u + b_i + \left( p_u + \frac{1}{\sqrt{|N(u)|}} \sum_{j \in N(u)} y_j \right)^T q_i\)
| 항 | 의미 |
|---|---|
| $\mu + b_u + b_i $ | 기존 Biased MF의 편향 |
| $p_u $ | 기존 유저 잠재 벡터 |
| $N(u) $ | 유저 u가 상호작용한 아이템 집합 |
| $y_j $ | 아이템 j의 implicit embedding (학습 가능) |
| $\frac{1}{\sqrt{ | N(u) |
Implicit Feedback : 클릭,구매, 시청 기록 등 내 취향에 대한 강력한 신호
목적 함수 비교
- 기본 MF
- Biased MF (bias항 추가)
- SVD++
One-Class Collaborative Filtering (OCCF)
Multi-class 설정 : 1~5점 같은 정확한 평점 수치를 예측하는 것
3가지의 문제점이 존재
1. 추천 시스템 목표와 불일치 (Misalignment)
- 실제 추천 목표 : 이 유저가 좋아할 아이템을 Top-K에 넣기
- 평점 예측 목표 : 정확한 점수 맞추기
- 이 둘은 항상 같은게 아니다.
2. Data Sparsity (데이터 희소성)
- Explicit Feedback (1~5점 평점)
- 유저가 직접 별점을 눌러야 하고, 실제로 평점을 주는 사람은 극소수
- 행렬이 매우 sparse 하다.
3. Complex Rating Biases (복잡한 편향)
- 어떤 유저는 항상 후학, 어떤 유저는 항상 짜게 줌
- 어떤 아이템은 평균적으로 높게/낮게 평가됨
One-Class Collaborative Filtering (OCCF)
OCCF : 정확한 평점 대신 좋아하는지 아닌지만 예측 (이진 분류)
3가지의 장점이 존재
1. 추천 목표와 잘 맞음
- 좋아할 아이템을 찾기 (굳이 몇 점인지 알 필요가 없다.)
2. 데이터 희소성 완화
- Implicit Feedback (클릭/시청/구매) : 자동으로 수집되기에 덜 sparse
- 데이터가 훨씬 풍부하다
3. 빈칸 해석의 도전
- Negative : 유저가 의도적으로 안 본 것 (싫어함)
- Potentially positive : 그냥 모르거나 노출이 안 된 것 (좋아할 수도 있음.)
Weighted regularized MF (WRMF)
One-Class 데이터 표현
- 상호작용한 아이템 -> 1, 상호작용 안 한 아이템 -> 0
- (1~5점이 아닌 0 또는 1만)
기본 MF 와의 차이
| 기본 MF | WRMF | |
|---|---|---|
| 학습 데이터 | 관측된 평점만 | 모든 유저-아이템 쌍 |
| 목표값 | 1~5점 | 0 또는 1 |
| 빈칸 처리 | 무시 | 0으로 포함 + 가중치 조절 |
Weighting Scheme : 가중치의 설정 방법
-
긍정 상호작용(1)의 가중치 \(cui=1(항상 고정)\)
-
부정/빈칸(0)의 가중치 3가지 방법
- Uniform : 모든 빈칸에 동일한 낮은 가중치 부여
-
User-oriented : 유저가 많이 상호작용할수록 안 본것은 진짜 안 좋아할 가능성이 높기에 빈칸 가중치를 높임
- Item-oriented : 아이템이 적게 소비될수록 유저들이 안 본게 싫어서가 아니라 몰라서일 수 있기에 가중치를 낮춤.
Point-wise Training : 각 유저 아이템 쌍의 평점/상호작용을 개별적으로 예측
- Multi-Class 목적 함수:
- One-Class 목적 함수:
Bayesian pariwise ranking (BPR)
Bayesian Personalized Ranking Point-wise의 한계를 극복한 Pair-wise 학습 방법
\[\max_{\Theta} \sum_{(u,i,j)} \ln \sigma \left( x_{ui} - x_{uj} \right) - \lambda \|\Theta\|^2\]Pair-wise : 본 것 vs 안 본 것 -> 상대적인 순서를 학습
- 핵심 가정 : 유저가 본 것 > 안 본 것
- 예측 방식은 WRMF와 동일
MF-based Recommendation 요약
| 방법 | 데이터 | 개인화 | 학습 | 손실 | 목표 |
|---|---|---|---|---|---|
| PureSVD | Explicit | ⚠️ 낮음 | 없음 (수학적 분해) | - | 전역 재구성 |
| Biased MF | Explicit | ✅ | Point-wise | MSE | 평점 예측 |
| SVD++ | Explicit+Implicit | ✅ | Point-wise | MSE | 평점 예측 |
| WRMF | Implicit | ✅ | Point-wise | Weighted MSE | 선호도 예측 |
| BPR-MF | Implicit | ✅ | Pair-wise | BPR | 순위 |
번외 : 요즘의 발전방향
OCCF + BPR Loss + 더 강력한 표현력 + 추가 정보
1. NeuMF [WWW’17]
- MLP로 표현력 강화
- 기존 MF에서 비선형 관계도 표현이 가능하다.
- 구조 :
- GMF Layer : 기존 MF 방식
- MLP Layer : 여러 층의 신경망
- 두 결과를 합쳐서 최종 예측
- 입력 : 유저 / 아이템을 one-hot 벡터로 표현
2. NGCF[SIGIR’19] : GNN으로 이웃 정보 반영
- NeuMF의 한계 : 유저-아이템 직접 관계만 본다. 이웃의 영향을 못 봄
- Grpah Neural Network사용
- 여러 층을 통해 이웃의 이웃까지 정보 전파
3. LightGCN[SIGIR’20]: 불필요한 부분 제거
- NGCF의 한계 : 변환 행렬, 비선형 활성화 등 불필요한 요소가 많아서 복잡하고 오히려 성능이 저하됨.
- LightGCN : 핵심만 남기고 단순화
- 이웃의 임베딩을 Normalized Sum으로만 집계
- 각 레이어의 결과를 weighted sum으로 최종 표현
Data Sparsity
Data Sparsity Problem
- CF는 평점 행렬에 의존하는데, 95% 이상이 빈칸이다.
- Sparsity가 심할수록 성능은 떨어진다.
- 데이터가 희박할수록 추천 품질이 급격히 하락
- 문제점이 되는 이유
- 낮은 정확도, Cold-Start 문제 (평점이 거의 없는 신규 유저/아이템)
- 낮은 커버리지
평가 안된 아이템들 (Unrated Items)을 활용해서 추천을 개선할 수 없을까?
User’s Preference
| Pre-use (사용 전) | Post-use (사용 후) | |
|---|---|---|
| 의미 | 써보기 전 기대감 | 써본 후 실제 만족도 |
| 예시 | “이 영화 재밌어 보여!” | 보고 나서 별점 |
| 데이터 | 추론 필요 | 평점으로 관측 가능 |
Rated vs Unrated 아이템 해석
- 평가된 아이템 (Rated) : Pre-use 선호도가 높았기 때문에 보게 된다.
- 평가 안 된 아이템 (Unrated) : Pre-use 선호도가 낮았기 때문에 안 봤을 가능성이 크다.
(Un)Interesting Items
핵심 질문 : 평가 안된 아이템 (Unrated) = 전부 흥미가 없을까?
- 전체 아이템 집합 I
- 흥미로운 아이템 : 유저가 관심 있는 것
- 선호 아이템 : 실제로 좋아하는 것
- 평가된 아이템 : 실제로 본 것
- 아직 모르는 것 : 흥미롭지만 미 접촉
- 선호 아이템 : 실제로 좋아하는 것
- 흥미없는 아이템 : 진자 관심 없는 것
- 흥미로운 아이템 : 유저가 관심 있는 것
- Unrated 아이템의 2가지 가능성
- Pre-use 선호도가 높다. : 그냥 아직 모르는 것
- 나중에 추천해주면 좋아할 수 있다.
- Pre-use 선호도가 낮다. : 진짜 흥미없는 것
- 추천해도 싫어할 것
- 유전의 부정적 선호도를 알려주는 신호
- Pre-use 선호도가 높다. : 그냥 아직 모르는 것
Uninteresting Items : 유저의 부정적 선호도 학습에 활용 가능
Uninteresting Items를 활용하는 방법
1. 추천에 활용 (긍정 + 부정에 모두 학습)
- 흥미로운 것과 흥미없는 것을 함께 학습하여 유저의 전체적인 취향을 파악
2. 추천 후보에서 제외
-
Uninteresting Items를 추천 목록에서 아예 빼버림
-
싫어할 것이 확실한 건 처음부터 걸러낸다.
-
Step1. 평점 행렬 -> Pre-use 선호도 행렬 변환
- Step2. 빈칸의 Pre-use 선호도 추론
- Step3. Zero-injected Matrix Z 구성
-
그러면 Uninteresting Items을 어떻게 찾냐?
Uninteresting Items 식별 방법
규칙 1. 평가된 아이템 -> Pre-use 선호도 높다.
- 평점이 1,5점이든 일단 봤다는 것 자체 = Pre-use 관심 있었다.
- 모두 Pre-use = 1 (High)로 처리
규칙 2. 평가 안 된 아이템 -> 추론 필요
- CF 방법으로 추론 :
- 비슷한 유저들이 이거에 관심 있었는가?
- 비슷한 유저들도 안봤으면 Uninteresting
Zero-Injection
개념 : Uninteresting Items에 0을 삽입해서 평점 행렬을 더 풍부하게 만드는 방법
3단계 전체 과정
Step 1. 평점 행렬 -> Observed Pre-Use 행렬 변환
- 평점 점수 상관없이 봤으면 1 (Pre-use High)
- 안 봤으면 빈칸 (모름)
Step 2. Pre-use 선호도 추론
- OCCF 방법 (예: WRMF) 으로 빈칸의 Pre-Use 선호도 추론
Step 3. Uninteresting Items 식별 후 0 주입
- 임계값으로 Uninteresting 을 판별
Zero-Injection의 효과
- User-Based / Item-based 에서 둘 다 효과적이다.
- User-based CF에서 공통 아이템이 없어 유사도 계산이 불가할 때, 유사도 계산이 가능해진다.
- Item-based CF에서 훨씬 많은 공통신호로 비교가 가능
- 모든 CF 방법의 성능을 향상시킨다.