카카오 아레나 2회 대회 (Part. 2)
우연인가? 의도된 것인가? 앨런 튜링이 태어난 6/23일, 카카오 아레나 2회 “브런치 사용자를 위한 글 추천” 대회가 시작되었습니다(https://arena.kakao.com/c/2). 카카오의 브런치 글 추천은 어떻게 이루어지는지 궁금해하실 분들을 위해, 브런치 추천의 힘 6가지에 대해 소개드리는 글을 준비했습니다.
브런치에는 대표적으로 아래 그림처럼 “지금 읽고 있는 글과 유사한 글을 추천하는 유사글 추천”과 “앱 첫 화면에 맞춤 추천을 하는 개인화 추천”을 제공하고 있습니다. 이 기능을 통해 독자 한 사람 한 사람의 취향을 저격하는 좋은 글을 추천해 드리기 위해 고민했던 과정을 여러분들께 이야기해 보고자 합니다.
카카오는 토로스(TOROS)라 불리는 AI 추천 플랫폼(https://brunch.co.kr/@kakao-it/72)을 통해 다양한 서비스(다음 추천뉴스, 멜론, 1분, 브런치, 페이지, 픽코마, 헤어 등)에 추천 기능을 제공하고 있습니다.
이러한 추천 기능을 적용할 때 서비스 담당자에게 꼭 하는 말이 있습니다. "첫술에 배부를 순 없다. 그러니 추천을 적용하고 A/B테스트[1]를 통해 개선하고, 개선하고, 개선하자. 그리고 원하는 성과를 얻자."라는 말입니다.
첫술에 배부를 수 없는 이유는, 서비스 도메인마다 사용할 수 있는 데이터와 추천을 통해 이루고자 하는 목표(지표)가 다르고 이는 다른 서비스에서 성공한 추천모델이 여기에서도 성공한다는 보장이 없기 때문입니다. 따라서 추천 모델을 적용한 후에는, 온라인 A/B테스트를 통해 서비스에 최적화된 추천 모델 찾기 위한 기다림과 인내의 과정이 필수적입니다.
그렇다면 브런치는 어떻게 했을까요? 2015년 10월 첫 도입 이후 유사글 추천의 A/B테스트 지표의 흔적을 보면, 반복적으로 매일 3~5개의 실험을 위한 테스트 버킷을 생성/삭제하면서 지속적으로 모델을 개선했다는 사실을 알 수 있습니다.
최근에는 다양하고 많은 영역에 추천을 적용하다 보니 점점 숟가락이 커져 요즘은 첫 술이 배부른 경우도 많이 발생하곤 합니다.
추천 시스템에서 A/B테스트 시스템은 필수이기에 토로스 추천 시스템에서도 자체적으로 A/B 테스트를 지원하고 있습니다. 주요 기능 아래와 같습니다.
언제든지 실험 버킷의 룰 추가/삭제/변경
각 버킷의 노출 비율을 조정 [0% ~ 100%]
버킷 할당 방식으로 유저 기준, 트래픽 기준 제공
A/B테스트를 통해 버킷팅 실험을 시작하면 추적이 되기에(예, Click Through Rate) 적용 후 바로 실험 결과를 확인할 수 있습니다. 실험을 할 때 가장 마음을 졸이게 되는 순간은 결과 지표를 확인할 때인데, 실험군 버킷이 대조군 버킷을 능가하기를 마음속으로 열렬히 응원하게 됩니다.
개인화 추천 서비스를 도입하게 되면 사용자와 글(아이템) 간 인터렉션이 없는 신규 유저와 신규 글은 추천의 대상이 되지 않습니다. 이를 콜드 스타트(cold start)[2] 문제라고 부르고, 콜드 스타트 유저와 글은 인기글을 추천 결과로써 제공합니다. 브런치 추천에서도 콜드 스타트 문제를 위해 UX 편향 없는 인기글 측정을 통해 CTR을 높이고 있습니다.
‘인기글’이란 무엇일까요? 현재 유저들이 많이 읽는 글입니다. 유저들에게 많이 읽히는 글은 내용도 중요하지만, 유저에게 얼마나 노출되었는지에 따라 많은 영향을 받게 됩니다. 아무리 좋은 글이라도 노출되지 않으면 읽힐 수가 없고, 메인 화면과 같이 누구나 볼 수 있는 곳에 노출된다면 글의 품질을 떠나 많은 노출 기회를 얻게 되어 인기글이 될 가능성이 높습니다.
이러한 실제 글의 가치, 글의 품질과 관계없는 요소에 의해 편향이 발생하기 때문에 편향성을 제거하고 데이터를 분석하는 것이 중요합니다. 그러나 현실적으로는 이러한 편향 문제를 완벽히 해결 하기는 어렵습니다. 그래서 단순 통계에 의존한 인기글 보다 더 나은 방식에 대한 고민이 필요합니다. 참고로 브런치는 신규 글을 많이 소비하도록 노출 조건이 구성되어 최근에 발행된 글이 인기 글이 되는 경우가 많습니다. 이러한 UX 의존성은 유저의 피드백을 학습 데이터로 사용하는 추천 시스템에 많은 영향을 미치게 됩니다.
토로스 추천시스템에서는 UX 의존성과 같은 편향 문제를 해결하기 위해 노출 기회가 (최대한) 공평한 추천 시스템에 의해 소비되는 글의 지표를 분석∙측정하여 양질의 인기글을 찾아냅니다. 이렇게 찾아낸 양질의 글들은 대체적으로 지속적으로 많이 읽히는 글들입니다.
아래는 인기글과 UX 편향 없는 인기글 각각의 Top 100을 비교한 결과입니다. 인기글에 비해 UX 편향 없는 인기글의 평균 댓글 수와 공유수가 높습니다. 실제로 이런 UX 편향 없는 인기글을 적절히 추천 시스템에 활용할 때 추천 성과 지표가 50%~70%가량 높아짐을 실험적으로 확인했습니다.
토로스 추천 시스템을 처음 도입할 때 선택하는 베이스라인 모델(대조군 버킷)에 UX 편향 없는 인기글(콘텐츠)이 많이 선택되는데, 실험 초기에는 구현된 개인화 추천 모델이 UX 편향 없는 인기글로 선택한 베이스라인 모델에 뒤쳐지는 경우가 자주 발생하였습니다.
추천 시스템에서 연관 추천은 추천 시스템의 대표적인 기능이자, 추천 적용 시 성과가 좋은 기능입니다. 브런치에서도 아래 그림처럼 현재 읽고 현재 글을 본 독자에게 추가적인 소비를 일으킬 수 있는 좋은 글을 추천하여 독자당 평균 소비 글 수와 소비되는 글의 다양성을 크게 개선하였습니다. 그럼 브런치에 적용된 유사글 추천 모델에 대해 자세히 알아보겠습니다.
유사글 추천은 유사한 글을 찾는 “글 특징 추출 모델”과 유사한 글 중에서 유저에게 반응이 좋은 글을 찾기 위한 “실시간 랭킹 최적화 모델”로 구성되어 있습니다.
토로스의 유사글을 찾기 위한 글 특징 추출은 CBF(contents based filtering) 모델과 CF(collaboration filtering)을 모두 사용하여 아래와 같은 다양한 특징 벡터를 추출합니다.
위 결과(그림)처럼 CBF-Text 모델의 경우 “아이, 놀이” 등의 주제어가 잘 맵핑된 글이 유사글로 선택됩니다. 이때 선택한 글의 읽음 수가 0건인 글도 다수 포함되어 있는 것을 확인할 수 있습니다. CF 모델의 대표적인 특징으로, CF모델은 인기가 있으면서도 유사한 글이 잘 선택됨을 볼 수 있습니다.
이렇게 선택된 유사글을 대상으로 실시간 랭킹 최적화(MAB)[3]는 탐색(Exploration) 과정을 통해 CTR을 측정하며, CTR이 가장 높은 글을 선택하는 획득∙활용(Exploitation) 과정을 통해 몇 개의 글이 추천됩니다. 실시간 랭킹 최적화에 대한 자세한 설명은 토로스 추천 시스템에 대한 설명글(https://brunch.co.kr/@kakao-it/72)을 참고하시길 바랍니다.
브런치 글은 발행한 당일 가장 많이 읽히고(전체 소비의 25%가 글의 발행일 날 이루어짐), 1주일이 지난 시점에는 누적으로 58%가 소비됩니다. 이렇게 글의 소비 패턴은 글 발행 후 시간이 경과될수록 아래 그래프에서처럼 지수적 감쇠가 일어나는 것을 알 수 있습니다. 그래서 글 발행 직후 유입되는 유저의 트래픽을 최대화시키기 위해 신규 글의 유사글 추천(추천에서 아이템 콜드 스타트) 문제를 잘 푸는 것이 중요합니다.
토로스 추천 시스템은 신규 글이 발행되면 유사글 추천을 위해 CBF 특징 값을 가장 먼저(30분 이내) 추출하여 추천에 활용하고 유저들의 피드백이 모이기 시작하는 CF 특징 값을 추출해 아이템 콜드 스타트 문제를 해결하고 있습니다.
추가로 반응률이 좋은 콘텐츠 추천을 위해 실시간 랭킹 최적화 모델(MAB)에서 사용되는 임프레션(Impression)과 클릭 피드백은 카프카 스트림(Kafka stream)을 통해 실시간으로 수집되어 즉시 추천에 반영됩니다. 이 업데이트 주기가 지연되었을 때 추천 성능에 많은 영향을 미치는데 '미디어다음 뉴스의 피드백 지연 시간에 따른 추천시스템의 성능 비교 실험'의 결과를 보면, 업데이트의 지연이 10초 이내에 되는 경우 지연이 120초가 걸렸을 경우보다 CTR의 성능이 1.71배 높다는 것을 알 수 있습니다. 이처럼 좋은 추천을 위해서는 좋은 모델도 필요하지만 추천 모델링에 사용되는 데이터의 최신성을 유지하는 것도 매우 중요합니다.
브런치 앱의 첫 화면에는 최근에 내가 읽은 글을 이용해 나를 위한 맞춤 추천을 제공하고 있습니다. 아래 결과는 “데이터 분석, 개발, 추천기술” 글에 관심을 가지고 있는 사용자의 맞춤 추천 결과입니다.
브런치의 개인화 맞춤 추천은 유사글 추천과 같이 2단계의 과정을 거쳐 이루어집니다. 추천할만한 글을 선정하는 ‘타겟팅 단계’, 내가 본 글을 기반으로 내가 좋아할 만한 글을 찾아내는 랭킹 단계’입니다.
글의 정보로 예측된 CTR이 높은 글
위에서 언급한 UX 편향 없는 인기글
통계분석에 의해 추천할만한 글
이러한 조건에 만족하는 글을 타겟팅 하게됩니다.
타겟팅에 사용되는 CTR 예측은 글의 CBF∙CF 특징 값과 메타 정보(읽은 수, 공유수, 댓글 수 등)를 입력값으로 사용하여 CTR예측 모델(XGBoost Regression)을 통해 pCTR(predicted CTR)을 측정하고 pCTR이 높은 상위 글들이( top-K) 맞춤 추천 후보 글이 됩니다. 이 CTR예측 모델의 학습 데이터는 사용자의 피드백(노출∙클릭) 데이터를 사용했습니다.
개인화 추천을 위한 전통적인 CF 방식은 유저의 피드백(User X Item) 데이터의 행렬 분해 기법을 통해 개인화 추천을 제공합니다. 실제로 여러 서비스를 통해 행렬 분해 기법이 룰∙통계 기반의 개인화 추천보다 높은 성능을 내는 것이 증명되었습니다.
이런 CF 방식을 서비스에 도입하기 위해서는 수백 유저와 아이템수를 커버할 수 있는 규모성(scaliability)과 유저의 피드백을 즉시 반영하는 최신성이 필요합니다.
토로스 추천시스템에서 주로 사용되는 ALS(Alternative Least Square)[5], Word2Vec[6] 같은 CF모델은 분산처리, 증분 학습 그리고 알고리즘 최적화를 통해 대량의 브런치 피드백 데이터를 수분 이내에 학습하고, 이를 추천 시스템에 즉시 적용합니다. 또한 개인화 추천을 요청하는 쿼리 타임에 행렬 분해 연산을 추가로 수행하여 개인화된 추천 결과 제공합니다. 이렇게 쿼리 타임에 행렬 분해를 수행함으로써 최신의 유저 피드백(취향)이 개인화 추천에 반영됩니다.
여기서 수행하는 행렬 분해 연산은 아래 그림과 같이 사전에 학습된 글(item)의 특징 벡터 값과 최신의 유저 피드백으로 최소 제곱 법(least square) 연산을 하게 되는데 이 연산은 많은 비용이 필요합니다. 그래서 토로스 추천 시스템에서는 추천할 글의 수를 줄이기 위해 타겟팅하고, 알고리즘이 최적화된 분산 추론(inference) 서버를 구현하여 이 기능을 제공하고 있습니다.
브런치의 개인화 추천을 위한 전체 과정은 아래 그림과 같이 이루어집니다.
지금까지 브런치 글 추천을 위한 6가지 특징에 대하여 알아보았습니다. 브런치 글의 추천은 지금도 계속해서 버티고, 버티고, 버티며 진화 중입니다. 마지막으로 6가지 주요 특징을 한번 더 강조하며 글을 마무리하겠습니다.
1. 추천을 하려는 자, 버티고, 버티고, 버텨라
2. 측정하지 않으면 개선하지 못한다
3. UX 편향 없는 인기글을 수집하라
4. 이 글과 비슷하고 잘 반응하는 글을 찾아라(유사글 추천 모델)
5. 유사글 추천의 콜드 스타트(Cold Start) 문제를 풀어보자
6. 나를 위한 맞춤 추천(개인화 추천 모델)
글 | 카카오 추천팀, 최규민 pi.314@kakaocorp.com
참고자료
*1 참고 ᅵ https://ko.wikipedia.org/wiki/A/B_테스트
*2 참고 ᅵ https://en.wikipedia.org/wiki/Cold_start_(computing)
*3 참고 ᅵ https://en.wikipedia.org/wiki/Multi-armed_bandit
*4 참고 ᅵ https://brunch.co.kr/@kakao-it/72
*5 참고 ᅵ http://yifanhu.net/PUB/cf.pdf