행렬 분해(Matrix Factorization)

•
2026년 11월 01일 발행•2026년 11월 01일 수정
요약

사용자-아이템 행렬을 저차원 잠재 요인 행렬의 곱으로 근사해 관측되지 않은 선호를 예측하는 기법

중급
행렬 곱과 저랭크 근사 같은 선형대수 개념과 경사 하강법 기반 최적화를 이해해야 한다.

#개념

행렬 분해(Matrix Factorization)는 사용자-아이템 상호작용 행렬을 두 개의 저차원 행렬의 곱으로 근사해, 사용자와 아이템을 같은 잠재 공간의 벡터로 표현하는 기법이다. 추천 시스템에서는 관측되지 않은 칸의 선호도를 두 벡터의 내적으로 예측하는 모델 기반 협업 필터링(Collaborative Filtering)의 대표 방법이다.
$m$명의 사용자와 $n$개의 아이템으로 이루어진 평점 행렬 $R \in \mathbb{R}^{m \times n}$이 있을 때, 행렬 분해는 $R \approx P Q^\top$이 되도록 사용자 행렬 $P \in \mathbb{R}^{m \times k}$와 아이템 행렬 $Q \in \mathbb{R}^{n \times k}$를 학습한다. $k$는 $m$, $n$보다 훨씬 작으므로 이는 저랭크 근사(Low-Rank Approximation)에 해당한다. 사용자 $u$의 벡터 $p_u$와 아이템 $i$의 벡터 $q_i$의 내적 $q_i^\top p_u$가 예측 선호도가 된다.
잠재 공간의 각 차원은 잠재 요인(Latent Factor)이라 부른다. 영화 추천이라면 어떤 차원은 진지한 영화와 가벼운 영화의 축처럼 해석될 수 있지만, 이런 의미는 사람이 정하는 것이 아니라 데이터에서 자동으로 학습된다. 비슷한 아이템을 좋아한 사용자는 가까운 벡터를 갖게 되고, 비슷한 사용자에게 소비된 아이템끼리도 가까워진다.
행렬 분해가 추천 분야에서 널리 알려진 계기는 넷플릭스 프라이즈(Netflix Prize)였다. 사이먼 펑크(Simon Funk)는 2006년 블로그 글에서 관측된 평점에 대해서만 오차를 줄이도록 SGD로 학습하는 방법을 공개했고, 이 방법은 Funk SVD로 불리며 퍼졌다. 이름에 SVD가 들어가지만 결측값이 많은 행렬에 고전적 특잇값 분해를 직접 적용하지 않고, 관측값만으로 손실을 정의한 최적화 문제로 푼다는 점이 핵심이다.
2009년 코렌(Koren), 벨(Bell), 볼린스키(Volinsky)는 IEEE Computer에 실린 논문에서 이 접근을 정리하고 편향 항을 포함한 모델을 제시했다. 평점에는 사용자·아이템 상호작용과 무관한 경향이 섞여 있으므로 예측식을 $\hat{r}_{ui} = \mu + b_u + b_i + q_i^\top p_u$로 둔다. $\mu$는 전체 평균 평점, $b_u$는 사용자의 평가 성향, $b_i$는 아이템 자체가 평균보다 높게 또는 낮게 평가되는 정도를 나타낸다.
학습은 관측된 평점 집합 $\kappa$에 대해 정칙화된 제곱 오차를 최소화하는 문제다. 목적 함수는 $\min \sum_{(u,i) \in \kappa} (r_{ui} - \mu - b_u - b_i - q_i^\top p_u)^2 + \lambda (\|p_u\|^2 + \|q_i\|^2 + b_u^2 + b_i^2)$이다. 정칙화(Regularization) 계수 $\lambda$는 관측이 적은 사용자·아이템의 벡터가 과도하게 커져 과대적합(Overfitting)되는 것을 막는다. 이 목적 함수를 최적화하는 방법은 다음과 같다.
행렬 분해의 최적화 방법
  • 확률적 경사 하강법(Stochastic Gradient Descent, SGD): 관측 평점을 하나씩 순회하며 오차 $e_{ui} = r_{ui} - \hat{r}_{ui}$를 구하고 $q_i \leftarrow q_i + \gamma (e_{ui} p_u - \lambda q_i)$, $p_u \leftarrow p_u + \gamma (e_{ui} q_i - \lambda p_u)$로 갱신한다. 구현이 쉽고 다양한 손실 함수로 확장하기 좋다.
  • 교대 최소 제곱법(Alternating Least Squares, ALS): 아이템 행렬을 고정하면 각 사용자 벡터는 최소 제곱 문제의 닫힌 해로 구할 수 있으므로, 사용자와 아이템을 번갈아 고정하며 푼다. 각 사용자·아이템 계산이 독립적이라 병렬화가 쉽고, 관측되지 않은 칸까지 다루는 암묵적 피드백 문제에 유리하다.
클릭·구매 같은 암묵적 피드백(Implicit Feedback)은 부정 신호가 없고 관측되지 않은 칸이 매우 많아, 관측값만으로 학습하는 방식이 맞지 않는다. 2008년 후(Hu), 코렌, 볼린스키는 모든 사용자-아이템 쌍을 학습에 포함하되 선호와 신뢰도를 분리하는 모델을 제안했다. 선호 지표 $p_{ui}$는 상호작용이 있으면 1, 없으면 0으로 두고, 신뢰도는 $c_{ui} = 1 + \alpha r_{ui}$로 두어 상호작용 횟수 $r_{ui}$가 많을수록 해당 칸의 오차에 큰 가중치를 준다.
이 모델의 손실은 $\sum_{u,i} c_{ui} (p_{ui} - x_u^\top y_i)^2 + \lambda (\sum_u \|x_u\|^2 + \sum_i \|y_i\|^2)$이며, $x_u$와 $y_i$는 사용자·아이템 벡터다. 합이 모든 쌍에 걸쳐 있어 SGD로는 비용이 크지만, ALS에서 $Y^\top Y$를 미리 계산해 재사용하면 반복당 계산량이 관측된 상호작용 수에 선형으로 늘도록 만들 수 있다. 이 방식은 가중 행렬 분해 또는 implicit ALS로 불리며 지금도 강력한 기준선으로 쓰인다.
2009년 렌들(Rendle) 등이 제안한 BPR(Bayesian Personalized Ranking)은 평점 값을 맞추는 대신 순위를 직접 최적화한다. 사용자 $u$가 상호작용한 아이템 $i$가 상호작용하지 않은 아이템 $j$보다 높은 점수를 받도록 $\hat{x}_{uij} = \hat{x}_{ui} - \hat{x}_{uj}$에 대해 $\ln \sigma(\hat{x}_{uij})$의 합을 최대화하며, 무작위로 뽑은 삼중항 $(u, i, j)$에 SGD를 적용해 학습한다. 행렬 분해를 점수 함수로 쓰는 BPR-MF는 상위 $N$개 추천 문제에서 널리 쓰인다. 행렬 분해는 고전적인 행렬 분해 기법과 다음과 같은 관계를 가진다.
관련 분해 기법과의 관계
  • 특잇값 분해(Singular Value Decomposition, SVD): 값이 모두 채워진 행렬에서 프로베니우스 노름 기준 최적의 저랭크 근사를 준다(에카르트-영 정리). 그러나 결측값을 0으로 채우면 비관측 칸을 비선호로 해석하게 되어 희소한 추천 데이터에는 그대로 쓰기 어렵다.
  • 비음수 행렬 분해(Non-negative Matrix Factorization, NMF): 두 인자 행렬의 원소를 0 이상으로 제한해 각 요인을 부분의 합처럼 해석하기 쉽게 만든다. 해석성이 높은 대신 음의 방향 관계를 표현하지 못한다.
  • 주성분 분석(Principal Component Analysis, PCA): 중심화된 데이터 행렬의 SVD로 구할 수 있으며, 행렬 분해와 마찬가지로 데이터를 저차원 부분 공간으로 투영하는 차원 축소(Dimensionality Reduction) 기법이다.
잠재 차원 $k$와 정칙화 계수 $\lambda$는 가장 중요한 하이퍼파라미터(Hyperparameter)다. $k$가 크면 표현력이 늘지만 희소한 데이터에서 과대적합과 학습 비용이 커지고, $k$가 작으면 취향의 세밀한 차이를 담지 못한다. 실무에서는 수십에서 수백 차원 범위를 검증 세트의 순위 지표로 비교하며, $k$를 키울 때는 $\lambda$를 함께 조정한다. 암묵적 ALS에서는 신뢰도 계수 $\alpha$도 성능에 큰 영향을 준다.
대규모 데이터에서는 아파치 스파크(Apache Spark) MLlib의 ALS 구현이 널리 쓰인다. 잠재 차원 수 rank, 정칙화 계수 regParam, 암묵적 피드백 여부 implicitPrefs, 신뢰도 계수 alpha를 설정할 수 있으며, 암묵적 피드백 방식은 후 등의 2008년 논문을 따른다. 또한 regParam을 각 사용자·아이템의 평점 수로 스케일링하는 ALS-WR 방식을 쓰고, 학습에 없던 사용자·아이템의 예측을 처리하는 coldStartStrategy 옵션을 제공한다. 행렬 분해는 여러 방향으로 확장되었다.
행렬 분해의 확장
  • SVD++: 명시적 평점 외에 사용자가 어떤 아이템과 상호작용했는지라는 암묵적 정보를 사용자 표현에 추가한다. 편향 항도 함께 모델링한다.
  • 시간 동적성(Temporal Dynamics): 코렌의 2009년 KDD 논문은 사용자 편향, 아이템 편향, 사용자 취향이 시간에 따라 변한다는 점을 모델에 반영했다. 넷플릭스 데이터에서 예측 정확도를 높인 timeSVD++가 대표적이다.
  • 인수분해 머신(Factorization Machines, FM): 렌들이 2010년 제안한 모델로, 임의의 특징 벡터에서 모든 특징 쌍의 상호작용을 인수분해된 파라미터로 표현한다. 사용자·아이템 ID만 입력하면 행렬 분해와 같아지고, 문맥·속성 특징을 함께 넣을 수 있다.
행렬 분해의 한계도 분명하다. 학습 데이터에 없는 신규 사용자·아이템은 벡터가 없어 콜드 스타트(Cold Start) 문제가 생기고, 내적 기반의 선형 상호작용만 표현하며, 상호작용 순서나 세션 문맥 같은 정보를 담지 못한다. 또한 상호작용이 많은 인기 아이템이 학습을 주도해 인기 편향이 생기기 쉽다.
딥러닝 기반 추천은 이러한 한계를 넘으려는 흐름으로 볼 수 있다. 신경망 협업 필터링은 내적을 다층 퍼셉트론으로 대체했고, 투 타워(Two-Tower) 모델은 사용자·아이템 속성을 각각 인코더로 처리해 임베딩(Embedding)을 만든 뒤 내적으로 점수를 계산한다. 행렬 분해의 사용자·아이템 벡터는 임베딩 기반 추천의 원형이며, 렌들 등의 2020년 연구가 보였듯 잘 조정된 내적 모델은 여전히 경쟁력 있는 기준선이다.
실무에서 행렬 분해로 학습한 아이템 벡터는 추천 점수 계산 외에도 유사 아이템 검색, 후보 생성, 랭킹 모델의 입력 특징으로 재사용된다. 벡터를 근사 최근접 이웃 인덱스에 올리면 내적 기준 상위 아이템을 빠르게 찾을 수 있고, 학습 비용이 낮아 하루 단위 배치 재학습으로 운영하기 쉽다.

#관련 용어

잠재 요인
데이터에서 자동으로 학습되는 사용자·아이템 표현 벡터의 각 차원
저랭크 근사
원래 행렬을 더 낮은 랭크의 행렬로 근사해 핵심 구조만 남기는 방법
협업 필터링
다수 사용자의 행동 기록으로 선호를 예측하는 추천 기법
확률적 경사 하강법(SGD)
표본 단위 기울기로 파라미터를 반복 갱신하는 최적화 알고리즘
교대 최소 제곱법(ALS)
한쪽 인자 행렬을 고정하고 다른 쪽을 최소 제곱 해로 구하는 과정을 번갈아 반복하는 최적화 방법
특잇값 분해(SVD)
행렬을 직교 행렬과 특잇값 대각 행렬의 곱으로 분해하는 선형대수 기법

#직무 연관도

DA
Data Analyst
낮음
학습된 잠재 벡터로 유사 아이템·사용자 군집을 탐색하고 추천 성과를 해석
DS
Data Scientist
밀접
잠재 차원·정칙화·손실 함수를 설계하고 암묵적 피드백 모델과 순위 학습을 실험
DE
Data Engineer
높음
Spark ALS 등으로 대규모 배치 학습을 운영하고 학습된 벡터를 ANN 인덱스와 서빙 시스템에 배포

#사용 사례

전자상거래미디어인터넷 서비스
개요
행렬 분해는 사용자 행동 로그가 쌓이는 서비스에서 개인화 추천의 핵심 기준선으로 쓰인다. 전자상거래에서는 개인화 상품 추천과 유사 상품 검색에, 미디어에서는 영화·음악·동영상 추천에 활용되며, 학습된 임베딩은 후보 생성과 랭킹 모델의 특징으로 재사용된다.
사례
전자상거래 서비스에서 최근 90일 클릭·장바구니·구매 횟수를 신뢰도로 둔 implicit ALS를 매일 배치로 학습하고, 사용자 벡터와 내적이 높은 상품을 홈 화면 개인화 추천의 후보로 생성한다.

#참고 자료

#추천 포스트

© 2024 diki All rights reserved.