본문 바로가기
내 맘대로 읽는 논문 리뷰/Recommendation

BERT4Rec

by 동석2 2021. 3. 18.

BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer

https://arxiv.org/pdf/1904.06690.pdf

 

본 논문은 작년 임베디드 수업에서 진행했던 추천 시스템 관련 프로젝트를 위해 읽은 논문이다. BERT를 추천 시스템에 결합한 모델인데, BERT에 관한 설명보단 어떻게 기존 추천 시스템에 접목했는지를 집중해보도록 하겠다. 즉 BERT에 대한 설명은 거의 없다. 따로 글을 적게 된다면 링크를 따로 추가하도록 하겠다. (BERT Relay 준비중)

 

Intro

예전부터 옛날의 기록, 경험에 비추어 행동을 하는 것은 좋은 방법이며, 역사를 공부하거나, 일기를 쓰거나 등의 행위는 전부 이에서 비롯된 행위일 것이다. 물건을 살 때도 마찬가지일 것이다. 닌텐도 스위치를 산 사람은, 차후에 관련 소프트웨어를 살 확률이 스위치가 없는 사람보다 배는 높을 것이다.

이러한 관점에서 sequential recommmendation은 발전해 왔고, 최근(논문 당시)엔 단방향으로 데이터를 분석해 추천하는 GRU4Rec같은 모델들이 나왔다.

하지만 이러한 단방향 모델들은, 순서를 고정적으로 학습하며 단방향으로 전파되기에 이전 item에 의존을 갖는다는 점에서 sub-optimal하다. 그래서 나온것이 bidirectional한 self-attention을 이용하는 BERT를 추천모델로 채택한 BERT4Rec이다.

실제로 BERT는 자연어처리 문제 해결에 자주 쓰이는 모델로, RNN,LSTM을 통해 문장 앞부터 뒤로 단방향으로 해석하는 모델만 있던 당시에 양방향 학습모델로 나와 아주 좋은 성능을 기록하고, 지금도 쓰이고 있다.

BERT4Rec은 BERT 모델을 학습에 사용함은 물론, BERT와 비슷하게 random item masking을 통해 모델을 학습한다. (Cloze task) 그리고 test 시엔 마지막 input에 [mask]를 추가하여 추천을 가능케 했다. 이 부분은 원 BERT와 거의 비슷해서, 아래 구현에선 차이점만 몇개 짚어볼까 한다.

 

Model Implementation

Sequential Recommendation의 input으로는 각 User의 chronological item data가 들어간다. output으로는 input 다음으로 올 item의 확률을 예측한다.

1(b)의 모델은 BERT랑 같으니 패스. L개의 transformer encoder를 이용해 bidirectional하게, distance-free하게 표현 학습한다는, BERT가 한 거지만 아무튼 추천에서도 이런 학습 때문에 RNN, SASRec들보다 좋다고 말하고 있다.

BERT와 달리 한 user안에서 item interaction을 학습해야 하기에, segment embedding은 빼었고 positional embedding도 learnable하게 만들어 학습했다고 한다.

그 외 모델 구현점으로는 GELU를 ReLU대신 사용했고, embedding을 I/O 둘다 같게 했고.. 정도다. 학습 역시 BERT와 같이 random masking을 이용하여 [mask] token을 맞추도록 학습하였다.

BERT와의 가장 큰 차이는 segment embedding을 뺐다는 점, 그리고 용도이다. 기존 BERT가 task-invariance하게 여러 task를 처리하기 위한 pre-training model이었다면 BERT4Rec은 end-to-end model로써 오직 추천 task를 처리하기 위한 모델이라는 점

 

Experiment

이제 BERT4Rec이 한 시계열 데이터 전처리/학습과정을 살펴보려한다.

우선 implicit feedback(1~5 = 0/1)방식으로 rating을 바꾸었고, 5평가 이상만 valid한 데이터로 보았다.

dataset 분할은 한 user sequence(t개의 아이템)에 대해 마지막 아이템을 test truth, 마지막 전(t-1) 아이템을 validation truth로 상정했다. 공정한 testing을 위해 negative sample(popularity 기준으로 뽑은 item들)을 testset에 섞었다. 곧 negativate sample을 ranking하는 문제로 치환하도록 했다.

학습 결과는 아주 좋았고, 또한 multi head attention의 효과로 layer, head마다 parameter가 달리 학습되는 모습도 볼 수 있었다.

아래 결과는 내 프로젝트 관련이다.

column은 max session length 기준이다.

나의 개인 프로젝트에서는 sequential 과 session-based 모델의 차이를 알아보고자 했는데, 내가 집중한 것은 학습한 sequence(session)의 길이였다. 두 모델의 차이로는 sequential model은 정말 많은 데이터들을 모두 학습하여 추천을 하는 모델이라면 session model은 아주 짧은 session만을 받아 추천하는 것으로 알려져 있다. 그래서 실제로 그렇다면 학습 때 주는 training session length에 대한 민감성이 다를 것이라 생각했다.

실제로 실험한 결과 정말로 그랬고, 이와 관련한 결과는 프로젝트 탭을 참고바란다.

다음 논문은 프로젝트의 연장선으로 meantime과, GNN을 조금 더 파보려 한다. BERT4Rec은 사실 리뷰할 게 없다. 다 BERT의 연장선이라.. 참 BERT도 대단한 것 같다. 모델부터 학습방법까지 차별화한 것이 놀랍다.

'내 맘대로 읽는 논문 리뷰 > Recommendation' 카테고리의 다른 글

Matrix Factorization  (0) 2021.04.05
MEANTIME  (0) 2021.03.24
Wide & Deep  (0) 2021.03.18
SR-GNN  (0) 2021.03.10