Recommender System Theory : 콘텐츠 기반 필터링(Content-based Filtering)
콘텐츠 기반 필터링(Content-based Filtering)
콘텐츠 기반 필터링(Content-based Filtering)은 사용자가 과거에 좋아한 아이템과 비슷한 아이템을 추천하는 방법입니다. 여기서 “비슷하다”는 아이템이 가진 속성, 즉 콘텐츠가 비슷하다는 뜻입니다. 액션 영화를 즐겨 본 사용자에게 다른 액션 영화를, 특정 브랜드의 운동화를 구매한 사용자에게 같은 브랜드의 다른 운동화를 추천하는 방식입니다.
추천 시스템이란?에서 다룬 것처럼, 콘텐츠 기반 필터링은 다른 사용자의 행동을 전혀 사용하지 않습니다. 한 사용자의 기록과 아이템의 속성만 있으면 추천할 수 있으므로, 서비스 초기처럼 사용자가 적을 때도 동작하고, 왜 그 아이템을 추천했는지 설명하기도 쉽습니다.
콘텐츠 기반 필터링은 다음 세 단계로 이루어집니다.
- 각 아이템의 속성을 벡터로 표현한
아이템 프로필(Item Profile)을 만듭니다. - 사용자가 상호작용한 아이템의 프로필을 모아
사용자 프로필(User Profile)을 만듭니다. - 사용자 프로필과 아직 보지 않은 아이템 프로필의 유사도를 계산해 높은 순서로 추천합니다.
아이템 프로필(Item Profile)
아이템을 비교하려면 먼저 아이템을 숫자로 표현해야 합니다. 아이템이 가진 속성은 크게 범주형 속성, 수치형 속성, 텍스트와 이미지 같은 비정형 속성으로 나뉘며, 속성의 형태에 따라 벡터로 바꾸는 방법이 다릅니다.
범주형 속성
장르, 카테고리, 브랜드처럼 정해진 값 중에서 고르는 속성은 단어 임베딩(Word Embedding)에서 다룬 원-핫 인코딩으로 표현할 수 있습니다. 다만 영화 한 편이 액션이면서 SF인 것처럼 여러 값을 동시에 가질 수 있는 경우가 많으므로, 해당하는 위치를 모두 1로 채우는 멀티-핫 인코딩(Multi-hot Encoding)을 사용합니다.
장르가 액션, 로맨스, SF, 코미디 네 가지라면, 액션 SF 영화는 \([1, 0, 1, 0]\)이 되고 로맨틱 코미디는 \([0, 1, 0, 1]\)이 됩니다.
수치형 속성
가격, 상영 시간, 출시 연도처럼 크기가 있는 속성은 값을 그대로 쓸 수 있지만, 속성마다 단위가 다르므로 범위를 맞춰 주어야 합니다. 가격은 수만 단위이고 평점은 1에서 5 사이라면, 그대로 합치면 가격이 유사도를 거의 결정하게 됩니다. 그래서 최솟값과 최댓값으로 0과 1 사이로 바꾸거나, 평균과 표준편차로 표준화한 뒤 사용합니다. 가격처럼 분포가 한쪽으로 크게 치우친 값은 로그를 씌우거나 구간으로 나누어 범주형으로 바꾸기도 합니다.
텍스트 속성
줄거리, 상품 설명, 기사 본문 같은 텍스트는 아이템의 성격을 가장 풍부하게 담고 있습니다. 전통적으로는 단어 임베딩에서 다룬 TF-IDF로 텍스트를 벡터로 바꾸었습니다. TF-IDF는 모든 아이템에 흔히 등장하는 단어의 가중치를 낮추고, 특정 아이템에만 등장하는 단어의 가중치를 높이므로, 아이템의 특징을 드러내는 단어가 벡터에 강하게 반영됩니다. 뉴스 추천처럼 텍스트가 아이템의 전부인 서비스에서 오랫동안 표준으로 쓰였습니다.
TF-IDF는 단어가 정확히 일치해야 유사도가 생긴다는 한계가 있습니다. “노트북 가방”과 “랩톱 파우치”는 같은 종류의 상품이지만 겹치는 단어가 없습니다. 그래서 오늘날에는 검색 증강 생성(Retrieval-Augmented Generation)에서 다룬 문장 임베딩(Sentence Embedding) 모델로 텍스트를 의미 벡터로 바꾸는 방식이 많이 쓰입니다.
이미지 속성
패션이나 인테리어처럼 겉모습이 선택을 좌우하는 분야에서는 아이템의 이미지가 중요한 속성입니다. 이미지는 미리 학습된 합성곱 신경망(Convolutional Neural Network)이나 이미지 인코더에 통과시켜, 마지막 층 직전의 출력을 아이템의 벡터로 사용합니다. 이렇게 하면 색상, 형태, 무늬처럼 말로 적기 어려운 특징까지 벡터에 담을 수 있습니다.
여러 종류의 속성은 각각 벡터로 바꾼 뒤 이어 붙여 하나의 아이템 프로필로 만듭니다. 이때 속성마다 차원 수가 크게 다르면 차원이 많은 속성이 유사도를 지배하므로, 속성별로 벡터의 크기를 맞추거나 가중치를 곱해 각 속성의 영향력을 조절합니다.
- Tip : 아이템 프로필의 품질은 곧 콘텐츠 기반 필터링의 품질입니다. 장르나 카테고리 같은 메타데이터는 사람이 입력하는 경우가 많아 누락되거나 일관되지 않은 경우가 흔하므로, 프로필을 만들기 전에 속성 값을 정리하는 작업이 큰 비중을 차지합니다.
사용자 프로필(User Profile)
아이템을 벡터로 표현했다면, 사용자의 취향도 같은 공간의 벡터로 표현할 수 있습니다. 가장 간단한 방법은 사용자가 좋아한 아이템들의 프로필을 평균하는 것입니다. 액션 영화를 많이 본 사용자라면 평균 벡터의 액션 성분이 커지고, 로맨스 영화를 거의 보지 않았다면 로맨스 성분이 작아집니다.
평점처럼 선호의 강도가 있는 경우에는 평점으로 가중치를 줄 수 있습니다. 다만 평점을 그대로 가중치로 쓰면 1점을 준 아이템도 양의 방향으로 더해지므로, 싫어한 아이템이 오히려 취향에 반영됩니다. 그래서 사용자의 평균 평점을 빼서 평균보다 높은 평점은 양수, 낮은 평점은 음수가 되도록 만든 뒤 가중치로 사용합니다. 이를 평균 중심화(Mean Centering)라 합니다. 사용자 \(u\)가 평가한 아이템의 집합을 \(I_u\), 아이템 \(i\)의 프로필을 \(\mathbf{x}_i\)라 하면, 사용자 프로필은 다음과 같습니다.
\(\bar{r}_u\)는 사용자 \(u\)의 평균 평점입니다. 평균보다 높게 평가한 아이템의 속성은 프로필을 그 방향으로 끌어당기고, 평균보다 낮게 평가한 아이템의 속성은 반대 방향으로 밀어냅니다. 평균 중심화는 사용자마다 평점을 매기는 습관이 다르다는 문제도 함께 해결합니다. 어떤 사용자는 웬만하면 4점 이상을 주고, 어떤 사용자는 좋아도 3점을 주는데, 평균을 빼면 두 사용자 모두 자신의 기준에서 좋았는지 나빴는지로 표현됩니다.
유사도 계산과 추천
사용자 프로필과 아이템 프로필이 같은 공간에 있으므로, 두 벡터의 유사도로 사용자가 아이템을 얼마나 좋아할지 추정할 수 있습니다. 벡터의 크기보다 방향이 중요하므로 주로 코사인 유사도(Cosine Similarity)를 사용합니다.
사용자가 아직 상호작용하지 않은 아이템마다 이 점수를 계산하고, 점수가 높은 순서대로 추천합니다.
계산 예제
장르가 액션, 로맨스, SF, 코미디 네 가지이고, 어떤 사용자가 세 편의 영화에 다음과 같이 평점을 남겼다고 하겠습니다.
| 영화 | 장르 | 아이템 프로필 | 평점 |
|---|---|---|---|
| 영화 A | 액션, SF | \([1, 0, 1, 0]\) | 5 |
| 영화 B | 액션 | \([1, 0, 0, 0]\) | 4 |
| 영화 C | 로맨스, 코미디 | \([0, 1, 0, 1]\) | 1 |
평균 평점은 \((5 + 4 + 1) / 3 \approx 3.33\)이므로, 평균 중심화한 가중치는 영화 A가 \(+1.67\), 영화 B가 \(+0.67\), 영화 C가 \(-2.33\)입니다. 이 가중치로 아이템 프로필을 더하면 사용자 프로필은 다음과 같습니다.
\[\mathbf{p}_u = 1.67 \, [1, 0, 1, 0] + 0.67 \, [1, 0, 0, 0] - 2.33 \, [0, 1, 0, 1] \approx [2.33, \ -2.33, \ 1.67, \ -2.33]\]액션과 SF는 양수, 로맨스와 코미디는 음수로, 사용자의 취향이 그대로 드러납니다. 이제 아직 보지 않은 세 편의 영화와 코사인 유사도를 계산합니다. 사용자 프로필의 크기는 \(\sqrt{2.33^2 + 2.33^2 + 1.67^2 + 2.33^2} \approx 4.37\)입니다.
| 영화 | 장르 | 아이템 프로필 | 코사인 유사도 |
|---|---|---|---|
| 영화 D | SF | \([0, 0, 1, 0]\) | \(1.67 / 4.37 \approx 0.381\) |
| 영화 E | 로맨스 | \([0, 1, 0, 0]\) | \(-2.33 / 4.37 \approx -0.534\) |
| 영화 F | 액션, 로맨스 | \([1, 1, 0, 0]\) | \(0 / (4.37 \times 1.41) = 0\) |
SF 영화인 영화 D가 가장 높은 점수를 받아 추천됩니다. 로맨스 영화인 영화 E는 음수로 추천에서 가장 멀어지고, 좋아하는 액션과 싫어하는 로맨스가 섞인 영화 F는 두 성분이 상쇄되어 0이 됩니다. 이처럼 콘텐츠 기반 필터링의 점수는 어떤 속성 때문에 추천되었는지 바로 확인할 수 있습니다.
- Tip : 아이템이 많으면 모든 아이템과 유사도를 계산하는 것도 부담이 됩니다. 아이템 프로필이 밀집 벡터라면 검색 증강 생성에서 다룬 근사 최근접 이웃 검색으로 가까운 아이템만 빠르게 찾을 수 있고, TF-IDF 같은 희소 벡터라면 검색 엔진의 역색인을 활용할 수 있습니다.
학습 기반 콘텐츠 추천
평균으로 만든 사용자 프로필은 단순하지만, 속성 사이의 상호작용을 표현하지 못합니다. 어떤 사용자는 액션 영화를 좋아하고 코미디도 좋아하지만, 액션 코미디는 싫어할 수 있습니다. 평균 벡터로는 이런 취향을 나타낼 수 없습니다.
그래서 사용자마다 별도의 분류 모델을 학습하는 방식도 사용됩니다. 사용자가 좋아한 아이템은 1, 싫어한 아이템은 0으로 레이블을 붙이고, 아이템 프로필을 입력으로 받아 레이블을 맞히는 모델을 학습합니다. 이는 지도 학습(Supervised Learning)의 이진 분류 문제와 같으며, 로지스틱 회귀나 결정 트리처럼 해석하기 쉬운 모델이 주로 쓰였습니다. 스팸 메일 필터가 사용자마다 스팸 여부를 학습하는 것과 같은 구조입니다.
그러나 이 방식은 사용자마다 모델이 하나씩 필요하고, 상호작용이 몇 개뿐인 사용자는 모델을 학습할 데이터가 부족합니다. 현대의 추천 모델은 사용자마다 따로 학습하는 대신, 모든 사용자의 데이터를 하나의 모델로 학습하면서 사용자를 나타내는 입력을 함께 넣는 방식을 사용합니다. 이 방식은 이후 강좌에서 다룹니다.
장점과 한계
콘텐츠 기반 필터링의 가장 큰 장점은 새로운 아이템을 바로 추천할 수 있다는 것입니다. 새로 등록된 아이템은 아직 아무도 상호작용하지 않았지만, 장르나 설명 같은 속성은 등록할 때부터 가지고 있습니다. 매일 새로운 기사가 쏟아지는 뉴스나 신상품이 계속 들어오는 쇼핑에서 이 장점은 특히 중요합니다.
또한 다른 사용자의 데이터가 필요 없으므로 사용자가 적은 서비스에서도 동작하고, 남들과 취향이 크게 다른 사용자에게도 그 사용자의 기록만으로 추천할 수 있습니다. 추천 이유를 “SF 영화를 좋아하셔서”처럼 속성으로 설명할 수 있다는 점도 장점입니다.
반면 다음과 같은 한계가 있습니다.
- 속성의 한계 : 추천의 품질이 아이템 프로필로 표현할 수 있는 범위를 넘지 못합니다. 같은 SF 장르라도 잘 만든 영화와 못 만든 영화를 장르만으로는 구분할 수 없고, 연출 스타일이나 분위기처럼 속성으로 적기 어려운 취향은 반영되지 않습니다.
- 과도한 전문화(Overspecialization) : 사용자가 이미 좋아한 아이템과 비슷한 아이템만 추천하므로, 추천이 점점 좁은 범위에 머뭅니다. SF 영화를 몇 편 본 사용자는 계속 SF 영화만 추천받게 되며, 사용자가 좋아할 수도 있는 다른 장르를 발견할 기회가 사라집니다. 추천 시스템이란?에서 다룬 필터 버블이 가장 쉽게 생기는 방식입니다.
- 새로운 사용자 문제 : 아이템의 콜드 스타트는 해결하지만, 사용자의 콜드 스타트는 해결하지 못합니다. 기록이 없는 사용자는 사용자 프로필을 만들 수 없습니다. 그래서 가입할 때 관심 있는 장르나 카테고리를 직접 고르게 하여 초기 프로필을 만드는 경우가 많습니다.
이 한계들은 공통적으로 한 사용자의 정보만 사용한다는 데서 비롯됩니다. 다른 사용자들이 어떤 아이템을 함께 좋아했는지를 활용하면, 속성으로 드러나지 않는 품질과 취향까지 잡아낼 수 있고, 사용자가 아직 접하지 않은 영역의 아이템도 추천할 수 있습니다. 다음 강좌에서 다룰 협업 필터링이 바로 그 방법입니다.
콘텐츠 기반 필터링 정리
| 구성 요소 | 역할 | 대표 방법 | 주의할 점 |
|---|---|---|---|
| 아이템 프로필 | 아이템의 속성을 벡터로 표현 | 멀티-핫 인코딩, TF-IDF, 임베딩 | 속성 간 크기와 차원 수의 균형 |
| 사용자 프로필 | 사용자의 취향을 같은 공간의 벡터로 표현 | 평점 가중 평균, 평균 중심화 | 싫어한 아이템의 반영 방식 |
| 점수 계산 | 사용자와 아이템의 유사도 계산 | 코사인 유사도, 분류 모델 | 아이템 수가 많으면 검색 구조 필요 |
콘텐츠 기반 필터링은 추천을 아이템 사이의 유사도 검색 문제로 바꿉니다. 아이템을 어떻게 벡터로 표현하느냐가 성능의 대부분을 결정하므로, 텍스트와 이미지를 의미 벡터로 바꾸는 임베딩 모델이 발전하면서 콘텐츠 기반 필터링의 성능도 함께 올라갔습니다.
실제 서비스에서 콘텐츠 기반 필터링은 단독으로 쓰이기보다, 협업 필터링이 다루지 못하는 새 아이템과 상호작용이 적은 아이템을 보완하는 역할로 많이 쓰입니다. 또한 아이템의 속성 벡터는 이후의 딥러닝 추천 모델에서 아이템을 표현하는 입력으로 그대로 활용됩니다.
- Tip : “이 상품과 비슷한 상품”처럼 사용자가 아니라 현재 보고 있는 아이템을 기준으로 추천하는 경우에는 사용자 프로필 없이 아이템 프로필끼리의 유사도만으로 추천할 수 있습니다. 상품 상세 페이지의 연관 상품 영역이 대표적인 예입니다.
- Writer by : 윤대희
댓글 남기기