상위 목록: 하위 목록: 작성 날짜: 읽는 데 8 분 소요

협업 필터링(Collaborative Filtering)

협업 필터링(Collaborative Filtering)은 다른 사용자들의 행동을 근거로 추천하는 방법입니다. 과거에 취향이 비슷했던 사람들은 앞으로도 비슷한 것을 좋아할 것이라는 가정에서 출발합니다. 친구에게 영화를 추천받을 때 나와 영화 취향이 비슷한 친구의 말을 더 믿는 것과 같은 원리입니다.

콘텐츠 기반 필터링(Content-based Filtering)이 아이템의 속성을 보았다면, 협업 필터링은 아이템의 속성을 전혀 보지 않습니다. 영화의 장르도, 상품의 카테고리도 필요 없고, 추천 시스템이란?에서 다룬 사용자-아이템 행렬만 있으면 됩니다. 아이템이 무엇인지 몰라도, 누가 무엇을 좋아했는지만 알면 추천할 수 있습니다.

이 성질 덕분에 협업 필터링은 속성으로 표현하기 어려운 취향까지 잡아냅니다. 두 영화가 같은 장르라도 하나는 걸작이고 하나는 졸작이라면, 장르만 보는 콘텐츠 기반 필터링은 둘을 구분하지 못합니다. 그러나 협업 필터링에서는 많은 사용자가 한쪽에만 높은 평점을 주었다는 사실이 그대로 반영됩니다. 또한 장르가 전혀 다른 아이템이라도 같은 사람들이 함께 좋아했다면 연결되므로, 사용자가 아직 접하지 않은 영역의 아이템도 추천할 수 있습니다.

협업 필터링은 크게 두 갈래로 나뉩니다. 이 강좌에서 다룰 이웃 기반(Neighborhood-based) 방법은 사용자-아이템 행렬을 그대로 두고 비슷한 사용자나 아이템을 찾아 예측합니다. 데이터를 기억해 두었다가 예측할 때마다 꺼내 쓴다는 뜻에서 메모리 기반(Memory-based) 방법이라고도 합니다. 다른 갈래인 모델 기반(Model-based) 방법은 행렬로부터 모델을 학습해 두고 그 모델로 예측하며, 다음 강좌에서 다룰 행렬 분해(Matrix Factorization)가 대표적입니다.



사용자 기반 협업 필터링

사용자 기반 협업 필터링(User-based Collaborative Filtering)은 추천받을 사용자와 취향이 비슷한 사용자들을 찾고, 그들이 좋아한 아이템을 추천합니다. 사용자 \(u\)가 아이템 \(i\)에 줄 평점을 예측하는 과정은 다음과 같습니다.

  1. 사용자 \(u\)와 다른 모든 사용자 사이의 유사도를 계산합니다.
  2. 아이템 \(i\)를 평가한 사용자 중 유사도가 가장 높은 \(k\)명을 이웃(Neighbor)으로 고릅니다.
  3. 이웃들이 아이템 \(i\)에 준 평점을 유사도로 가중 평균하여 예측합니다.

이는 가장 가까운 \(k\)개의 이웃으로 값을 예측하는 k-최근접 이웃(k-Nearest Neighbors) 알고리즘을 사용자에게 적용한 것과 같습니다.


피어슨 상관 계수

두 사용자의 취향이 얼마나 비슷한지는 두 사람이 함께 평가한 아이템의 평점을 비교해 측정합니다. 사용자-아이템 행렬의 행을 벡터로 보고 코사인 유사도를 계산할 수도 있지만, 평점에는 사용자마다 다른 습관이 섞여 있습니다. 어떤 사용자는 좋아도 3점을 주고, 어떤 사용자는 웬만하면 5점을 줍니다.

그래서 각 사용자의 평균 평점을 뺀 뒤 비교하는 피어슨 상관 계수(Pearson Correlation Coefficient)를 주로 사용합니다. 두 사용자 \(u\)와 \(v\)가 함께 평가한 아이템의 집합을 \(I_{uv}\)라 하면, 유사도는 다음과 같습니다.

\[\text{sim}(u, v) = \frac{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}_u)(r_{vi} - \bar{r}_v)}{\sqrt{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}_u)^2} \sqrt{\sum_{i \in I_{uv}} (r_{vi} - \bar{r}_v)^2}}\]


콘텐츠 기반 필터링에서 다룬 평균 중심화를 한 뒤 코사인 유사도를 계산한 것과 같습니다. 값은 -1에서 1 사이이며, 1에 가까우면 두 사용자가 같은 아이템을 함께 좋아하고 함께 싫어했다는 뜻이고, -1에 가까우면 한 사람이 좋아한 아이템을 다른 사람은 싫어했다는 뜻입니다.


평점 예측

이웃을 골랐다면 이웃들의 평점으로 예측 값을 계산합니다. 이때도 평점 습관의 차이를 고려해, 이웃의 평점을 그대로 쓰지 않고 이웃의 평균에서 얼마나 벗어났는지를 가져옵니다. 사용자 \(u\)의 이웃 중 아이템 \(i\)를 평가한 사용자의 집합을 \(N_i(u)\)라 하면, 예측 평점은 다음과 같습니다.

\[\hat{r}_{ui} = \bar{r}_u + \frac{\sum_{v \in N_i(u)} \text{sim}(u, v) \, (r_{vi} - \bar{r}_v)}{\sum_{v \in N_i(u)} \lvert \text{sim}(u, v) \rvert}\]


이웃들이 자신의 평균보다 아이템 \(i\)를 얼마나 더 좋게 또는 나쁘게 평가했는지를 유사도로 가중 평균하고, 그 값을 사용자 \(u\)의 평균에 더합니다. 평소 2점대를 주는 이웃이 4점을 주었다면 평소 4점대를 주는 이웃이 4점을 준 것보다 훨씬 강한 추천으로 해석됩니다.


계산 예제

다섯 명의 사용자가 다섯 개의 아이템에 평점을 남겼고, 사용자 A가 아이템 5에 줄 평점을 예측한다고 하겠습니다.

사용자 아이템 1 아이템 2 아이템 3 아이템 4 아이템 5
사용자 A 5 3 4 4 ?
사용자 B 3 1 2 3 3
사용자 C 4 3 4 3 5
사용자 D 3 3 1 5 4
사용자 E 1 5 5 2 1


먼저 사용자 A와 사용자 B의 유사도를 계산합니다. 함께 평가한 아이템은 1번부터 4번까지이며, 그 범위에서 사용자 A의 평균은 4, 사용자 B의 평균은 2.25입니다. 평균을 뺀 값은 사용자 A가 \([1, -1, 0, 0]\), 사용자 B가 \([0.75, -1.25, -0.25, 0.75]\)입니다.

\[\text{sim}(A, B) = \frac{1 \times 0.75 + (-1) \times (-1.25) + 0 + 0}{\sqrt{2} \times \sqrt{2.75}} = \frac{2}{2.345} \approx 0.85\]


같은 방법으로 나머지 사용자와의 유사도를 계산하면 다음과 같습니다.

사용자 사용자 A와의 유사도 아이템 5 평점 전체 평균 평점
사용자 B 0.85 3 2.4
사용자 C 0.71 5 3.8
사용자 D 0.00 4 3.2
사용자 E -0.79 1 2.8


사용자 B와 C는 사용자 A와 취향이 비슷하고, 사용자 E는 거의 반대입니다. 이웃의 수를 \(k = 2\)로 정해 사용자 B와 C를 이웃으로 고르면, 예측 평점은 다음과 같습니다.

\[\hat{r}_{A,5} = 4 + \frac{0.85 \times (3 - 2.4) + 0.71 \times (5 - 3.8)}{0.85 + 0.71} = 4 + \frac{0.51 + 0.85}{1.56} \approx 4.87\]


두 이웃 모두 아이템 5를 자신의 평균보다 높게 평가했으므로, 사용자 A의 평균인 4보다 높은 약 4.87점이 예측됩니다. 아이템 5는 사용자 A에게 추천할 만한 아이템입니다.

  • Tip : 유사도가 음수인 사용자를 이웃에 포함하면 “반대 취향인 사람이 싫어한 아이템은 좋아할 것”이라는 추론이 되지만, 실제로는 이 추론이 잘 맞지 않는 것으로 알려져 있습니다. 그래서 보통은 유사도가 양수인 사용자만 이웃으로 사용합니다.



아이템 기반 협업 필터링

사용자 기반 협업 필터링은 직관적이지만, 대규모 서비스에서는 문제가 있습니다. 사용자는 수천만 명이고 계속 늘어나며, 사용자의 취향은 새로운 상호작용이 생길 때마다 변합니다. 사용자 사이의 유사도를 미리 계산해 두어도 금세 낡아지고, 매번 다시 계산하기에는 사용자가 너무 많습니다.

아이템 기반 협업 필터링(Item-based Collaborative Filtering)은 관점을 바꾸어 아이템 사이의 유사도를 계산합니다. 두 아이템을 같은 사용자들이 비슷하게 평가했다면 두 아이템은 비슷한 아이템입니다. 사용자가 아이템 \(i\)를 얼마나 좋아할지는, 그 사용자가 이미 평가한 아이템 중 아이템 \(i\)와 비슷한 아이템에 준 평점으로 예측합니다.

\[\hat{r}_{ui} = \frac{\sum_{j \in N_u(i)} \text{sim}(i, j) \, r_{uj}}{\sum_{j \in N_u(i)} \lvert \text{sim}(i, j) \rvert}\]


\(N_u(i)\)는 사용자 \(u\)가 평가한 아이템 중 아이템 \(i\)와 가장 비슷한 \(k\)개입니다. 사용자 기반 방법이 “비슷한 사람들은 이것을 어떻게 평가했나”를 묻는다면, 아이템 기반 방법은 “이 사람은 비슷한 아이템들을 어떻게 평가했나”를 묻습니다.


조정된 코사인 유사도

아이템 사이의 유사도는 사용자-아이템 행렬의 열을 비교해 계산합니다. 이때도 사용자마다 평점 습관이 다르다는 문제가 있으므로, 각 평점에서 그 평점을 준 사용자의 평균을 뺀 뒤 코사인 유사도를 계산합니다. 이를 조정된 코사인 유사도(Adjusted Cosine Similarity)라 합니다. 아이템의 평균이 아니라 사용자의 평균을 뺀다는 점이 피어슨 상관 계수와 다릅니다.

\[\text{sim}(i, j) = \frac{\sum_{u \in U_{ij}} (r_{ui} - \bar{r}_u)(r_{uj} - \bar{r}_u)}{\sqrt{\sum_{u \in U_{ij}} (r_{ui} - \bar{r}_u)^2} \sqrt{\sum_{u \in U_{ij}} (r_{uj} - \bar{r}_u)^2}}\]


\(U_{ij}\)는 두 아이템을 모두 평가한 사용자의 집합입니다. 앞의 예제에서 사용자 B부터 E까지의 평점으로 아이템 5와 나머지 아이템의 조정된 코사인 유사도를 계산하면 아이템 1이 0.81, 아이템 2가 -0.91, 아이템 3이 -0.76, 아이템 4가 0.43입니다. 유사도가 양수인 아이템 1과 4를 이웃으로 사용하면, 사용자 A가 두 아이템에 준 평점 5점과 4점으로 다음과 같이 예측합니다.

\[\hat{r}_{A,5} = \frac{0.81 \times 5 + 0.43 \times 4}{0.81 + 0.43} \approx 4.65\]


사용자 기반 방법의 4.87과 값은 조금 다르지만, 두 방법 모두 사용자 A가 아이템 5를 높게 평가할 것으로 예측합니다.


아이템 기반 방법의 장점

아이템 기반 방법이 대규모 서비스에 적합한 이유는 아이템 사이의 관계가 사용자 사이의 관계보다 안정적이기 때문입니다. 한 아이템에는 많은 사용자의 평가가 쌓이므로, 새로운 평가가 몇 개 더해져도 아이템 사이의 유사도는 크게 변하지 않습니다. 그래서 아이템 유사도를 하루에 한 번처럼 미리 계산해 두고, 추천할 때는 사용자가 최근 상호작용한 아이템의 이웃을 조회하기만 하면 됩니다.

2003년 아마존은 이 방식을 “아이템 대 아이템(Item-to-Item)” 협업 필터링으로 발표했으며, 수천만 명의 고객과 수백만 개의 상품에도 실시간으로 동작했습니다. 추천 이유를 “고객님이 구매한 이 상품과 함께 구매된 상품”처럼 사용자가 아는 아이템으로 설명할 수 있다는 점도 장점입니다.

  • Tip : 사용자 기반과 아이템 기반 중 어느 쪽이 나은지는 사용자와 아이템의 수에 따라 다릅니다. 이웃을 찾는 쪽의 개체 수가 적고 각 개체에 평가가 많이 쌓여 있을수록 유사도가 안정적입니다. 대부분의 서비스는 아이템보다 사용자가 훨씬 많으므로 아이템 기반 방법이 유리한 경우가 많지만, 뉴스처럼 아이템이 빠르게 바뀌는 서비스에서는 그렇지 않을 수 있습니다.



유사도 척도의 선택

유사도를 계산하는 방법은 데이터의 형태에 따라 달라집니다.

유사도 척도 계산 방식 적합한 데이터
코사인 유사도 두 벡터의 각도 평점 습관의 차이가 적은 데이터
피어슨 상관 계수 각 벡터의 평균을 뺀 뒤 코사인 사용자 기반 방법의 평점 데이터
조정된 코사인 유사도 사용자의 평균을 뺀 뒤 코사인 아이템 기반 방법의 평점 데이터
자카드 유사도 교집합의 크기 / 합집합의 크기 클릭, 구매처럼 있음과 없음만 있는 데이터


클릭이나 구매처럼 값이 0과 1뿐인 데이터에서는 자카드 유사도(Jaccard Similarity)를 사용할 수 있습니다. 아이템 \(i\)와 \(j\)를 구매한 사용자의 집합을 각각 \(U_i\)와 \(U_j\)라 하면 \(\lvert U_i \cap U_j \rvert / \lvert U_i \cup U_j \rvert\)로 계산하며, 두 아이템을 함께 구매한 사용자의 비율을 나타냅니다.

어떤 척도를 쓰든 공통적으로 주의할 점은 함께 평가한 개수가 적을 때입니다. 두 사용자가 단 두 개의 아이템만 함께 평가했고 그 평점이 우연히 일치했다면, 유사도는 1이 되어 가장 가까운 이웃이 됩니다. 그러나 이 유사도는 거의 믿을 수 없습니다. 그래서 함께 평가한 개수가 일정 수보다 적으면 유사도를 그 비율만큼 줄이는 유의도 가중(Significance Weighting)을 적용합니다. 예를 들어 기준을 50개로 정했다면, 10개만 함께 평가한 경우 유사도에 \(10 / 50 = 0.2\)를 곱합니다.



협업 필터링의 한계

이웃 기반 협업 필터링은 단순하면서도 성능이 좋아 오랫동안 추천 시스템의 표준이었지만, 다음과 같은 한계가 있습니다.

  • 희소성 : 추천 시스템이란?에서 다룬 것처럼 사용자-아이템 행렬은 대부분 비어 있습니다. 두 사용자가 함께 평가한 아이템이 거의 없으면 유사도를 계산할 수 없거나 믿을 수 없게 됩니다. 사용자 A와 B가 비슷하고 B와 C가 비슷하더라도, A와 C가 함께 평가한 아이템이 없으면 A와 C의 관계는 알 수 없습니다.
  • 확장성 : 사용자 기반 방법에서 모든 사용자 쌍의 유사도를 계산하려면 사용자 수의 제곱에 비례하는 연산이 필요합니다. 아이템 기반 방법도 아이템이 수백만 개라면 아이템 쌍의 수가 매우 커집니다.
  • 콜드 스타트 : 상호작용이 없는 새 사용자는 이웃을 찾을 수 없고, 상호작용이 없는 새 아이템은 다른 아이템과의 유사도를 계산할 수 없습니다. 콘텐츠 기반 필터링이 새 아이템을 추천할 수 있었던 것과 대조적입니다.
  • 인기도 편향 : 인기 아이템은 많은 사용자와 함께 등장하므로 많은 아이템의 이웃이 됩니다. 그 결과 인기 아이템이 더 자주 추천되고, 추천되므로 더 인기를 얻는 순환이 생깁니다.


이 중 희소성 문제는 특히 근본적입니다. 이웃 기반 방법은 직접 관측된 평점만으로 유사도를 계산하므로, 관측이 적으면 할 수 있는 일이 없습니다. 관측된 평점들로부터 사용자와 아이템의 숨은 성질을 학습해 두면, 함께 평가한 아이템이 없는 사용자끼리도 비교할 수 있게 됩니다. 다음 강좌에서 다룰 행렬 분해가 이 아이디어를 구현한 방법입니다.



협업 필터링 정리

구분 사용자 기반 아이템 기반
이웃의 대상 비슷한 사용자 비슷한 아이템
예측의 근거 비슷한 사용자들이 그 아이템에 준 평점 그 사용자가 비슷한 아이템들에 준 평점
주요 유사도 피어슨 상관 계수 조정된 코사인 유사도
유사도의 안정성 사용자의 취향 변화에 민감 상대적으로 안정적
사전 계산 어려움 쉬움
추천 설명 “취향이 비슷한 사용자들이 좋아했습니다” “구매하신 상품과 함께 구매되었습니다”

협업 필터링은 아이템이 무엇인지 몰라도 사람들의 선택이 모인 흔적만으로 추천할 수 있다는 점에서 강력합니다. 콘텐츠 기반 필터링이 아이템의 속성 공간에서 가까운 것을 찾았다면, 협업 필터링은 사용자의 행동 공간에서 가까운 것을 찾습니다.

이웃 기반 방법은 지금도 아이템 기반 방법을 중심으로 널리 쓰입니다. 구현이 단순하고, 결과를 설명하기 쉬우며, 새로운 상호작용을 반영하기 위해 모델을 다시 학습할 필요가 없기 때문입니다. 특히 “이 상품과 함께 본 상품”처럼 현재 아이템을 기준으로 추천하는 영역과, 대규모 추천 시스템의 후보 생성 단계에서 자주 사용됩니다.



  • Writer by : 윤대희

댓글 남기기