추천시스템(Recommender System)

    필자의 주특기(?)중 하나가 추천 알고리즘을 만드는 것이기 때문에 추천 시스템에 대해서 간략히 적어보도록 하겠다. 사실 최근에 유튜브에서 유행하는 댓글 중에 이런 말이 있다. "유튜브의 알고리즘이 나를 여기로 이끌었다."


    나를 왜 이 영상을 보게 만들었는지 모르겠지만 봐보니 재미있다 이런 내용들이 많은 이 드립에 사람들은 유튜브에 경의(敬意)를 표하게 된다. 그러나 사실 크게 어려운 개념이 아니라서, 이번 포스팅에 바로 이 추천 시스템  혹은 추천 엔진(Recommender Engine)에 대해서 설명하고 어떤 알고리즘들이 있는지를 확인해보도록 하겠다.




    관심이 있을만한 컨텐츠를 추천하는 추천 시스템

    추천 시스템(Recommender System)의 개념

    - 컨텐츠의 내용에 기반하거나, 사람들의 행동들을 모은 후, 전문적인 알고리즘을 활용하여 사람들에게 컨텐츠를 추천 해주는 솔루션


    추천 시스템의 목적

    시간 단축 : 검색 및 항목을 타지 않고, Direct로 컨텐츠를 추천해 준다

    커버리지 확보 : 예측 못한 컨텐츠를 접하게 하여, 사용자가 선택하는 컨텐츠 폭을 넓혀준다



    추천 시스템의 비교

    Contents-Based와 Collaborative 방식

    추천 시스템은 크게 행동 방식과 컨텐츠 내용 방식으로 나뉘게 된다



    추천 시스템의 종류

    추천 시스템의 종류를 대표적으로 정리를 하는 것은 어려운 일이다. 사이트의 특성에 따라 알고리즘이 다를 수 있으며 같은 알고리즘 부류라 하더라도 만드는 방식도 사실 다르기에 정답이 존재하지는 않지만, 필자가 경험한 그리고 만들어본 추천 알고리즘 위주로 설명을 해보도록 하겠다.


    알고리즘에 개별적인 설명은 별도의 포스팅을 했거나 할 예정이니 참고하길 바란다.



    장바구니 알고리즘, 연관성 규측(Association Rules)

    장바구니 알고리즘은 추천 시스템의 대표적이고 고전적인 알고리즘이다. 알고리즘에 대한 이해도가 높고, 실제 효과도 매우 뛰어나기 때문이다.



    장바구니는 사람들의 장바구니를 분석하여, 통계를 쌓게 되고 연관을 찾게 된다. 필자가 예를 들어 편의점에서 라면과 달걀을 사게 되면 컴퓨터는 라면과 달걀이 연관성이 있다고 판단을 하게 되는 것이다. 이를 분석하기 위해 지지도(Support) 신뢰도(Confidence) 향상도(Lift)라는 값을 이용하여 추천을 한다.


    장바구니는 컨텐츠를 분석하지 않고 오로지 사람들의 행동을 기반으로 분석하기 때문에 행동기반 알고리즘으로 분류할 수 있다.



    컨텐츠 기반 필터링(Contents-Based Filtering)

    컨텐츠 기반 필터링은 말그대로 컨텐츠만을 가지고 추천을 하는 알고리즘이다. 유튜브를 예로 들면, 우리가 영상을 올린 후 영상에 대한 컨텐츠 내용을 본문란에 적거나 자막 같은 것으로 컨텐츠를 추가할 수 있다.


    혹은, 컨텐츠의 화면의 유사성도 컨텐츠 기반으로 볼 수 있을 것이다. 예를 들어 어떤 사진을 봤는데 비슷한 느낌의 사진이라면 컨텐츠 기반이라 할 수 있을 것이다. 11번가같은 쇼핑몰을 보면 내가 어떤 옷을 주문 했는데 비슷하게 생긴 옷들이 밑에 나열되는 것을 볼 수 있다. 


    이렇게 아이템이 유사한 것들을 추천하는 것을 컨텐츠 기반 필터링이라 할 수 있을 것이다.


    컨텐츠 기반 필터링을 위해서 사용하는 기법에는 TF-IDF(Term-Frequency Inverse Document Frequency)나 Word2Vec, 그리고 문서의 유사성을 찾아주는 Term-Based 기법, Similarity 알고리즘, 문서 다중 분류 등을 활용할 수 있을 것이다.



    협업 필터링(Collaborative Filtering)

    추천 시스템을 처음 설명하면서 "유튜브 알고리즘이 나를 여기로 이끌었다"라는 댓글을 설명하였다. 사실 이 유튜브 알고리즘을 유추해 볼 때 "협업 필터링"일 가능성이 가장 높다.


    물론, 그 영상이 급작스럽게 인기가 많아서 사용자가 안본 인기 영상을 추천해줄수도 있지만 (추천 영상들이 하나의 알고리즘만 사용하는게 아니라 여러개의 알고리즘이 복합적으로 나열되어 있기 때문에...) 보편적으로 엉뚱한 것 같지만 일리있는 추천을 해주는 것이 바로 협업 필터링이다.




    협업 필터링은 사람들의 행동을 모와서 나랑 가장 유사한 사람을 찾아주거나 아이템을 찾아주는 방식이다. 보편적으로 협업 필터링을 논할 때는 User-Based Filtering을 논하며, Item-based Filtering의 성능은 유사한 장바구니 알고리즘에 비해서 썩 좋은 편이 아니었다(필자의 사이트에 한할 수 있음) 


    장바구니 알고리즘이 A라는 행동을 할 때 B는 무엇일까를 유추하는 것이고, A라는 아이템과 가장 유사한 아이템은 B이다를 맞추는 것이 컨텐츠 기반이라고 한다면 유저 기반의 협업 필터링은 A라는 사람과 가장 유사한 사람은 B이며, A가 안본 B의 아이템을 추천해주는 것이다.


    그렇기 때문에 쌩뚱맞은 추천이 나올 수 있겠지만, 코드가 맞는 사람의 영상이라든지 제품이라든지를 볼 수 있기 때문에 사람의 행동 커버리지를 크게 넓힐 수가 있게 된다. 유튜브를 예로 들면 협업 필터링을 구현하기 위해 내가 봤던 영상들, 그리고 시간대, 영상을 보는 패턴 등을 분석하여 가장 유사한 사람을 찾아내서 나열 한 후 그 사람들의 아이템에 점수를 산정하여 추천을 하는 것이 아닐까 유추해 볼 수 있을 것이다.



    하이브리드 방식


    이것저것 알고리즘을 다 만들고 나서 정체기를 느꼈던 적이 있었다. 잘 되겠다 싶은 알고리즘의 효율성이 심각하게 떨어진 적이 있었는데 그것이 바로 Term-Based 알고리즘이었다. 키워드 기반으로 추천을 하여 커버리지도 잡고, 사용자도 잡고 싶었으나 런칭 이후 A/B 테스트를 해본 결과 기존 알고리즘(장바구니, 협업 필터링)에 비해서 성능이 70%도 나오지 않았다.


    다만 긍정적인 것은 커버리지는 비약적으로 상승시킬 수 있는 방법이었기에 내부적으로 밀어붙이냐 아니면 고도화를 한 후 재런칭을 해야 할지 회의를 하던 찰나 필자의 머리속에서 한순간 아이디어가 번뜩 떠올려지고 말았다.


    Term-Based의 문제점은 유사한 컨텐츠가 나오는가가 아니라, 좋지 않은 컨텐츠가 나오는 문제였다. 그래서 알고리즘의 존망을 걸린 회의때 임원분과 함께한 회의에서 하루만에 다시 바꿔오겠다고 하였고, 마찬가지로 성능이 좋지 못했던 행동기반 알고리즘과 병합을 하게 되었다. 


    Term-Based의 컨텐츠 유사도 점수와 해당 컨텐츠의 선호도 점수를 종합하여 컨텐츠의 최종 추천 점수를 재정렬하였고, 해당 알고리즘은 한순간에 가장 효과가 좋은 알고리즘의 95% 가까운 성능으로 하이브리드 방식의 효과를 느낄 수 있게 되었다.


    게다가 이 알고리즘은 커버리지가 가장 효과가 좋은 알고리즘의 2배 이상을 보여주기 때문에 전반적으로 가장 효자 노릇을 하는 알고리즘으로 거듭나게 되었다. 



    추천시스템을 만드는 사람들에게 하고 싶은 말


    위와 같은 알고리즘들을 만드는데 들어가는 비용이 많이 걸릴 것이라 생각하는데 필자는 컨텐츠 기반 알고리즘도 자바(Java)로 2일, 장바구니 알고리즘은 하루만에 만들어서 사용할 수 있었다. 물론 사이트 특성에 맞게 특징(Feature)별로 가중치(Weight)를 달리 줘야 하는 시간이 걸렸지만 이 방법은 어디까지나 솔루션이나 라이브러리를 활용해도 동일할 것이다.


    다만 직접 자바 코드로 알고리즘을 짜버렸기 때문에 해당 알고리즘을 고도화하기 쉬웠으며, 무궁무진하게 알고리즘들이 터져나오기 시작하였다. 추천 사이트를 담당하고, 현재 AI 쪽으로 전환하기 전까지 약 2~3년 동안 알고리즘을 10~20개 가까이 만들었으며, 아직도 머리속에서 남아있는 알고리즘이 10개 이상 되니 직접 만든 알고리즘의 위력을 알 수 있었다.


    알고리즘을 개발할 줄 모르면서 일명 추천 전문가라고 여기저기 알고리즘 라이브러리를 조합하는 사람은 추천 시스템 전문가라 생각치 않는다. 그건 초등학생도 배우면 하는 단계이기 때문이다. 혹시나 추천 시스템에 관심이 있는 사람이라면 직접 오늘부터 하나씩 코딩을 해보길 바란다. 그래야 사이트에 맞는 방식이 나오며 추천 아키텍처를 만들 수 있을 것이다.



    참고자료



    댓글

    Designed by JB FACTORY