나는 개인적으로 유튜브 뮤직을 애용하고 있다. 우연한 계기로 유튜브 프리미엄을 무료체험하게 됐는데, 내가 좋아할만한 음악들을 기똥차게 추천해주는 유튜브 뮤직의 알고리즘에 반해 아직까지도 정기결제에서 헤어나오지 못하고 있다...😅
최근에 흔히 말하는 '알고리즘'에 의한 추천은 어떤 방식으로 이루어 지는 것일까? 오늘은 그 방식인 추천 시스템
에 대해 공부해 보았다.🧐
추천시스템
은 정보 필터링 (IF) 기술의 일종으로, 특정 사용자가 관심을 가질만한 정보 (영화, 음악, 책, 뉴스, 이미지, 웹 페이지 등)를 추천하는 것 으로 정의된다. 최근에는 기존에 많이 사용되던 방법과 더불어 머신러닝 딥러닝의 발달로 더 고도화된 추천 시스템들이 등장하고 있으며, 실제로 우리가 사용하는 서비스에도 많이 적용되고 있다.
추천 시스템은 크게 두가지 유형으로 나뉜다.
콘텐츠 기반 필터링(Content-based filtering)
과
협업 필터링(Collaborative filtering)
방식이다.
콘텐츠 기반 필터링
은 사용자가 특정한 아이템을 선호하는 경우, 그 특정 아이템과 비슷한 속성을 가진 다른 아이템을 추천하는 방식이다. 따라서 콘텐츠 기반이라 함은 아이템 자체의 feature간의 유사도에 따라 추천을 한다는 의미이다.
예를 들어 영화 추천 시스템을 만든다면, 영화라는 아이템에는 다양한 속성(content)이 있다. 장르
, 평점
, 출연 배우
등의 속성을 기반으로 각 아이템 간의 콘텐츠에 대해 유사도를 계산하고, 이를 기반으로 추천하는 방식이다.
협업 필터링
은 아이템 자체의 특성이 아니라 사용자의 행동양식(User behavior)에 기반하여 추천을 하는 방식이다. 사용자 행동양식은 평점, 구매이력과 같이 사용자와 아이템 사이에 발생하는 행동에서 얻을 수 있는 정보를 뜻한다.
이 방식은 사용자-아이템 평점 매트릭스와 같은 축적된 사용자 행동 데이터를 기반으로 아직 평가하지 않은 아이템까지 예측 평가한다.
협업 필터링
기반의 추천 시스템은 다시 최근접 이웃(Nearest Neighbor) 협업 필터링
과 잠재 요인(Latent Factor) 협업 필터링
으로 나뉜다. 두 방식 모두 사용자-아이템 평점 행렬 데이터를 사용하지만, 그 방식에는 차이가 있다.
최근접 이웃 협업 필터링
은 다시 사용자 기반(User-based)
과 아이템 기반(item-based)
로 나뉜다.
이 방식은 특정 "사용자"와 다른 "사용자" 들 사이의 행동양식의 유사도에 기반하여 TOP-N 사용자
를 선정하고, 이들이 선호하는 아이템을 특정 사용자에게 추천한다.
여기서 TOP-N 사용자
란, 유사도가 가장 높은 N명을 선정했다는 뜻이다. 즉, 당신과 비슷한 고객들(Users)이 다음 상품도 구매했습니다~ 하고 추천하는 방식으로 이해할 수 있다.
이 방식은 사용자들이 어떤 아이템을 좋아하는지/싫어하는지 평가한 척도가 유사한 아이템을 추천한다. 즉, 이 상품을 선택한 다른 고객들은 다음 상품도 구매했어요~ 식의 추천 방법이다.
이름이 아이템 기반
이기 때문에 헷갈리기 쉬운데, '아이템 간의 속성'이 얼마나 비슷한지에 기반한 추천방식이 아니다! 아이템의 속성에 의지하는 추천방식은 콘텐츠 기반 필터링
이며, 아이템 기반 협업 필터링
은 각 아이템에 대해 사람들이 비슷하게 평가한 정도가 유사도가 되어 그에 기반한 추천을 수행한다.
🍯 tip. 추천시스템에 사용되는 데이터는 다차원 희소 행렬일 경우가 많으므로 유사도 측정에는 코사인 유사도를 주로 활용한다.
잠재 요인 협업 필터링
이란 사용자-아이템 평점 매트릭스 안의 잠재 요인을 추출하여 추천을 예측하는 방식이다.
대규모 다차원 행렬인 사용자-아이템 평점 매트릭스를 SVD와 같은 차원감소 기법으로 분해하는 과정에서 잠재요인을 추출하여 이를 통해 추천을 하는 방식이다.
실제로 이러한 행렬분해 기법(Matrix Factorization)
을 사용한 알고리즘이 넷플릭스 추천엔진 경연대회에서 우승했을 만큼, 성능이 좋은 방식이라고 한다.
이 방법을 이해하기 위해서는 행렬분해
에 대한 이해가 필요한데, 간단하게만 짚고 넘어가고자 한다.
행렬분해
는 고차원의 희소 행렬을 저차원의 밀집행렬 두개로 각각 분해하는 기법이다. 이에 따라 아래와 같은 방식으로 잠재요인을 추출해낸다.
- [사용자-아이템 평점 행렬]을 행렬분해하여 [사용자-잠재요인 행렬], [잠재요인-아이템 행렬]([아이템-잠재요인 행렬]의 전치(transpose)) 로 각각 분해한다.
- 두 행렬을 내적곱하여 평가하지 않은 아이템을 포함하여 모든 아이템에 대해 예측 평점을 도출한다.
이렇게 구한 잠재요인은 무엇인지 정확히는 알 수 없으나, 평점에 영향을 미치는 item의 속성으로 이해할 수 있다.
예를 들어, 영화 평점 데이터라면 영화의 장르적 특성과 같은 속성으로 유추할 수 있다. 이 때, [사용자-잠재요인 행렬]은 사용자의 장르에 대한 선호를 나타내고, [잠재요인-아이템 행렬]은 아이템이 장르적 특성을 가지고 있는 정도를 나타내는 식이다.
행렬분해 방식에는 주로 SVD(Single Value Decomposition)을 사용하는데, 이 방법은 행렬에 null값(NaN)의 결측치가 있으면 사용할 수 없다. 그런경우에는 경사하강법(SGD)이나 ALS(Alternating Least Squares)방식을 사용한다고 한다.
이렇게 추천 시스템에 대해 간략하게 정리해보았다. 추천 시스템이 적용된 서비스를 잘 사용하는 입장에서 추천 시스템은 개인적으로 관심이 가는 분야였고, 최근에 방학을 맞아 프로젝트로 추천 시스템을 사용한 서비스를 개발해보려고 하고 있다.
아직 이해가 부족하지만, 공부해가면서 내용도 보충하고 직접 추천시스템을 만드는데 성공하고 싶다!
- 『파이썬 머신러닝 완벽가이드』, 권철민 지음
-- chapter 09. 추천시스템 부분을 참조하였습니다.- 위키피디아 / 추천 시스템