넷플릭스의 추천시스템
넷플릭스는 개인마다 다른 영상 추천 화면을 보여준다. 넷플릭스 리서치에 넷플릭스가 어떻게 화면을 개인화 하는지 공개했다. 이번 포스팅에서는 Learning a Personalized Homepage를 번역하며, 넷플릭스의 개인화 방식에 대해 알아보고자 한다.
넷플릭스는 추천시스템으로, 개인화된 화면을 제공하고 있다. 이때 가정은 두개이다.
- 한 화면 안에 표시할 수 없을만큼 많은 영상이 있음
- 각 유저마다 고유한 관심사를 가지고 있음
따라서 넷플릭스는 개인의 관심사와 의도를 다루면서도 다른 콘텐츠를 탐색할 수 있도록 하고자 한다.
추천으로 화면을 구성하는 서비스는 뉴스 사이트, 검색 엔진, 온라인 쇼핑몰에서도 중요하다. 이 사이트들의 공통점은 많은 항목 중에서 몇가지를 선택하여, 일관되고 탐색하기 쉬운 방식으로 보여주고자 한다. 물론 넷플릭스만의 특수성도 있다.(ex. 인터페이스 제약, 기존의 미디어와 영화나 TV가 소비되는 방식의 차이)
넷플릭스의 개인화된 화면 예시
현재 대부분의 기기에서 넷플릭스 홈페이지는 2차원 레이아웃으로 보여진다. 행은 같은 주제로 구성된 영상(영화나 TV 프로그램)로 구성되어 있다. 유저는 행에서 가로로 스크롤하여 동일 주제의 영상을 보거나, 세로로 스크롤하여 다른 주제의 영상을 볼 수 있다. 따라서 개인화의 핵심은 화면에 표시할 행을 구성하는 것 이다. 행 구성에는 유저와 가장 관련이 있는 행을 선택하는 방법, 해당 행을 채우는 방법, 시청할 영상을 직관적으로 선택할 수 있도록 정렬하는 방법이 포함된다.
Why Rows Anyway?
앞서 말했듯이 넷플릭스는 많은 영상을 쉽게 탐색할 수 있도록 행 단위로 구성한다. 한 행에 하나의 주제에 대한 영상들이 있고, 각 행에 의미있는 이름을 붙여, 유용한 순서로 행을 나열한다. 왜 넷플릭스는 행 단위 구성을 했을까?
행이 같은 주제의 영상으로 이루어져 있기 때문에, 해당 행에 보고 싶은 영상이 포함될 가능성이 있는지를 직관적으로 결정 할 수 있기 때문이다. 따라서 더 깊이 들어가 동일한 주제의 더 많은 영상을 찾거나, 건너 뛰고 다른 행을 볼 수 있다.
지금부터 행 단위로 화면을 구성하는 과정을 살펴보자.
행을 만들고 선택하는 방법
- 일단 영상을 그룹화한다. 메타 데이터(ex. 장르, 하위 장르, 출시 날짜)로 그룹을 만들 수도 있고, 협업 필터링 알고리즘처럼 행동 정보(ex. 시청할 가능성이 있는 영상, 친구가 시청한 영상)로 그룹을 만들 수도 있다. 넷플릭스는 지속적으로 새로운 영상 그룹화를 실험해보고 있다고 한다.
- 다음으로 그룹화된 영상 세트로 화면을 구성한다. 유저에 대한 정보를 기반으로 유저와 관련 있는 후보 그룹을 찾는다. 예를 들면, 한 장르에서 이전에 시청한 영화 정보를 이용한다.
- 각 그룹을 필터링하여 수위 등급 문제를 처리하거나 이미 시청한 영상을 삭제한다.
- 순위 알고리즘으로 각 그룹의 영상 순위를 매기고, 유저와 관련성이 높은 순서로 정렬한다.
- 지금까지 만들어진 행 후보에 행 선택 알고리즘을 적용하여 전체 페이지를 조합한다.
- 페이지가 구성되면 반복되는 영상을 제거하고 행을 장치에 적합한 크기로 조정한다.
Page-level algorithmic challenge
개인화된 화면이란, 수천개의 영상에서 몇 개의 영상을 골라 유저/기기 당 하나의 페이지를 만드는 것을 말한다. 여러 요소의 균형을 맞춰서 한 화면 공간을 구성해야 하는데, 이 때 넷플릭스가 원하는 조건은 다음과 같다.
- 새로운 취향을 발견할 수 있도록 하면서도, 다음 에피소드를 보거나 과거에 보았던 것을 다시 볼 수 있도록 한다.
- 취향에 맞는 영상을 정확하게 추천하면서도, 관심사 범위를 포함할 수 있도록 다양해야 한다.
- 유저가 추천된 영상을 시청하거나 목록에 추가하거나 평가하기를 바란다.
- 홈페이지에 익숙해지고 최근에 추천한 영상을 쉽게 찾을 수 있도록 어느 정도의 안정성을 원한다.
- 위와 같은 검색 지향 행 사이에 “내 목록”과 같은 작업 지향 행도 필요하다.
각 장치마다 표시되는 영상의 수, 행의 수, 전체 페이지의 크기가 다르다. 따라서 페이지 생성 프로세스는 행 수, 행의 최소와 최대 길이, 페이지에서 보이는 부분의 크기와 같은 페이지를 생성에 대한 제약 조건을 알고 있어야 한다.
추천 시스템에서는 다양한 항목을 보여주는 것이 중요하다. 2차원 탐색 레이아웃을 제공함으로써 유저는 수직으로 스크롤하여 현재 의도와 일치하지 않는 전체 콘텐츠 그룹을 쉽게 건너뛰고, 더 관련성이 높은 집합을 찾은 다음 가로로 스크롤하여 더 많은 추천 항목을 볼 수 있다. 이를 통해 전체 페이지에 표시되는 영상의 다양성을 유지하면서, 관련성이 높은 개별 행을 선택할 수 있다.
Building a page algorithmically
(1) 규칙 기반 접근
알고리즘으로 화면을 구성하는 기본적인 방법은 규칙 기반 접근 방식 이다. 규칙은 페이지의 특정 위치에 들어갈 행 유형을 템플릿을 말한다. 예를 들어, 규칙은 첫번째 행이 Continue Watching(있는 경우), Top Picks(있는 경우), Popular on Netflix, 5개의 개인화된 장르 행으로 지정할 수 있다. 이 접근 방식은 “Because you watched <video>” 행을 포함하고 알려진 장르 선호도를 기반으로 하는 장르 행을 포함하는 등 정해진 규칙을 기반으로 후보 행을 선택한다. 각 유형 내에서 특정 행을 선택하기 위해 간단한 휴리스틱한 방법과 샘플링이 사용되고, A/B테스트를 사용하여 이 템플릿을 발전시킨다.
이 접근 방식은 도움이 되었지만 두가지 문제가 있었다.
- 먼저 중요한 요소들을 무시한다.: 행에 있는 동영상의 품질, 페이지의 다양성 정도, 특정 행 유형에 대한 유저의 친밀도, 각 동영상에 대해 표시할 수 있는 증거의 품질.
- 다음으로 영상을 적절한 순서로 정렬하고 템플릿에 적절하게 배치해야 하므로 새로운 유형의 행을 추가하기가 어렵다. 즉, 규칙은 시간이 지남에 따라 커지고 다양한 행을 처리하기에는 너무 복잡해진다는 문제가 있다.
(2) 행-순위 접근
이러한 문제를 해결하기 위해, 규칙으로 템블릿을 정하는 것이 아니라, 개인마다 행 순서를 다르게 한다. 간단하게 ranking 문제에서 행을 항목으로 처리했다. 이를 행-순위 접근(row-ranking approach) 이라고 한다. 이 접근 방식의 경우 행에 대한 스코어링 함수를 만들어서, 모든 행에 독립적으로 적용하고, 스코어링 값으로 정렬한 후, 페이지에 보여줄 상위 항목을 정한다. 상대적으로 빠르며 정확도를 얻을 수 있지만, 다양성을 보장할 수 없기 때문에 하나의 주제로 가득 찬 페이지가 나왔다.: 심야, 가족, 로맨틱, 액션 등
(3) 단계적 방식
다양성을 추가하기위해, 이미 시청한 영상과 행을 고려한 스코어링 함수 를 사용해서 행-순위 방식(row-ranking approach)에서 단계적 방식(stage-wise approach) 으로 전환한다. 탐욕법(greedy approach)으로 이 함수를 최대화하는 행을 사용할 다음 행으로 선택한 다음 해당 선택을 고려하여 다음 위치에 대한 모든 행에 대해 다시 점수를 매긴다. 함수에 따라 탐욕법은 최적의 페이지로 이어지지 않을 수도 있다. k-row lookahead와 함께 단계적 접근 방식을 사용하면 탐욕법보다 최적의 페이지를 만들 수 있지만 계산 비용이 증가한다. submodular function maximization를 기반으로 다양성을 탐욕스럽게 추가하는 방식을 사용할 수 있다.
(4) 페이지 단위 접근
그러나 고정된 수평선은 페이지 아래에 있는 더 나은 행을 채우는 기능을 제한할 수 있기 때문에 단계적 방식도 최적의 페이지를 생성한다고 보장할 수 없다. 따라서 전체 페이지 스코어링 함수 를 정의하여 페이지 단위 접근 방식을 취할 수 있다면, 적절하게 행과 영상을 선택하여 최적화 할 수 있다. 물론 페이지의 공간은 행의 공간보다 훨씬 크다. 하지만 페이지 레이아웃은 개별 공간에서 정의되기 때문에, 전체 페이지의 품질을 정의하는 함수를 직접 최적화하는 것은 계산적으로 불가능하다. 이러한 접근 방식 중 하나로 페이지 최적화 문제를 풀 때 중복 제거, 필터링, 장치 별 제약과 같은 앞에서 언급한 다양한 제약 조건도 고려해야한다. 이러한 각 제약은 최적화 문제의 복잡성을 추가한다.
Machine Learning for page generation
행이나 페이지의 품질을 평가하는 스코어링 함수는 개인화된 페이지 구축의 핵심이다. 홈페이지에서 유저가 실제로 보는 것, 상호 작용하는 방법, 시청하는 패턴으로 스코어링 함수를 만들 수 있다.
행을 표현하는 피처를 만들어야 한다. 한 행에는 한 주제의 영상 세트가 있으므로, 행을 집계하거나 인덱싱하여 피처를 만들 수 있다. 행과 관련된 증거의 품질을 볼 수도 있고, 해당 행이나 유사한 행을 유저가 시청했었는지 확인할 수 있다.
- 특정 장르에 관심이 있는 유저가 얼마나 많은 support가 있었는지
간단한 설명 피처를 만들 수도 있다.
- 연속된 영상의 수
- 페이지에서 행이 배치되는 위치
- 행을 표시한 빈도
페이지의 나머지 부분과 비교해볼 수도 있다.
- 행이 나머지 행과 얼마나 유사한지
- 행의 영상이 나머지 행의 영상과 얼마나 유사한지
하지만 스코어링 함수를 만들기 위한 모델 학습에는 몇 가지 문제가 있다.
- 먼저 페이지 편향 문제가 있다. 유저는 보여지는 행에서만 시청할 수 있으며, 이는 학습 데이터에 큰 영향을 미칠 수 있다. 더 복잡한 것은 페이지에서 행의 위치가 그 행에서 재생을 선택하는지 여부에 큰 영향을 줄 수 있다. 이러한 페이지에 대한 편향을 처리하려면, 학습 데이터를 잘 선정해야한다.
- 다음으로 모델에서 어트리뷰션이 허용되는 방식에 대한 문제도 있다. 특정 행에서 재생된 영상이 다른 행의 첫번째 위치에 배치 되었다면 유저가 똑같이 선택했을까? 행의 제목이 “Critically Acclaimed Documentaries”인 것이 시청의 원인이었을 수도 있다. 반면에 더 좋은 위치에 있더라도 “New Releases”은 다른 정보 없이는 선택되지 않을 가능성이 크다. 잠재적 행의 공간은 크지만, 페이지의 나머지 부분(또는 이미 선택한 행)의 공간은 훨씬 더 크기 때문에, 다양성을 설명하는 피처를 학습시키는 것도 어려울 수 있다.
Page-level metrics
모든 알고리즘이 그렇듯 적절한 메트릭을 선택하는 것이 중요하다.
2차원 재현율 예시
페이지 수준의 메트릭을 만들기 위해, 1차원 리스트에 대한 순위 메트릭(정보 검색에서 많이 사용됨 참고)을 확장하여 2차원 메트릭을 만들었다. 상위 n개의 관련 항목 수를 관련 항목의 총 수로 나눈 값을 측정하는 Recall@n 메트릭을 2차원인 Recall@m-by-n으로 확장한다. 즉, 처음 m개 행과 n개 열의 관련 항목 수를 총 관련 항목 수로 나눈 값을 계산한다. 다시 말하자면, Recall@3x4는 한 번에 3개의 행과 4개의 영상을 표시할 수 있는 장치의 품질을 측정한다. 이렇게 정의된 recall은 중복된 영상이나 짧은 행과 같은 코너-케이스(corner-cases)를 자동으로 처리한다. 또한 n이나 m값 중 하나를 고정하고 다른 값을 스윕하여 유저가 페이지를 아래로 스크롤 할 때, recall이 어떻게 증가하는지 계산할 수 있다.
빨간선은 기존의 규칙 기반 접근 방식이고, 파란선은 개인화된 레이아웃의 결과다.
Other challenges
넷플릭스는 홈페이지를 지속적으로 개선하기 위해, 다음과 같은 질문의 답을 찾고 있다고 한다.
- 시간, 기기와 같은 다른 컨텍스트 변수를 고려하기에 적절한 시점은 언제인가?
- 최적의 페이지를 찾는 것과 계산 비용은 trade-off 관계에 있는데, 적절한 지점은 어떻게 찾을 수 있나?
- 처음 몇 세션이 중요한데, 이 시점에는 정확히 정보가 가장 적다. 홈페이지를 어떻게 구성할 수 있을까?
Leave a comment