1. 서문
- 세 가지 중요한 잣대: Scale, Freshness, Noise
- Scale: 데이터가 매우 많으므로 scalability가 중요하다.
- Freshness: 새로운 비디오가 추가되었을때 추천에 바로바로 반영되어야 한다.
- Noise: 데이터의 sparsity, ground truth의 부재, 거의 항상 implicit feedback만 갖고있다, meta data가 엉망인 점 등을 고려해야함.
- 구현
- Tensorflow를 사용함
- 전체 시스템은 10억개정도의 파라미터 존재
- 트레이닝 데이터는 수천억개정도.
2. 시스템 개요
- 전체 구조는 (파란 블럭)
- 단계 1: 추천할 후보 비디오를 몇 백개 내외로 뽑아내고
- 단계 2: 다시 그 중에서 자세하게 순위를 매겨서 추천
- 이 과정에서 사용자의 이용 내역과 맥락을 감안합니다.
- 개발 과정은
- precision/recall/ranking loss등 offline에서 측정 가능한 것들을 일단 측정해서 어느정도 범위를 줄이고
- watch time, click-through rate은 A/B test를 거친다.
- A/B test 결과 (실시간 피드백)가 항상 offline 실험 (전체 히스토리를 retrospective하게 보고 평가하는것)과 일치하진 않는다.
3. 단계 1: Candidate generation
- 기존에는 Ranking loss를 이용한 Matrix factorisation [23]을 사용
- MF를 대체하기 위해 간단한 뉴럴넷을 사용한적 있었으며 이때는 사용자가 과거에 본 비디오 내역만 이용했었다.
3.1 Recommendation as classification
- 문제 정의
- 추천: 엄청나게 클래스가 많은 multiclass 분류 문제로 재정의 (Extreme multiclass classification)
- user, context가 주어지면 특정 시간에 이 비디오를 볼 확률을 구함. 즉,
- v_j : context embedding
- u: user embedding
- 이 학습 과정에서 사용자가 누른 '좋아요' 같은 정보는 사용하지 않고 비디오를 끝까지 봤는지/아닌지만 사용.
- Extreme multiclass classification 효율적으로 어떻게 구현?
- Offline에서는 (즉, 미리 계산)
- negative class를 샘플링 (i.e., skip-gram negative sampling)
- loss function으로는 각 class (비디오)마다 (binary) cross-entropy를 사용
- 대략 수천개정도의 negative sample 이용
- hierarchical softmax는 (이런저런 이유로) 사용하지 않음.
- at serving time (추천을 실시간으로 할때는)
- 드디어 사용자에게 추천을 N개의 비디오를 고르는 시간
- 기존에는 [24]처럼 hashing을 사용했고 이번에도 마찬가지.
- 최종적으로는 (위의 식처럼) dot-product space에서 가장 가까운 아이템 (nearest neighbour)를 찾는 과정.
- A/B test 결과 nearest neighbour 알고리즘간에 추천성능 차이는 없음
3.2 구조
- 사용자가 본 영상 내역을 embedding vector (좌측하단 파란색)로 바꿈
- 여러 영상의 embedding vectors를 평균내서 사용. (sum, component-wise max 등 사용해봤으나 평균이 제일 좋음)
- Fully-connected layer + ReLU 사용
3.3 Heterogeneous signals
- 개요
- 검색 내역 (그림의 하단 초록색)도 영상처럼 embedding을 구함
- 그 외에 사용자의 지역정보/기기 등 간단한 정보도 embedding을 구하고 이 값을 concatenate함.
- 성별, 나이 등 값은 [0, 1]로 바꿔서 넣음.
- "비디오의 나이" (example age)
- 새로 나온 비디오를 잘 보여주는것이 중요하다.
- 사용자가 얼마나 새로운 비디오를 선호하는지도 중요
- 트레이닝 데이터 특성상 머신러닝을 단순하게 적용하면 오래된 아이템들이 더 추천을 많이 받게 된다.
- 이를 해결하기위해 아이템(비디오)의 "나이"를 입력으로 넣어준다.
- 위의 그래프를 보면 아이템의 나이를 넣어주면 (빨강색) 업로드 직후에 사람들이 많이 감상하는 경향을 예측하고 있다.
3.4 Label and context selection
- 추천은 전형적인 "Surrogate problem"이다. -- 다른 문제를 통해 추천 문제를 해결할 수 있다.
- 예를 들어 영화 평점 예측 알고리즘은 영화 추천에 사용 가능.
- 그러면 유튜브에선 어떤 문제를 이용해야하는가?
- 학습 데이터: 잘못 만들면 추천엔진이 exploit >> explore 하게 된다.
- 유튜브 웹사이트를 통해 본 내역 말고도 온갖 소스를 통해 본 이용 내역을 전부 활용한다. 왜냐하면 유튜브에서 이미 추천 시스템이 있으므로 유튜브 웹사이트에서 감상한 비디오는 이미 추천 시스템의 결과에 치우친 데이터를 만들어내기 때문에.
- 데이터에서는 이용자별 영상 감상 횟수를 제한한다. 엄청나게 많이 보는 사람들의 영향을 빼기위해.
- 또, 추천 결과나 검색 결과를 즉시 활용하지 않는다.
- 검색 키워드는 일부러 순서를 날린 bag-of-tokens을 이용한다.
- 안그러면 방금 검색한 내용이 계속 메인 페이지에 떠서 짜증남.
- 유튜브 영상 감상 패턴: 매우 비대칭적이다.
- 비대칭적인 co-occurrence (or co-watch)
- 즉, 영상 감상은 순서가 정해져있음.
- 에피소드가 1-2-3-4.. 진행되는 경우는 물론이고,
- 음악의 경우에도 유명한 노래 --> 마이너한 노래로 가는 경향.
- 이 비대칭을 모델링하려면 offline 실험에서도 "과거"의 자료만 사용해야함 (그림 5-b)
- 실험결과 - feature and depth
4. 단계 2: 랭킹
여기에서는 더 많은 feature를 이용해 영상과 이용자의 관계를 구한다.
역시 deep neural network를 이용.
그리고 이 구조는 A/B test를 통해 계속 업데이트됨. 평가 잣대는 추천된 횟수 (=화면에 뜬 횟수) 대비 평균 감상 시간.
4.1 Feature representation
- 여기에서는 딥러닝을 통해 학습된 feature뿐만 아니라 hand-written feature를 사용.
- 대략 수백개정도의 feature 사용.
- 사용자의 이용패턴 - 특히 여러 종류의 정보가 어떻게 관계를 맺고있는지가 중요. 예를 들어,
- 이 채널에서 이 이용자가 몇 개나 되는 영상을 봤는지
- 마지막으로 이 주제의 영상을 본게 언제인지..
- 또, 왜 이 영상이 추천되었는지 정보도 활용한다.
- 또또또, 추천했는데 안보는 영상은 조금씩 순위를 깎는다.
- categorical features
- Top-N 영상 및 검색어를 embedding한다.
- 그 외의 것들은 0으로 놓는다.
- 영상 id, 사용자가 마지막으로 본 영상 id, 이 추천에 사용된 seed 영상 id 등을 전부 사용한다.
- 얘네들은 평균을 구하거나 하는게 아니라 별도로 network에 들어간다. [왜냐하면 다른 역할을 해야하니까!]
- continuous features 처리방법
- 값 x를 [0, 1]에 들어오도록 scaling해주고,
- x, x**2, sqrt(x) 를 다 넣어준다.
- 왜냐면 딥러닝은 입력 데이터의 pre-processing에 매우 민감한데 어떤 값이 가장 좋은지 알기 어려우므로. [이렇게 넣어주면 별도의 layer를 통해 제곱, sqrt()등의 비선형성을 학습하지 않아도 단일 레이어에서 가중치만 잘 주면 됨.]
4.2 Modelling expected watch time
- 감상시간: 안보면 0으로, 보면 본 시간대로 값을 넣어준다.
- (새로 정의한) weighted logistic regression을 사용한다.
- 감상한 영상을 감상 시간으로 가중치를 주는 것.
- 실험 결과
- (당연히) 더 크고 깊은 신경망이 작동을 더 잘함. 실제 상황에서는 서비스의 반응 시간이 느려질 수 있다는점 주의.
5. 결론
- 요 방법이 Matrix factorisation보다 좋다.
- 전체 시스템을 디자인하는건 거의 과학이 아니라 예술임.
- "영상의 나이"가 잘 작동한다.
- 단계 2의 세부 튜닝은 딥러닝보다는 전통적인 ML에 더 비슷하다.
- 특히 사용자의 과거 행동 패턴을 잘 설명하는 feature가 중요
- weighted logistic regression을 쓴것이 click-through rate을 쓴것보다 결과가 좋다.