일지/네부캠 AI 4기(22.09.19~23.02.14)

20221212월-movie1,1~2강

제로타이 2022. 12. 13. 00:02

개요

추천시스템 개요
협업 필터링 내용. 이후 콜드 스타트 해결하는 fm. 초기 강의 같이 참고
시계열 추천. dkt연관성. 
개인화 추천.
케이스 스터디

대회에서 제시하고 있는 목표는 심화 이론 습득과 논문 이해 능력 함양이다. 저번 대회는 시계열, 그래프 모델에 대한 이해 및 구현이 초점이었는데, 이번에는 훨씬 큰 범주의 목표가 제시되고 있다.
강의 내용이 여태와 다를 가능성도 생각해보자.

다음에 시청할, 좋아할 영화를 예측한다.
암묵적 피드백 기반의 시계열 데이터. 그러나 일부가 누락됨. 현업에서의 비슷한 상황을 가정하고 있음. 단순 영화 시청기록만이 아니라 관련된 사이드 컨텐츠도 담김.
유저가 영화를 보는데 순서가 있다. 그러나 중간 중간 드롭아웃이 됐다. 그리고 우리가 예측하는 것은 유저가 가장 마지막에 보게 될 영화를 예측하는 것뿐 아니라, 중간 사이에 들어갈 영화(드롭아웃과의 연관성)도 예측한다. 
마지막 아이템만을 추천하는 기본적인 시계열 추천과 차이가 있다.

무비렌즈 데이터를 대회용으로 재구성했다. 그렇다면 원본 데이터가 있다는 것이다. 그러나 이는 엄밀하게 사용이 금지되어 있다. 또 예전에 내가 상상했던 한 문제씩 찍어 맞추기는 불가능하다(애초에 영화 추천이면 그게 어떻게 가능하냐).

데일리 스크럼

  • 랩업리포트 수정
  • 그래프 모델 포스네브 0으로 무한대나오는 값이 생긴다. — 승렬이가 보충해주면 좋을듯
  • 피어세션에 리트코드 코테 진행
  • 내일 할 것
    • 성훈이형의 어텐션 코드 수업
    • 혼공sql은 데이터베이스 공부와 분리하여 진행. 최대 진도는 6(인덱스)까지! 챕터 3까지 해올 것
    • 면접CS는 챕터 4(데이터베이스) 전체 데이터베이스 이후에는 네트워크, OS. 네트워크는 게시판 만들기를 병행하면서 하는 것도 좋을 수도 있음. 더미트래픽 아이디어
    • 서버 환경 세팅 같이 하기
  • 자료구조 & 알고리즘 공부
    • 리트코드 코테는 계속 진행
    • 전공 책을 통한 추가 공부는 부캠 끝난 이후
  • after 부캠. 코테 공부, 서류 준비. 대회를 나가는 것도 좋음. 그러나 엔지니어를 꿈꾼다면 대회가 필수적이지 않음. 엔지니어링을 위한 대회?
  • 영화 추천 대회
    • 테스트 데이터에 처음 등장하는 유저는 없음
    • 모든 유저에 대해 추천 진행

컬럼명 단일화. 저번 대회는 이름들이 이상했다. 범주형일 경우 _c붙이는 것은 분류에 도움이된다. 베이스라인 돌려서 성능 측정.

(1강) 추천 시스템 개요 및 대회 소개

추천시스템이란?
딥러닝 기반의 추천 시스템
영화 추천 대회

추천시스템

추천시스템: 사용자가  아이템에 부여할 평점이나 선호도를 예측하는 정보 필터링 시스템. 사용자가 사용할 아이템에 대한 제안을 하는 도구 및 기법. 사용자와 아이템 간의 상호작용을 다루는 기본적인 틀.
다양한 정의가 있지만 비슷한 개념들. 개인화된 서비스의 일종

사용자에게 새로운, 좋아할,  개인화된 컨텐츠를 제공하는 것이 바로 목적.
개인화 서비스는 다양하다. 추천은 물론이고 개인화된 교육도 가능. 개인화된 건강케어. 추천과 같은 테스크는 아니지만, 비슷한 방법론이나 전략을 구사하는 경우가 많다. 

기존 ML 방법론, 다른 task와 어떤 차이를 가질까?

선형 회귀로 추천시스템을 풀어본다고 쳐보자. 간단하게 이렇게 수식이 도출된다. 
그런데 이때 개인화된 추천을 위해 각 유저에게 이 식을 적용하게 된다면? 위에서 유저항은 사라지고 결국

해당 유저가 보지 않은 아이템 중에서 식을 극대화하는 아이템을 찾게 된다. 이는 결국 모든 유저에게 동일한 추천을 하는 결과를 낳게 된다. 비개인화되는 것. 
여기에 유저와 아이템의 상호작용을 고려하는 것도 가능하지만, 이는 경우의 수가 너무 많고 중요도 있는 피쳐를 구분하거나 선택할 수 없는 데이터인 경우도 있을 수도 있어 비효율적이다.

그래서 추천시스템은 유저와 아이템 간에 관계를 명시적으로 모델링하고자 한다. 각 조합의 상호작용을 모델링하는 것이 대체로 핵심적이다. 이를 위해 유저와 아이템을 인자로 가지는 관계 함수를 정의하고 이를 풀어나가는 과정을 거치게 된다. 
다양한 형태가 있을 수 있다. MF면 벡터의 내적, MBCF면 유사도 등
추천시스템 연구에서의 핵심은 1. 사용자와 아이템을 어떻게 더 잘 표현할지. 2. 어떤 형태의 관계 함수를 사용할지.

유저와 아이템의 상호작용은 집합이나 행렬로 표현된다.

통상적인 표현 방식.

이때 각 고유한 유저 아이디나 아이템, 평점 등 각각을 집합으로 만들 수 있다. 
대체로 집합 표현에서는 아이템과 유저로 묶는 게 일반적이다.
$I_u$유저 u가 소비한 아이템들의 집합, $U_i$아이템 i를 소비한 유저들의 집합. 
이러한 집합 표현은 아이템 간의, 유저 간의 유사도 계산을 할 때 매우 유용하다. 

행렬로 표현하는 방식. 왼쪽은 평점의 값을 넣어줬고 오른쪽은 상호작용 여부만을 고려했다. 명시적, 암묵적의 차이. 
각 행은 한 유저에 대한 표현이고 각 열은 한 아이템에 대한 표현이 된다. 

추천시스템은 크게는 협업 필터링(Collaborativ Filtering)과 컨텐츠 기반 추천(Content-Based)으로 나뉜다. CF는 대체로 유저와 아이템의 상호작용에 의존하고, CB는 아이템이나 유저의 속성 등의 사이드 정보를 추가로 활용한다. 
CF는 메모리 기반, 모델 기반으로 또 나뉜다. 
이건 전통적인 방법이고, 최근에는 시계열과 그래프적인 접근법으로 인해 완벽하게 이렇게만 볼 수는 없다. 

딥러닝 in 추천 시스템

최근 각광 받는다. 그 이유.
사용이 편리한 end2end 아키텍쳐. 여태는 각 도메인마다 손으로 피쳐 만들었으나, 그런 것을 모델이 알아서 잡는 경우가 많다. 그래서 편리함.
입력 데이터 타입에 맞는 모델을 쓸 수 있다. 이미지에 cnn, 시계열에 rnn. 이런 식으로. 
비선형 상호작용을 포착할 수 있다. 

.추천에서의 대표적인 딥러닝 모델. 임베딩하여 concat하고, 이를 mlp통과. 

이는 유저 아이템 행렬로, mf로 표현하던 것을 딥러닝 함수 f로 대체하는 것과 같다.

다른 사례. WDN. 로지스틱 회귀와 dnn의 결합. 
기억에 강한 모델과 일반화에 강한 모델을 결합한 것.  

collaborative metric learning.
관계 함수에서 내적하던 것을 유클리디안 공간으로 대체함.

유저가 좋아하는 것은 가까이, 싫어하는 것은 멀리 있게 하자는 것이 핵심 아이디어

오디오 시그널을 cnn으로 처리하여 음악 추천에 활용한 사례도 존재.

트랜스 포머 구조를 통해 시게열 추천을 한 케이스
self- attentive sequantial recommendation

딥러닝이 항상 좋은 것은 절대 아니다. 
해석이 인 된다. 예측에 설명력이 필요한 추천시스템에서는 마이너스 요소.
데이터가 많이 필요하다. 
하파 튜닝이 많은 시간을 들여야 한다. 

특정한 논문에서는 여태 발표된 논문 중에 제대로 재현되는 것이 없다는 것을 지적했다. 성능이 많이 떨어지는 경우도 있었다고 한다. 
관계함수를 고려할 때 그냥 단순한 내적 방법이 좋은 결과를 낼 때도 있었다. 
전통적인 방법들도 강하다는 것. 

왜 추천시스템에서 딥러닝이 이리 힘을 못 쓰는가?
데이터가 보편적이지 않다. 각 회사마다 모으는 데이터가 다른 경우가 있다. 그래서 대규모 데이터를 모으는 게 조금 힘들다. 그래서 빅데이터를 형성하기가 쉽지 않다. 회사마다 다른데, 회사가 잘 공개하지도 않는다.  
유저 선호도나 아이템 속성은 시간이 지남에 따라 변화한다. 
cv에서 10년 전 고양이 사진이나 현재 고양이 사진은 그래도 고양이로 분류할 수 있다. 그러나 추천은 그렇지 않다. 

영화 추천대회

그룹렌즈에서 내놓는 데이터. 영화 시청 이력을 user, item, time튜플 형태로 제공한다. 사용자 별로 좋아할 만한 영화를 추천. 
일반적처럼 마지막 아이템이 아니라 전체에서 일부를 랜덤하게 샘플링하여 test set으로 쓴다.  

평가지표는 recall@k.

 보통의 R@K는 K개를 추천해줬을 때, 유저의 선호를 기준으로 유저가 관심가진 추천 아이템의 비율을 말한다. 
분모는 유저가 선호하는 아이템의 수, 분자는 그러면서 추천된 아이템의 수. 
유저에게 10개를 추천하고, 이중에서 이게 유저의 선호에 맞는 게 몇개 되냐가 관건이다. 그리고 각 유저에 대해!
우리의 데이터는 실제로 유저가 본 영화를 드롭아웃시켜서 테스트셋으로 활용한다. 그러니 그걸 몇개나 맞췄냐를 보겠다는 것이다.

강의에는 솔직히 대회에 대한 설명이 전무하다고 봐도  무방.

sub_LB

리더보드 같은 것을 따로 둘 수 있을까에 관하여. min을 둠으로 인해 지표는 최대 1까지 나올 수 있게 된다. 
원래 우리의 처음 계획은 테스트 데이터가 정해진 기준에 맞춰 public 데이터 개수 만큼의 독립적인 validset을 두는 것이었다. 그러나 이번 대회의 경우에는 조금 문제가 있어보인다. 제출할 데이터가 31만개이다. public만 따지자면 이중에서 15만개만 빼내면 된다. 이는 유저마다 10개씩 데이터를 뺀다는 뜻이다.
두 가지 문제가 있다. 일단 데이터를 빼는 방식. test데이터는 두 가지 방식을 사용한다. 일단 일정 시점을 기준으로 데이터를 짜른 후에, 그 이전 시점에 대해서는 dropout을 한다. 그럼 나는 일정 시점을 언제로 걸어서 몇 개의 데이터를 빼야 하는가? dropout과 일정 시점으로부터 추출되는 데이터 간의 비율을 알 수 없다는 것이 첫번째 문제이다. test셋과 같게 뺄 수 있냐는 것이다.
두번째 문제는 그렇게 10개를 뺀다고 쳐도 이는 어떻게든 리더보드보다 낮은 값을 낼 수밖에 없다. 웬만해서 리더보드에서는 각 유저에 대해 10개 이상의 데이터를 추출했을 것으로 예상되기 때문이다. 그것이 사실이라면, 내가 만드는 sub_LB는 오로지 10개만을 통해 분자를 만들게 될 것이므로 실제 리더보드보다 더 각박한 조건하에 지표를 매기게 되는 것이다. 1부터 100까지의 수 중에서 10개를 뽑는다고 쳐보자. 이 10개의 숫자 중에서 20보다 낮은 수의 갯수보다는 아무래도 40보다 낮은 수의 갯수가 더 많을 것이다. 그러한 이치이다.

그렇다면, 애초에 검증셋은 어떻게 나누어야 하는가?

피어세션

피어세션은 대충 내가 서기이기 때문에 노션에 내용을 정리하고 있다. 그나저나 내일이 걱정이다. 서기를 잘할 자신이 없다. 오프라인에서는 너무 힘들던데..

(2강) Research Directions and Resources

연구나 참고할 수 있는 리소스. 새로운 아이디어 도입에 도움을 줄 수 있는 원천.

흥미로운 논문

Weighted Regularized MF

일단 들어가기 전에 MF. 사용자와 아이템 사이의 저차원을 학습한다. 명시적인 feature 없어도 잠재표현를 학습하기에 latent factor model이라 부른다.

유저의 선호, 아이템의 속성을 나타내는 두 차원으로 분해. 

최종적으로 각 latent factor를 내적하고, 편향을 더하여 원래 행렬을 만든다.  
mf는 두 가지 방법으로 다 쓰일 수 있다. 명시적 피드백에 대해서 평점 예측이고, 암묵적 피드백에 대해서는 랭킹을 나타내는 값이 된다. 전자에 대해서는 rmse를 쓰는데, 후자에대해서는 회귀나 분류 문제에 접근하는 식으로 목적함수를 꾸린다. 
대체로 후자의 방식이 최근에 다양하게 연구된다. 3강에서 또 자세히 다룰 것. 

MF에서 암묵적 피드백을 다룰 때는 대체로 각 원소에 서로 다른 confidence를 부여하는 식이다. 원래 목적 함수에서 c를 곱해주고 있는데, 이것은

이건 이렇게 생겼다. r은 사용자가 영상을 클릭한 횟수. 이걸로 가중치를 주는 방식인 것이다. 참고로 p는 암묵적 피드백이니 1 아니면 0이다.

Bayesian Personalized Ranking

bpr로 가보자. bpr은 사용자의 선호도를 두 아이템 간의 pairwise-ranking 문제로 바꾼다.
각 유저에 대해 아이템-아이템 선호 우위를 나누는 문제로 본다는 것.

각 사용자의 아이템 간 우열을 따지는 것. 즉, 개인화된 추천. 여태는 missing value를 0으로 처리했기 때문에 문제가 있는 것이다. 싫어해서 안 하는지, 못 봐서 안 하는지 모르잖냐, 그것을 해소하고자 하는 것. 

mf는 유저와 아이템을 한꺼번에 비교하나 bpr은 한 유저 안에서 두 아이템 간에 관계를 따진다. 
그리고 mse를 최적화하는 회귀에서 분류 문제로 바뀐다.
분류 문제에서 auc를 최적화하는 것과 bpr은 동일한 최적화 방향을 가진다. 
auc가 무엇이냐, 임의의 두 값이 주어졌을 때 맞는 쪽을 다른 틀린 쪽보다 정답에 가깝게 줄 세우는 게 핵심이지 않나. 마찬가지로 bpr 최적화도 임의의 관측된 아이템 i와 비관측된 아이템 j가 있을 때 i를 j보다 높게 두는 것이다.

부스팅모델에서의 classifier, regressor 문제와도 비슷한 부분이 없잖아 있다. auc 지표를 위해서는 값이 이진으로 나오면 안 된다. bpr도 그러한 접근을 하고자 한 것 같다. 관측과 비관측을 그냥 이진으로 두기 싫었던 것이다.

Factorizing Personalized Markov Chains

FPMC. mf와 마르코브 체인의 결합이다.

기존 mf에 아이템과 이전 아이템의 관계까지 모델링한다.  마르코브 속성이란 현재 시점의 상태가 바로 직전의 상태에 의해서만 영향을 받는 속성을 의미한다.

여기에서는 유저 별로 아이템에 대해 이러한 속성을 가정한다. 
예를 들면 이런 거다. 코믹 영화를 보고나면 그다음 호러 영화를 보고 싶은 사람이 있다. 어떤 사람은 그 이후에도 코믹을 보고 싶을 것이다. 이러한 방식으로 생각해서 접근하자는 것. 
이러한 마르코브는 상당히 놀라운 양태를 보일 수 있다. 직전으로부터 영향을 많이 받게 해준다. 

이전에 j란 아이템을 본 유저가 i를 추천받는 것을 맞추는 문제.
여태는 2차원의 행렬이었다. 유저와 아이템만을 고려하니까. 그러나 이제는 그 뒤로 한 층을 더 쌓아 텐서의 모양이 된다.

이 그림은 그림상으로는 두층을 나타내는 것이 아닌데.

그러면 이렇게 풀린다. 이걸 또 bpr에 넣어 최적화를 한다.

이 식은 가능도 부분의 식이다. 사전확률쪽은 규제항으로 작동하니까 이쪽이 바뀌는 게 맞는 것 같기는 하다. 
아무튼 바뀌는데 바뀌면서 유저와 이전 아이템의 관계를 고려하는 항이 사라진다. 

결과적으로는 fpmc가 fmc(유저 요소 없앰), 일반 mf보다 좋았다고 한다.
f@5기준
f-1스코어가 뭐냐. p와 r의 트레이드오프를 잘 통합해 정확성을 나타내는 지표. 조화평균을 사용한다. 

Personalized Ranking Metric Embedding

관계를 내적하지 않고 거리 지표로 사용하는 실험!  유저의 체크인 기록을 바탕으로 다음 방문할 곳을 예측하는 task를 가진다. 
위와 비슷하게 이전 위치를 고려한다.

가는 방향이 고려된다고 말해도 될 것 같다. 아무튼 내적 대신 거리를 잰다!

이것이 그 효과라고 한다. 내적일 때는 각도가 비슷한 것을 기준으로 삼지만, 거리를 이용하면 정말 거리를 활용한다. 

영화 추천의 예로 들어보자면, 액션 영화를 보는 유저에 대해 내적은 더 익스트림한 액션 영화추천이다. 어떠한 latent factor가 잡히면 그것에만 초점을 맞추게 된다는 것. 근데 거리를 기준으로 삼으면 그 요인에만 몰두하지는 않고 그러한 요인을 가진 다른 것들을 추천한다. 
locality를 고려하기에 음악 도메인에서 효과적이다. 인접한 유사 장르의 음악을 추천.
(그러면 게임에서도 너무 좋은 방법이다. 철권을 한다고 격투게임만 추천하는 건 말도 안된다. 비슷한 컨셉, 분위기를 가져가는 다른 장르의 게임은 충분히 각광받을 것이다.)

방금 전까지의 것들을 정리.

추천시스템 평가 지표

accuracy와 관련한 것들을 보자.

평점 예측 문제는 명시적 데이터에 대해 쓰인다. 이럴 때는 쉽게 rmse를 쓸 수 있다. 

그러나 top k 랭킹 문제는? 암묵적 피드백을 예측할 때 사용된다.  이쪽은 회귀나 분류쪽으로 접근은 하되 평가는  topk방식으로 이뤄진다. 
예측 자체는 평점 예측과 비슷하지만, 호환성 점수를 내린다.

얘들은 상위 k개 중에 예측이 성공한 것들을 따진다.

이쪽은 순위를 고려하는 예측이다.

리소스

관련되는 학회. 대체로 학회 위주로 돌아간다고 한다.

라이브러리와 데이터셋

BPR: Bayesian Personalized Ranking from Implicit Feedback

이 부분은 위의 내용을 더 극진히 이해하고자 선행으로 다시 공부한 것이다. 어차피 나는 이거 단시간에 이해는 못 한다. 그래도 눈에 익힐 수는 있을 것 같아 시간 투자해봤다.

mf와 knn은 개인화된 랭킹 추천을 구하는 대표적인 방법이다. 이에 맞는 새로운 bpr opt, 최적화 기법을 제공하는 것. 
이걸로 mf, knn 적용하면 훌륭하다는 것을 증명하는 것이 목표인 논문.
베이지안 추론에 기반한 최적화 기법, BPR-Opt제시하고, 이를 최대화하기 위한 알고리즘을 제안한다. 이후 이것이 성능이 우수함을 보인다.

암묵적 피드백 데이터는 이진 타입이다.여기에서 랭킹을 매긴다는 것이 뭘까? 어떤 아이템을 다른 어떤 아이템보다 좋아하는 것을 고려하는 것.
암묵적 피드백은 부정적 데이터가 관측되지 않는다. 싫어서 안 고른 건지, 몰라서 안 고른 건지 모른다. 

각 유저별 아이템 선호 차이를 구해보자.

i,j는 아이템. 잘 읽어보면 어느 정도 당연한 것들.

암묵 데이터는 진정한 부정 피드백과, 결측값의 차이를 잘 받아들여야 하나, 기존의 방식은 그냥 단순하게 0으로 치부해버린다. 이러면 뭐냐, 구매할 지도 모르는 아이템조차 0으로 만든다. 

그래서 이걸 이렇게 해결한다. 각 유저에 대해 아이템-아이템 행렬을 만드는 것. 
일단 가정을 둔다. 관측 비관측 사이에는 선호관계가 있는 대신 같은 넘들끼리는 선호강도를 모른다.

순서는 이러하다. 이제 저렇게 만들어진 행렬로 학습을 진행한다.

이제 이걸로 BPR을 구해보자. 베이지안 최적화란? 최대 사후 확률 추정을 말한다.

이후 수식적으로 이해를 하려고 시간을 좀 들였는데, 어느 정도 느낌은 오는데 세세한 수식이 이해가 잘 가지 않는다. 특히 가능도 구하는 부분이 내가 보기엔 너무 이상한데, 이건 도움을 좀 받아야 할 것 같다.

여튼 이것이 최대화가 되면 좋다는 것이다. 참고로 여기서 p와 q는 mf문제라서 나오는 것이다.

업데이트는 요래 한다.
이때 무조건 sgd로 한다. 왜냐? 관측 집단과 비관측 집단의 개수 차이가 심하다. 대체로 관측 집단 수가 적다. 이는 관측과 비관측의 쌍을 지을 때 관측 집단을 가지는 항이 매우 늘어난다는 뜻이다. 그래서 한쪽이 기울기를 지배하는 꼴이 난다. 그 비대칭성을 해소하는 것이 sgd. boostrap sampling을 통해 랜덤한 선택을 하기에 해소된다. 

이렇게 mf에 대해서 만드는 방법이 나왔다. 그럼 knn에서는?

이런 모양이라고 한다.

회고 및 다짐

저번 대회에서 아쉬웠던 것들. 빠르게 처음을 훑으려다 놓쳐버린 것들, 뚝심 있게 밀어붙치지 못한 것들, 더 다양하게 찾아보지 못한 것들, 계획을 세우지 않았던 것들, 정리를 제대로 해두지 않았던 것들. 
다 고치고 싶다. 다 고치는 것은 힘들겠지만, 그래도 최대한 개선해보고 싶다. 
근래에 여유가 없음이 느껴진다. 중요한 자산을 잃으면 안 되는데, 자꾸 조바심이 나려고 하는 것 같다. 이걸 의식하고 당분간 지내야 할 것 같다. 그럼에도 할 수 있다. 그럼에도 나를 밀어붙여야 한다. 그때 한번 고지를 넘을 거다.

'일지 > 네부캠 AI 4기(22.09.19~23.02.14)' 카테고리의 다른 글

20221214수-movie3  (0) 2022.12.14
20221213화-movie2, 오프라인  (0) 2022.12.13
20221207~8수목-dkt마무리  (8) 2022.12.08
20221206화-dkt17  (0) 2022.12.07
20221205월-dkt16  (0) 2022.12.06