article thumbnail image
Published 2021. 9. 29. 16:03

추천시스템

 

지속적인 피드백을 통한 선순환

 

추천과 검색은 다르다.

시나리오 시작이 다르다.

사용자는 자신이 찾고자하는 객체에 대해서 쿼리를 날린다.

 

사용자의 명시적인 요청자체가 필요가 없다.

아무런 요청을 날리지 않아도 내 의사와 상관없이 제공된다.

 

객체 자체를 특정하지 않은 요청이 있다.

대상에 대해서 지정을 하고 있지 않기 때문이다.

 

다만 선호의 개념은 있다. 얼마나 좋아하고 싫어하는지에 대한 개념은 있다.

 

추천 시스템은 사람들의 요청에 대한 의도가 검색 시스템과 정반대이다.

 

시나리오의 방향성 자체가 다르고 들어오는 쿼리자체가 다르기 때문에 해결하는 방법 자체가 다르다.


 

추천 시스템이란 사용자들이 좋아할만한 것들을 발견할 수 있도록 도와주는 시스템이다.

정보 검색과의 차이를 명확하게 알아야 한다.

 

사용자가 좋아할만한 대상과 그리고 그것에 대한 선호 값을 예측하는 것이다.

Rating value는 별점이나 평점이라고 생각하면 된다.

 

Rating matrix가 존재한다.

셀 안에는 빈 값도 존재한다. 

추천 시스템은 곧 셀 안의 빈값을 채우는 시스템이다.

즉 matrix completion을 해결하는 시스템이다.


추천 시스템은 랭킹 시스템이다라고 보는 사람도 있다.

맞출 필요가 없이 top-k를 뽑아서 사용자에게 제공하면 된다고 보는 사람이 있다.

 

랭킹 문제를 푼다라는 것은 사용자가 선호할만한 선호도를 직접 학습하고 그것을 기반으로 랭크 정보 자체를 사용자에게 제공한다라고 본다.

보통 이것을 top-k recommendation system 이라고 한다.

 


 

그럼 무엇이 좋은 추천 시스템인가?

검색 시스템의 가장 중요한 목표는 사용자에게 적합한 것을 전달하는 것이다.

하지만 추천 시스템은 여기서 멈추지 않는다.

 

Novelty, 즉 참신하다라는 생각이 들어야 한다.

예를 들어 과거에 내가 소비한 컨텐츠이긴 하지만 내가 까먹고 있다가 어느샌가 추천 결과물이 나오는데 이것이 포함되어 있는 것, 내가 예상하지 못한 것이 나오는 것

인기 순으로 추천해버리면 안좋다.

 

Diversity, 제공한 것들은 다양성을 가지고 있어야 한다.

 

Serendipity, 전혀 예상못한 컨텐츠가 나와야 한다.

 

모든 부분을 고려해야하는 것이 맞지만, 자신의 서비스에 맞는 곳에 집중을 해서 추천 시스템을 만들긴 한다.


 

 

추천시스템은 굉장히 실용적인 영역이다.

상위 20% 상품만 노출되고 대부분의 매출을 담당하게 된다.

나머지 Long Tail의 영역은 사용자에게 노출될 기회가 적었다.

그러나 인터넷이 생기면서 Long Tail의 영역에서 수익이 많이 발생하였다.

 

2018년에 15400개의 컨텐츠가 제공되고 있었다.

시간이 지나면서 훨씬 더 컨텐츠가 줄어들었다.

Long tail 을 고려하는데 왜 그럴까?

 

“우리는 컨텐츠 제작 회사이다, 테크 컴퍼니가 아니다.”

Long tail 보다도 킬러 컨텐츠 하나가 받는 돈이 훨씬 더 어마어마 하다는 것이다.


현재 추천시스템이 하는 역할은 과거와는 조금 다르다.

 

추천의 영역이 도메인에서 다루는 개체를 직접 추천했지만, 그런 것 외적인 서비스 전반에 관한 영역으로 추천된다.

추천되는 컨텐츠의 배치와 이미지도 고려된다.

 

또한 예전에는 고품질의 상품을 노출하면 사용자들은 알아서 잘 살거라고 생각되었다. 그러나 개인화가 되어 사용자에게 설득력을 가져야 한다는 Explainable의 개념이 생겼다.

결과물 자체를 사용자가 tuning 있어야 한다.


 

협업 필터링에서도 model-based 는 ML이나 DL이 많이 끼어들어서 활발한 연구가 되고 있다.


 

 


 

Contents-based는 직관적인 방법이다.

넷플릭스에 영화 검색을 하면 나오는 화면이다.

 

도둑들을 검색한 영화들 이지만 내용이 비슷하지 않다.

나머지 작품을 보면 비슷한 내용도 있고 전혀 다른 내용의 영화가 추천되어 있다.

 

도둑들과 아무런 관련이 없어 보이는 암살은 감독이 동일하고, 다수의 출연진들이 겹쳐있다.

따라서 랭킹을 해보면 굉장히 상위에 있다.

전우치도 마찬가지로 감독이 동일하다.

 

써니는 액션이나 출연진이 겹치지 않는다.

장르적인 테마적인 부분이 동일해서 추천이 되었다.

범죄의 재구성도 마찬가지이다.

 

다 잘못 나온 결과가 아니라 추천의 결과물이다.


 

왓챠도 마찬가지이다.

넷플릭스의 추천 영화와 겹치는 영화가 비슷하다.

검색을 잘못해서 나오는 결과들이 아니다.


 

네이버는 아주 공격적으로 감독과 출연진이 겹치는 정도에 따라서 

일관성이 없어보일 정도로 추천해준다.


 

Contents-based의 메인 아이디어는

A가 과거의 컨텐츠와 유사한 컨텐츠를 제공하는 것이다.

 

가장 중요한 것은 아이템의 유사성이다.

Item profile을 만든다.

우리가 추천해야할 대상을 어떻게 표현할 것인지 Representation을 만든다.

보통 item을 represent를 한다는 것은 아이템이 가지는 자질을 토대로 한다.

 

자질의 집합을 가지고 item을 표현하게 된다.

item의 피쳐들이 가지는 중요도에 따라서 가중치를 부여하게 된다.

Feature selection의 과정이 포함된다.

 

이를 토대로 각 아이템을 표현하는 Vector Representation을 만든다.

 

이것을 item profile을 구축한다고 한다.

각자의 feature의 개수가 dimension이 된다.


 

User Profile

사용자를 표현하는 방법도 사용자의 자질이 중요하다.

사용자의 자질은 사용자가 소비한 아이템으로부터 얻는다.

사용자가 소비한 item profile을 모두 취합하면 사용자의 profile을 얻을 수 있다.

이것이 사용자 representation이다.

 

그러면 사용자의 vector와 item vector 가 동일한 dimension을 갖는다.


 

사용자 벡터와 아이템 벡터를 하나의 vector space에 투영한다면 위와 같이 된다.

잘 되었을 경우에 비슷한 자질 set을 갖는 것들은 가까운 위치에 놓이게 된다.

 

사용자 주변에는 사용자 성향을 대표하는 주변의 컨텐츠들이 놓이게 된다.

보통 이것을 vector space model 이라고 하고 k-nearlist search로 본다.

 



직관적이지만 장점과 단점이 존재한다.

 

장점1. cold start 문제가 없다.

사용자와 아이템간의 interaction이 있어야 하는데 그게 없는 것이 cold start 문제이다.

컨텐츠 기반은 사용자와 아이템을, 아이템을 이미 가지고 있는 메타데이터로 정의하기 때문에 cold start 문제가 거의 없다.

왜냐면 사용자 profile을 만들기 위해서는 최소 한번의 컨텐츠 소비가 일어나야 하기 때문이다.

한번만 일어나도 추천의 결과물을 만들 수 있다.

 

장점2. First-rater problem

서비스의 최초 상품이 등록되면 이 상품에 대한 소비는 전혀 일어나지 않는다. 그 중 신규 아이템이 들어와도 사용자는 그 아이템이 있는지 조차 모른다.

그러나 컨텐츠 기반은 그런 것과 상관 없이 추천이 될 수 있다.

 

장점3. Explainable

사람이 인지할 수 있는 메타 데이터로 추천되기 때문에 explainable하다.

사용자가 추천 결과물이 왜 자신에게 되었는지 사용자에게 힌트를 주어야 한다.

그래서 눈치챌 수 있게끔 해준다 -> user acceptable

 

단점1. Feature Selection

가중치와 수많은 메타 데이터 중에서 아이템을 어떻게 표현해야 할지는 굉장히 사람의 손을 많이 탄다.

이것에 따라서 시스템의 성능이 천차만별이다.

 

단점2. Over-specialization

결과물 자체가 제한되어 있다.

자질이 비슷한 것 끼리만 만들어지는 결과물이기 때문이다.

Filter bubble : 100개의 아이템이 있는데 추천 시스템이 알아서 50개만 보여준다. 사용자는 나머지 50개를 볼 수 있어야 하지만 그럴 수 없는 정보 불균형의 문제가 있을 수 있다.



 

소개팅을 할 때 상대를 보자마자 “싫어요” 하는 것을 Explicit 하다고 한다.

“일 있어요.” 과연 부정적인 피드백인가? 확실하게 판단할 수 없지만 부정의 피드백일 수 있다. 이것을 Implicit 피드백이라고 한다.

 

Explicit 피드백은 좋아요, 댓글 창, 별점으로 평가 받을 수 있다.

의미있는 사용자의 피드백 

 

Explicit 한 피드백이 되려면 물건을 구매한 것 만으로는 안된다.

노래를 듣거나 영화를 보는 행위도 마찬가지이다.

모든 행위에 관한 피드백을 Implicit 피드백이라고 한다.


 

함부러 해석하면 어려운 데이터가 Implicit 한 데이터이다.

매우 조심해야 한다는 단점이 있다.

 

Explicit Feedback

굉장히 high quality를 가지는 데이터이다.

이것을 서비스에 적용하면 실패율이 거의 적다.

다만 획득하기 어려운 정보이다.

이것을 활용기엔 matrix가 굉장히 specific한 데이터이기 때문에 시스템을 구현하기 어렵다.

 

Implicit Feedback

덜 specific 하고 획득하기 쉽다.

하지만 아주 많은 단점들이 존재한다.

Negative 한 값이 존재하지 않는다.

모호함을 가지고 있기 때문에 Noise 값을 매우 많이 포함하고 있다.

잘 만든 시스템이라고 하더라도 근본적으로 에러 값을 가지고 있다.

그래서 매우 어려운 피드백 값이다.


 

동시간 대에 도깨비를 아내가 바람을 핀다가 더 많이 보았다.

그러면 도깨비보다 아내가 바람을 핀다를 더 싫어하는 것일까?

그러나 여기서 아내가 바람을 핀다를 더 싫어한다고 데이터를 확정지으면 안된다.

 

BTS 노래를 하루는 다 듣지도 않고 꺼버린다.

완곡 청취 비율이 50%되는데, 이 사용자는 BTS 다이너마이트라는 노래를 좋아하는 것일까 싫어하는 것일까?

 

그렇기 때문에 Implicit Feedback이 어려운 것이다.

 


 

내가 아닌 많은 사용자들이 아이템에 대해서 가지고 있는 의견을 이용해서 추천시스템을 만드는 것이다.

집단 지성이 파워풀 할 것이다라는 가정을 깔고 하는 것이 협업 필터링이다.

 


 

협업 필터링은 잘 작동하기도 하지만 매우 직관적이다.

기본적으로 2가지 방법이 있다.

Memory based 와 Model based 이다.


1. Memory based

특히 Memory based 라는 것은 협업 필터링 초기에 유행했던 방법들을 망라하는 것이다.

Neighborhood based 라고도 한다.

또 2가지로 나뉜다. User-User, Item-Item


1) User-User

추천을 하기 위해서 비슷한 사용자를 찾는다.

사용자와 사용자간의 유사도를 구하는 것이다.

 

A 라는 사용자의 벡터와 각각의 벡터를 통해 유사도를 구할 수 있다.

Cosine 유사도를 구할 수 있고 Pearson 유사도로 구할 수 있다.

 

Pearson 유사도

사용자가 가지고 있는 평균 값을 제하고 유사도를 구한다.

무슨 말이냐면 자신의 평균 평점 값을 빼고 나면 - 값은 부정의 피드백, + 값은 긍정의 피드백으로 해석할 여지가 있다.

그래서 긍정과 부정의 개념이 담긴 사용자의 벡터 표현을 가지고 유사도를 구하게 되면, 의미적으로 유사한 사용자를 뽑을 수 있다라고 판단하기 때문이다.

 

실제로 값을 다 구해보면 C라는 사용자와 유사한 사용자는 A와 B가 된다.


 

이렇게 비슷한 사용자를 찾고나면, User-User CF는 다음으로 비어있는 칸을 채우기 위한 평점 정보를 예측하게 된다.

평점 정보를 예측하기 위해서는 아래의 공식을 통해 예측하기 된다.

 

가장 유사한 사용자 A와 B를 통해서

C가 가진 1번 상품에 대한 선호도를 예측해 보자.

 

먼저 기본적으로 자기가 가진 평점정보 2.0를 가져오고,

각각 유사하다고 판단된 사람의 1번 상품에 대한 평점 1.5와 1.2에,

C와 비슷하다고 판단된 A와 B에 대한 유사도를 곱한 값을 이용해서

C가 1번 상품에 대한 평점 값을 예측하는 것이다.

 

나랑 비슷한 사람은 상품에도 비슷한 평점을 내릴 것이라는 가정이 깔려 있다.

그리고 그것에 대한 신뢰도 값은 나와 얼마나 닮았는지에 따라서 weight를 가질 것이다라는 것이 User-User CF 이다.

 


2) Item-Item

 

Item-Item 은 각각 Item 간의 유사도를 구한다.

유사도를 구하는 대상에 따라서 User-User와 방법이 갈린다.

 


 

 


 

장점은 역시나 Feature Selection이 없다는 것이다.

 

단점은 

Cold-Start 문제가 있다.

내가 유사한 사용자를 찾고, 유사한 아이템을 찾아야 하기 위해서는 어느정도 matrix가 채워져 있어야 한다.

 

그렇게 되면 매트릭스 자체가 Sparse 하게 되기 때문에 매트릭스를 모델링 하기 어렵게 된다.

 

사용자가 별점을 매기고 아이템이 소비가 되는 것이 Rating matrix인데 그렇게 되면,

Long tail에 대한 정보를 얻기가 힘들다. 인기있는 아이템으로 치우치게 된다.

 

그리고 이것은 숫자 놀음이기 때문에 이것 가지고는 직접적으로 이야기 하기 힘들 수 있다.

과정에 대한 것을 사용자에게 설명하기 어려운 방법이고 설득하기가 쉽지 않다.


3) Latent Factor Collaborative Filtering

 

사용자가 가지고 있는 알려져 있지 않는 정보, 공상 과학에 대한 선호가 있고 로멘스는 좋아하지 않는,

Latent factor(Rating matrix에서 들어나있지 않은 속성)

 

사용자가 영화에 별점을 매기기 위해서 Latent factor가 작용했을 것이다 라는 가정

이 상품 또한 사용자가 이 상품을 바라봤을때, 상품 자체를 바라보는게 아니라 이 상품이 가지고 있는 Latent factor 를 기반으로 해서 뭔가 별점이 주어졌을 것이다라고 가정하는 것이다.

 

 

별점은 사용자가 가지고 있는 Latent factor, 아이템이 가지고 있는 Latent factor, 

이것들의 내적이 만들어낸 값이 바로 저 별점이다라고 가정하는 것이

Latent Factor model CF 의 개념이다.


 

Rating matrix를 사용자의 Latent future vector P와 아이템의 Latent future vector Q로 분해를 할 수 있다고 한다면

 

 

 

반대로 역으로 Rating matrix의 결측값을 만들어낼 수 있는거 아닌가? 

라고 하는 것이 User/Item Latent matrix를 이용한 Model based CF의 개념이다.

 


 

SVD

X가 있다고 할때 

X는 3개의 행렬로 분해가 된다.

특히 가운데에 있는 행렬중에서 가운데에 있는 숫자들은 내림차순으로 정렬되어 있는데

정렬되어 있는 것 중에서 상위값만 취해서 이것들의 곱을 구하게 되면

 

원래 original 행렬을 복원할 수는 없지만 근사값을 갖는 성질을 갖게끔 복원할 수 있다.

 

SVD가 가정하는게 뭐나면 행렬이 다 채워져 있다는 것이다.

Recsys에 적용하려면 행렬이 달라져야 한다.


 

Missing value가 포함된 매트릭스이다.

SVD에 적용하려면 빈값을 채워야 한다.

보통 0을 집어 넣는다.

그리고 복원 작업을 하고, 복원된 값이 비어있는 칸의 예측값이 되는데,

 

가장 큰 문제는

예측값 자체가 - 가 될 수가 있다.

그러나 Rating matrix는 1점부터 5점까지 이므로 보통 -로 채워지지 않는다.

이렇게 오류를 내포하게 된다.

 


 

그래서 우리가 많이 들어본 Matrix Factorization이라는 모델이 나오게 된다.

비어있는 매트릭스(예측값)를 채우기 위해서 다른 정보를 사용하지 말고,

이미 관측된 값만 가지고 P, Q를 만들어보자 라는 것이다.

 

이말은 곧, P와 Q에 내적에 의해서 예측값이 만들어지는데

P와 Q를 내적한 값이 예측값이 되고, 결국엔 원래의 값과 예측값의 차이인 Loss를 최소화 하는 것을 찾는 것이 문제가 된다.

 

결국 Matrix factorization 모델을 Supervised Learning model로 바꾸었고

최적화 문제로 변환이 된다.

 

그러면 어떻게 최적화 할 수 있는가?

 

결국엔 P와 Q의 내적을 구하고, 그것에 대한 Error 값을 최소화하는 parameter를 찾는 것이다.


 

 


 

 

 

 

'💡 AI > RecSys' 카테고리의 다른 글

Surprise  (0) 2021.11.10
Item-Item Collaborative Filtering (Movie Dataset)  (0) 2021.10.29
Contents Based Filtering (Movie Dataset)  (0) 2021.10.05
연관분석  (0) 2021.06.16
복사했습니다!