페이지

2021년 6월 17일 목요일

영화 스트리밍 플랫폼 추천시스템은 어떻게 동작할까?

 데이터로부터의 특성(feature) 이해

머신러닝에서 문제를 해결하는데 데이터로부터의 특성을 이해하는 것이 중요하다는 것을 다시 강조하고 싶다. 이전까지는 데이터들로부터의 특성을 사람이 개입하여 일일이 규칙을 규정해 온 반면, 딥러닝은 사람의 개입없이 이러한 특성들의 규칙을 훈련을 통해 판별할 수 있다. 추천시스템은 특성들의 규칙을 훈련을 통해 자동으로 판별하는 장점을 십분 활용하는 대표적 예이다. 넷플릭스 같은 영화 온라인 스트리밍 플랫폼에서 사용자의 관람 이력을 바탕으로 새로운 영화를 추천하는 시스템은 어떻게 동작하는지 기본적인 원리를 살펴보자.

 , 이제 넷플릭스나 왓챠와 같은 영화 스트리밍 플랫폼에서 관람한 영화에 대한 평점을 아래 그림 1처럼 4명의 사용자가 평점을 1점부터 5점까지 부여했다고 가정해보자.

 


<그림 1. 영화 별 고객 평점>

데이터 분석

 우선 아래 그림 2와 같이 영화 별 고객 평점에 대한 데이터를 관찰해보면 몇 가지 특징이 눈에 띈다.

청색 화살표 ①에 표시된 영화1과 영화4 열의 고객 별 평점이 같은 패턴을 가지고 있다.

적색 화살표 ②에 표시된 2,3,4 행들의 관계를 보면 2+3행 = 4행이다.

초록색 화살표 ③에 표시된 관계는 (영화2+ 영화3)/2 = 영화5열 인 것 등이다.


<그림 2. 행 과 열 간의 상관관계>          

위의 ①의 관측으로부터, 영화1과 영화4는 같은 특성을 가진 영화라고 추측할 수 있고,

②의 경우는, 아마도 Dan Bill Chris 가 본 영화 요소의 특성이 가미된 영화를 선호한다고 추측할 수 있겠다. 예를 들면, 로맨스이면서 액션이 가미된 영화.

문제의 정의

자 그럼, 우리가 살펴보려고 하는 문제를 생각해보자. 이와 같은 사용자들의 영화에 대한 평점에 기반해서 아래 그림 3과 같이 Chris의 영화5에 대해 평점을 예측할 수 있을 것이다. 이 예는 Amy와 같은 패턴을 기반으로 조심스럽게 1 이라는 평점을 예측해 볼 수 있다. 만약 영화 평점에 대한 정보가 이것보다 많이 누락되었다고 하면, 우리는 어떻게 영화평점을 예측하여 사용자에 대해 선호하는 영화를 추천할 수 있을까?

머신러닝으로 접근하는 시각에서 본다면, 어떻게 이러한 상호관계 들로부터 내재된 규칙(의존성)을 판별할 수 있을 까가 아닐까?

<그림 3. 영화 평점의 예측>

특성(feature)의 도입

사용자가 영화에 대해 구분되는 선호도를 보이는 여러 요소들이 있겠지만, 이해를 쉽게 하기위해 이 중에 아주 간략하게 영화 장르 특성을 도입해 보겠다. 아래 그림 4처럼 5개의 영화에 대해 그리고 사용자별로 로맨틱과 액션이라는 영화 장르로 범주를 구성했다고 가정하자, 왼쪽의 영화 별 평점은 영화제공 공급 사측에서 제공하는 가중치일수도 있고, 사용자들의 영화평으로부터 추출한 영화장르라고 가정하자. 그리고 물론, 영화 장르도 이것보다 많을 수 있고, 그 외 주인공이나 최신작 여부 등 특성으로 고려할 요소는 많지만 일단 영화 장르로 단순화해보자.

 우측의 사용자별 장르 특성은 각 사용자가 어떤 장르의 영화를 선호하는지를 1은 선호, 0은 비선호를 표시한다고 가정하고,


<그림 4. 특성의 범주>

협업 필터링

Matrix factorization(MF, 행렬인수분해)는 추천 시스템에서 사용되는 협업 필터링(CF, Collaborative Filtering)중 대표적인 알고리즘이다. Matrix factorization 알고리즘은 아래 그림 5와 같이 사용자-항목 간 상호작용 행렬을 두개의 저차원의 정사각형 행렬로 분해해 작동하게 표시된다. 협업 필터링은 넷플릭스가 주최한 2006년 추천 시스템 경진대회에서 우승한 팀이 채택했던 기술로 추천시스템 내에서 가장 널리 쓰이는 방식이다. 개개인의 선호도와 제품의 컨텐츠 등을 고려하는 컨텐츠 필터(Content Filtering)와 달리, 사용자들의 평가, 피드백을 기반으로 추천하는 것을 말한다.


<그림 5. 행렬 인수분해>

이러한 Matrix Factorization 은 아래 그림 6와 같이, ①의 2000 사용자 X 1000개 영화 항목으로 구성된 2백만개의 항목을, 둘러싼 두개의 직사각형 즉, 위쪽의2000 사용자 X 100 특성 = 20 항목과 왼쪽의 100 특성 X 1000 개의 영화 = 10만개 항목으로 표시할 수 있게 해준다. 이는 2백만개 항목이 저장될 공간을, 20만개 와 10만개간의 행렬 내적(dot product)을 통하여 표시할 수 있게 한다는 점에서 정보 저장 공간의 절약의 이점을 제공한다.


<그림 6. 행렬 인수분해의 이점>

어떻게 적절한 인수 분해(factorization)를 찾을 수 있을까?

 자 이제 머신러닝이 이러한 인수 분해 요소를 어떻게 적절히 찾는가를 살펴보자. 아래 그림 7과 같이 머신러닝이 ①과 ②에 임의의 행렬 초기 값을 가지고 시작한다고 가정해보자. 좌측의 Amy 사용자의 영화1 값이 ③과 같이 행렬 내적(dot product)를 통하여 1.44 라는 값을 가지게 된다. 머신러닝은 우측의 Amy 사용자의 영화1에 대한 평점 3과 방금 계산된 1.44를 비교하여 손실(loss)차가 있음을 파악하여 좌측의 그림처럼 1.44를 증가시키기 위해 ①번의 F1F2를 조금씩 증가하고 동시에 ②번의 F1F2도 조금씩 증가해본다. 이렇게 결과치(이 경우에는 우측 붉은색 원 안의 3)와 좌측 인수분해 값들의 약간의 증가분의 비교를 반복적으로 행하면서 우측의 행렬의 값들(결과값), 좌측의 ①과 ②의 행렬 인수분해 값들 간의 차이를 최소화해가는 과정, 즉 훈련을 행하게 된다.

<그림 7. 인수분해 값을 찾기 위한 훈련>

행렬 인수분해(Matrix Factorization)

 위와 같은 훈련을 통해 아래 그림 8과 같은 인수분해 값을 최종적으로 얻었다고 하자. 머신러닝은 이제 ①의 영화 별 행렬(M1, M2…)에 두개의 특성(Feature) F1F2, 그리고 ②번 사용자 행렬의 두개의 특성 F1F2 들로부터 우측 아래의 사용자별 영화들M1,M2..M5까지의 평점에 대응하는 인수분해 행렬을 찾은 것이다. ②번의 경우, Amy 사용자 옆의 10 Amy F1 특성은 선호하고 F2는 비선호 함을 나타낸다.

여기서 F1 F2를 머신러닝에서 하이퍼파라미터라고 한다. ③번의 벡터의 내적(dot product)를 통하여 ①과 ②의 인수분해 행렬로부터 우측의 최종 결과 값 3을 나타냄을 본다


<그림 8. 행렬 내적>

영화추천

 위의 그림 8과 같이 M1~M5 까지의 영화와 4명의 사용자에 대한 행렬 인수분해 가중치 값을 훈련을 통해 획득했다고 하면, 아래 그림 9와 같이 사용자별 영화에 대한 평점이 비어 있는 상태에서의 평점을 예측 가능하다. 예를 들어, Dan의 경우에 영화2와 영화 4, 영화5을 관람한 평점을 기준으로 영화를 추천한다면? 이는 현실에서는 사용자가 모든 영화를 관람하기 어렵기 때문에 행렬 인수분해를 통해 획득된 가중치를 이용하여 그간의 사용자들의 관람 이력을 토대로 영화 추천을 한다는 점에서 협업필터라고 부른다.

DanM1에 대한 예측은 ①과 ②의 벡터 내적으로 ④와 같은 값으로 4를 갖게 된다.

DanM3에 대한 예측은 ①과 ③의 벡터 내적으로 ⑤와 같은 값으로 5를 갖게 된다.

따라서 Dan의 영화 추천은 가장 높은 값인 5, M3를 다음 영화로 추천하게 된다.

<그림 9. 영화 평점 예측>

결언

 이상으로 사용자들의 영화 관람 평점 이력으로 영화를 추천하는 시스템은 어떻게 동작하는 지를 살펴보았다. 많은 사용자들이 수많은 영화들을 관람하거나 평점을 남겨 준 이력들을 기반으로 딥러닝 머신은 학습을 통하여 특성(feature)들을 추출해 낸다. 우리가 살펴본 예에서는 F1 F2 라는 2가지 특성(feature)의 형태로 값을 가지게 되었다. 훈련을 통해 영화 별 그리고 사용자별로 발견한 F1, F2 특성 값을 바탕으로 행렬 인수분해를 활용하여 비어 있는 사용자의 영화평을 예측할 수 있었고 이를 기반으로 그 사용자가 다음에 추천 받을 영화를 예측할 수 있었다