[NAVER boostcamp AI Tech 5기] 4주차 학습 정리
1) 학습 내용 정리
드디어 나의 도메인인 '추천 시스템'을 공부하게 되었다.
첫 인상이 아주 좋다. 꽤나 재밌단 말이지 ?
앞으로도 잘 해 보자 ^-^
# 추천 문제 --> 랭킹 / 예측
- 랭킹 : Top K개 추천 --> 평가 지표 : Precision@K, Recall@K, MAP@K, nDCG@K
- 예측 : 선호도를 정확히 예측 --> 평가 지표 : MAE, RMSE, AUC
# 추천 시스템 성능 평가
- Offline Test
- 새로운 모델 검증 시 가장 우선적으로 수행하는 단계
- ML task에서 test data로 성능을 평가하는 것과 동일
- offline test에서 좋은 성능을 보여야 online serving에 투입
- 테스트 환경은 실제 서비스 상황과 다르기 때문에 serving bias 존재
- Online A/B Test
- Offline Test에서 검증된 가설/모델을 이용해 실제 추천 결과를 serving
- 추천 시스템 변경 전후의 성능을 비교하는 것이 아니라, 동시에 대조군(A)과 실험군(B)의 성능을 평가
- 현업에서는 모델 성능보다는 매출, CTR 등의 비즈니스/서비스 지표를 의사결정에 사용
# 인기도 기반 추천
가장 쉽고 단순한 형태의 추천 시스템
- Most Popula : 조회수가 가장 많은 아이템 추천 (ex. 뉴스 추천)
- Highly Rated : 평점이 가장 높은 아이템 추천 (ex. 맛집 추천)
# 연관 분석
- 추천 시스템의 가장 고전적인 방법론
- 연관 규칙 : 특정 사건 발생 시 함께 빈번하게 발생하는 또 다른 사건의 규칙
- 연관 규칙의 척도 : support, confidence, lift --> 유의미한 rule을 고르기 위해 lift 값을 많이 사용
# 컨텐츠 기반 추천 (Content-based Recommendation)
유저 x가 과거에 선호한 아이템과 비슷한 아이템을 유저 y에게 추천
- item profile 구축 : item의 다양한 feature를 TF-IDF를 통해 vector 형태로 표현
- user profile 구축 : 각 유저의 item list 안에 있는 item의 vector를 통합하면 user profile
- 두 벡터 간 유사도 구하기 --> Consine Similarity
- rating 예측 : 새로운 아이템과 기존 아이템들의 유사도를 구하고, 이 유사도를 가중치로 사용하여 유저가 가질 선호도(평점) 예측
# Collaborative Filtering (CF)
- Collaborative => 집단적 협업, 다수의 의견 활용 => 다수의 데이터가 축적될수록 협업 효과 UP
- 최종 목적 : 유저가 아이템에 부여할 평점 예측
- 주어진 데이터로 유저-아이템 행렬 생성 => 결측치(평점)을 예측해야 함
# Neighborhood-based CF(NBCF)
- 가장 기본적인 CF 모델이며, memory-based CF임
- User-based CF (UBCF) : 유저 간의 유사도 사용 ⇒ 타겟 유저와 유사도가 높은(highly correlated) 유저의 선호 아이템을 추천
- Item-based CF (IBCF) : 아이템 간의 유사도 사용 ⇒ 타겟 아이템과 유사도가 높은 아이템 중 선호도가 큰 아이템을 추천
- 한계 : Scalability, Sparsity => model-based CF 사용하여 해결 가능
# K-Nearest Neighbors CF(KNN CF)
- NBCF의 한계 : 모든 유저 정보 활용이 어려움 (속도, 성능 저하) => KNN으로 가장 유사한 K명의 유저만을 이용
- K는 하이퍼 파라미터
- 유사도 측정법 : MSD 유사도, Cosine Similarity, Pearson Similarity, Jaccard Similarity
# CF를 활용한 Rating Prediction
유저-아이템 행렬의 빈칸(평점)을 채우기 위한 예측!
UBCF, IBCF에 동일하게 적용 가능
- Absolute Rating : 절대적 평점 => 각 유저마다 점수 기준이 다르기 때문에 그 편차를 고려 X
- Relative Rating : Deviation(편차)을 사용해 예측
- CF를 통해 평점을 예측하는 것이고, 예측 평점이 높은 아이템을 유저에게 추천하는 Top-N Recommendation까지 해야 추천 완료!
# Model-based Collborative Filtering (MBCF)
- NBCF의 한계였던 sparsity, scalability 문제 해결
- 데이터에 내재한 패턴을 이용해 추천
- 현업에서 MF (Matrix Factorization) 기법을 많이 사용
- Latent Factor Model
- latent factor = embedding
- MBCF는 모두 latent factor, 즉 embedding으로 표현되는 모델
# Sigular Value Decomposition (SVD)
- MF의 기본 아이디어
- 2차원 행렬을 분해하는 기법
- 핵심 IDEA : Truncated SVD --> K개의 대표 특이치만으로 실제 R과 최대한 유사하게 복원한 값으로 예측
# Matrix Factorization (MF)
- MBCF의 대표적인 모델. 가장 중요!
- SVD와 유사하나, 관측된 선호도만 모델링에 활용함으로써 일반적인 모델을 만드는 것이 목표
- 기본 MF에 다양한 테크닉을 추가해 성능 향상
- Adding Bias / Adding Confidence Level / Adding Temporal Dynamics
# MF for Implicit Feedback
- Alternative Least Square (ALS)
- P(유저 매트릭스)와 Q(아이템 매트릭스)를 번갈아가며 업데이트
- SGD와 비교해, 병렬 처리를 통해 훨씬 빠르게 학습하고 sparse한 데이터에 대해 학습이 더 robust하게 잘 이루어짐
- ALS의 목적함수는 MF와 동일하며, 번갈아가며 업데이트 하는 것만 다름
# Bayesian Personalized Ranking (BPR)
- implicit feedback 데이터를 활용해 MF를 학습할 수 있는 새로운 관점을 제시
- 베이지안 추론에 기반, implicit feedback data만을 사용해 아이템 간 선호도 도출
- 최대 사후 확률 추정 (MAP : Maximum A Posterior)을 통해 파라미터 최적화
- LEARNBPR (Bootstrap 기반의 SGD)를 활용해 파라미터 업데이트
# Item2Vec
- IBCF를 하기 위해 아이템을 임베딩
- Word2Vec 학습 방법 중 SGNS(Skip-Gram with Negative Sampling)에 영감을 받은 기법
- 사용자 정보 없이도 아이템 간 관계 추론 가능
# ANN
- 주어진 벡터와 가까운 벡터를 근사적으로 찾는 방법
- 모델을 실제 serving 할 때 많이 사용
- accuracy와 speed의 trade-off => 이를 해결하기 위한 다양한 접근법 존재
# ANNOY (ANN Oh Yeah)
- spotify에서 개발한 tree-based ANN 기법
- 주어진 벡터들을 1차원 직선의 hyperplane으로 여러 개의 subspace로 나눠 tree 자료 구조로 구성 및 탐색
- 간단 + 가벼움 => 적은 데이터셋을 가진 추천 시스템에 빠르게 적용해 보는 경우가 많다
# Recommender System with Deep Learning
앞서 나온 추천 모델들은 선형 가정을 토대로 설계됨
=> 선형 가정은 모델을 단순하게 만들고, 표현력에 한계가 있다. 따라서 DL을 활용한다.
with MLP
- YouTube Recommendation 논문
- https://static.googleusercontent.com/media/research.google.com/ko//pubs/archive/45530.pdf
- 이 논문 이후 이를 레퍼런스 하는 실용적인 많은 모델이 등장. 추천 시스템에서 아주 중요한 논문! 나중에 따로 자세히 정리해 글 올리자.
with AE
- AutoRec : AE를 CF에 적용해 표현력은 UP, 복잡도는 DOWN
- rating vector를 입력과 출력으로 하여 encoder & decoder reconstruction 과정 수행
- 즉, 이 rating vector를 복원하는 task
- CDAE (Collaborative Denoising AE) : Denoising Autoencoder를 CF에 적용하여 Top-N 추천에 활용
- 한 유저의 모든 아이템에 대한 평점을 구해서, 이를 그대로 사용하지 않고
일정 확률에 의해 drop-out 하여 noisy하게 만듦 => 원래 데이터로 더 잘 복원하는 robust한 모델 학습 가능
- 한 유저의 모든 아이템에 대한 평점을 구해서, 이를 그대로 사용하지 않고
2) 과제
- 과제를 하면서 MF, ALS, NFC, AutoRec를 실제로 쓰려면 어떻게 써야 할지 감을 잡을 수 있었다.
- 꽤나 어려웠지만 그래도 할만 했다. 파라미터 사이즈를 맞추는 일은 항상 가장 어렵다.
- 심화 과제는 아직 쳐다보지도 못했다. 오늘 밤이나 주말에 해 보자!
- 과제를 하루 전날 시작해서 제출 직전까지 정말 조마조마 했다.. D
ata Viz를 나중에 들을 걸 약간 후회
3) 피어세션
다들 조금 지친 상태임에도, 여러 개의 스터디 모두 잘 참여해주었고 저번주보다 전반적으로 소통도 더 잘 된 것 같다.
나는 이번 주 전반적으로 스터디 방식에 대한 고민과 정리를 많이 한 것 같다.
스터디 rule이 명확하지 않다고 느껴 노션에 스터디 rule에 대해 정리해보았고,
회의 시간에는 앞으로 스터디 또는 피어세션 활동들을 어떻게 진행할지 의견 제안 및 정리를 조금씩 했던 것 같다.
멘토링 시간에는 AI를 공부하는 데 필요한 수학 개념들 (역행렬, pseudoinverse, symmetric matrix, spectral decomposition 등)에 대해 가르쳐주셨다.
또 피어세션 논문 스터디를 어떻게 진행하면 좋을지 조언해주셨고,
앞으로 진행될 대회에 대한 여러 가지 꿀팁들을 알려주셔서 아주 유익한 시간이었다.
4) 학습 회고
부캠을 시작한지 벌써 한 달이 지났는데 계속 이렇게 블로그에 학습 정리를 꾸준히 하고 있는 것,
그리고 일기를 쓰기 시작한 것에 대해 칭찬해주고 싶고
"느려도 꾸준히" 해내면서 끝이 안보이던 밀린 공부와 일들을 거의 끝낸 것이 가장 뿌듯하다.
아쉬운 건, 공부와 쉼의 경계가 거의 없었던 것이다.
이게 돼야 앞으로 건강한 부캠 생활을 할 수 있지 않을까 싶다.
공부할 땐 확 집중해서 공부하고, 쉴 땐 확 쉬어보자 ~~!