추천 알고리즘을 쉽게 이해해보자
막대한 컨텐츠나 상품이 있는 서비스들에서 유저는 탐색의 늪에 빠지기 때문에, 최근의 서비스들에는 추천 시스템이 없는 곳이 드물다. 우리에게 너무 익숙한 이 추천 시스템은 어떤 알고리즘으로 만들어지는 것일까? <추천 시스템 입문>이라는 책을 읽고, 4장의 내용을 요약 및 내가 이해한대로 정리해보았다.
책에 따르면 추천 시스템은
'여러 후보 가운데 가치 있는 것을 선정해서 의사결정을 지원하는 시스템'
이다. 문장 앞부분인 "여러 후보 가운데 가치 있는 것을 선정"할 때, 추천 알고리즘이 사용되는데, 크게 두 가지로 분류할 수 있다.
내용 기반 필터링은, 특정 아이템의 카테고리, 브랜드, 색상 등 아이템의 내용을 나타내는 정보를 사용한다. 예를 들어,
<신짱구는 콜라라는 상품을 좋아한다.>
<콜라는 탄산음료이다.>
라는 정보를 기반으로 짱구에게 다른 탄산음료인 스프라이트를 추천할 수 있다. 이렇게 사용자가 선호하는 내용에 가까운 아이템을 추천해주는 알고리즘이 "내용 기반" 필터링이다.
이 때 <콜라는 탄산음료이다> 처럼 아이템에 대한 정보가 필요하다. 예를 들어 식품이라고 한다면, 카테고리(건강/신선/가공식품 등), 가격대, 브랜드 등 상품에 대한 정보가 있을 것이다.
특정 상품이 아니라 이미지일 경우에는 찍힌 물체를 AI 등을 통해 판별한 정보라든지, 색감이라든지, OCR 기술을 통해 추출된 텍스트라든지 다양한 정보들이 있을 것이다. 추후에 이런 정보들에서 어떤 정보가 추천에서 유용하게 쓰일 수 있을지를 판별하고 활용하는 것이다.
<신짱구는 콜라라는 상품을 좋아한다>라는 정보도 필요한데, 이 정보는 어떻게 얻을 수 있을까? 신짱구가 과거에 구매하거나, 검색했던 상품들을 샅샅이 뒤져보면 이를 알 수 있을 것이다.
구매내역에 기반해
대분류: 식품, 상세분류: 음료, 브랜드: 떡잎식품
이라는 신짱구의 프로필 정보를 만들 수 있을 것이다.
한편 신짱구에게 직접 관심사를 물어보는 방법도 있다.
ex) 서비스 가입 직후나 마이페이지 등에서 관심있는 상품종류나 브랜드를 선택해보라는 화면을 본 경험들이 있을 것이다.
구매내역이 없더라도 이렇게 직접 물어보는 방법을 통해 사용자의 정보를 얻을 수 있다.
협조 필터링은 쉽게 말하면 끼리끼리(?)라고 할 수 있다. 내가 좋았던 물건을 지인들에게 추천해주는 것처럼, 서비스 내에 있는 다른 유저의 기호를 활용하여 추천하는 알고리즘이다.
예를 들어,
신짱구와 김철수가 둘 다 피자를 구입했고, 이후에 신짱구는 콜라를 구매했다
고 했을 때, 김철수에게도 콜라를 추천해주는 식이다. 추천받은 철수뿐 아니라 신짱구같은 다른 유저 데이터들과의 협조를 통해 추천할 아이템을 결정하므로, "협조" 필터링이다.
신짱구와 선호도가 비슷한 유저를 어떻게 찾을 수 있을까? 이 때 신짱구의 구매내역에서 선호도를 추측해, 비슷한 유저를 찾을 수 있다.
예를 들어 2회 이상 구입한 적이 있는 아이템은 선호하는 것으로, 구입하지 않은 아이템은 선호하지 않는다고 간주하는 것이다. 이렇게 유저의 선호도 정보를 사용하지만 아이템 자체의 정보는 사용하지 않는 것이 협조 필터링이다.
이렇게 과거 구매내역 등으로부터 선호도를 측정하여 비슷한 사용자를 찾아 추천에 활용할 수 있다. 이렇게 사용자가 특정 아이템을 선호한다는 정보를 "기호 데이터"라고 한다. 이 기호 데이터는 2가지 방법으로 수집할 수 있다.
유저가 구매 후에 남기는 별점이나 리뷰 등을 통해 직접적으로 얻을 수 있는 "명시적 피드백"
사용자가 직접 구입한 사실이나 '위시 리스트' 등에 등록했다는 사실 등을 통해 유추하는 "암묵적 피드백"
2가지 방법이다.
1) 콜드스타트 문제가 있을 때
콜드스타트란 서비스에 사용자나 아이템에 대한 정보가 없는 상황을 뜻한다. 신규 서비스를 런칭했을 때, 아무런 사용자 정보가 없으면 협조 필터링을 활용한 추천은 당연히 불가할 것이다. 이 때 서비스측에서 갖고 있는 아이템의 정보를 활용하고, 사용자에게는 명시적으로 아이템에 대한 기호를 직접 입력받는다면 내용 기반 필터링이 조금 더 유리할 수 있다. 하지만 이 또한 완벽하지는 않기 때문에 서비스가 성장해나가면서 알고리즘도 지속적으로 손을 봐야하긴 할 것이다.
2) 사용자 수가 적은 서비스일 때
콜드스타트 대응 관점과 거의 비슷한 맥락이다. 사용자가 별로 없을 경우에는 추천 대상자가 관심가질만한 아이템을 특정하기가 어렵다. 또 계속 맘에 들지 않는 추천을 하게되면 유저의 신뢰도까지 하락할 수 있다.
3) 추천 적용 대상의 범위를 넓히고 싶을 때
협조 필터링에서는 아무도 평가를 하지 않은 아이템은 추천할 수 없다. (아무도 안샀거나, 아무도 찜을 하지 않은 상품일 경우가 이렇다.) 추천할 수 있는 아이템 수가 적어지는 것이다. 반면에 내용 기반 필터링은 아무도 구입하지 않은 아이템이어도 아이템 자체의 정보를 갖고 있기 때문에 추천에 활용할 수 있다.
4) 아이템 특징을 잘 활용하고 싶을 때
당연한 이야기지만 내용 기반 필터링에서 아이템 특징을 추천에 더 잘 활용할 수 있다. 예를 들어 딸기맛 비타민젤리가 메인화면에서 계속 추천되는데, 다른 건강식품들이 아니라 레몬맛, 오렌지맛, 자몽맛 등등 맛만 다른 같은 상품들이 계속 추천된다면 골치가 아플 것이다. 이렇게 상품의 특징을 추천에 활용해서 추천을 더 하거나, 덜 하는 조정을 시도해볼 수 있다.
1) 비슷하지 않은 다양한 상품들을 추천하고 싶을 때
협조 필터링에서는 짱구가 전혀 모르더라도 철수는 알고 있는 상품을 추천받을 수 있다. 먹어본 적 없거나, 평소에 관심이 전혀 없었던 새로운 세계(?)의 아이템까지 추천을 받을 수 있다. 내용 기반 필터링에서는 짱구가 아예 모르는 브랜드나 카테고리는 추천상품에 나오기 어렵다. 미지의 상품이기 때문에 과거의 구매이력에도 없고, 직접 관심있는 상품으로도 지정할 수 없기 때문이다. 종종 서비스들을 이용하다보면 맨날 똑같은 상품만 추천해줘서 질릴 때가 있는데, 이 때는 협조 필터링으로 알고리즘을 조정하면 어느정도 해결할 수 있겠다.
2) 도메인 지식에 대한 리소스를 줄이고 싶을 때
협조 필터링에서는 아이템에 대한 정보가 필요하지 않다. 다른 유저들의 선호도에 기반해 추천이 만들어지기 때문이다. 반면에 내용 기반 필터링에서는 서비스 운영자가 아이템의 카테고리, 브랜드, 유사집단의 선호도 등에 대한 전문적인 지식이 필요하고 관리도 해야 하기 때문에, 인력이나 비용 등의 리소스가 추가적으로 들 수 있다. 물론 이런 점들이 추천 알고리즘의 정확도를 높이는데 당연히 도움이 되겠지만, 리소스를 줄이고 싶다면 이 비중을 줄이는게 도움이 될 수도 있다.
3) 예측의 정확도를 높이고 싶을 때
두 알고리즘 모두 장단점이 있고 어느 한쪽이 무조건 좋다고는 말할 수 없다. 하지만 어느 정도 규모가 있는, 일반적인 서비스라고 했을 때 협조 필터링이 정확도가 더 높다고 한다. 다양한 사용자의 행동 이력을 추천에 반영할 수 있기 때문에 복잡한 유저들의 마음을 더 헤아릴 수 있는 것 같다. 또한 유저들이 서비스를 계속 사용하고, 다른 사용자들의 기호 데이터가 늘어날수록 정확도 향상에 도움이 되기 때문에 더 덕을 볼 수 있는 것 같다.
이렇게 추천 시스템에 사용되는 알고리즘은 어떤 종류가 있는지 간단하게 알아보았다. 이 책은 뒷부분에는 갑자기 행렬 분해... 같은 내용이 나와서 문과가 이해하기 어렵지만 초중반부까지는 추천 시스템이 어떤 식으로 구성되고, 기획할 때 어떤 점들을 고려해야 하는지 아주 자세히 알 수 있는 책이다. 뒷부분까지 이해하려면 아주 여러번 읽고 공부해야 할 것 같지만 그동안 앞부분의 내용마저 까먹을까봐 브런치에 기록해둔다!