submit : Sun, Fei, et al. ACM (2019)
paper : https://arxiv.org/abs/1904.06690
repo : https://github.com/FeiSun/BERT4Rec
이 논문은 BERT에 대해서 미리 아시면 좋습니다.
0. Abstraction
추천 시스템이란 유저가 좋아할 만한 상품(영화,도서 등)을 추천하는 것을 일컫습니다. 오늘 날에도 우리의 실생활에서 쉽게 볼 수 있는 추천 시스템은 기업에게 아주 좋은 실적을 보여줍니다.
- 아마존 : 상품 판매의 1/3이상이 추천에 의해 발생합니다.
- Google News : 1/3이상의 조회가 추천에 의해 발생합니다.
- 넷플릭스 : 시청 상품의 ¾이상이 추천에 의해 발생합니다. 또한 Netflix Prize라는 대회를 열어 SVD(Singular Value Decomposition), ensemble의 중요성 등이 부각할 수 있었습니다.
- 페이스북 : 친구추천. 친구추천은 서로의 교류를 증대 시킬 목적을 가지고 있기 때문에 Link Prediction이라는 것에 중점을 두고 있습니다.
추천 시스템에서 유저의 역동적인 선호도를 모델링하는 것은 매우 중요합니다. 기존에는 순차 신경망을 사용하여 유저의 과거 상호 작용을 왼쪽에서 오른쪽으로 인코딩하여 hidden presentation으로 사용했습니다.
그러나 논문의 저자는 기존의 왼쪽->오른쪽 방향으로 단방향 모델을 사용하는 것은 최적이 아니라고 주장합니다. 이유는 다음과 같습니다.
- 단방향 아키텍처는 사용자의 행동 순서에서 숨겨진 representation을 제한합니다
- 실용적이지 않은 엄격한 순서를 가정합니다.
그래서 여기서 BERT4Rec이라는 모델을 제안합니다. 이는 사용자의 행동 시퀀스를 모델링하기 위해 deep한 양방향 self attention 모델을 사용합니다.
1. Introduction
기존에는 RNN을 이용해 item들의 sequence를 이용해 next item을 예측했었습니다. 여기서 저자는 BERT에서 Masked Language Model을 활용하여 next item을 예측하는 BERT4Rec 모델을 제안합니다. BERT4Rec 모델은 기존의 다른 모델에 비해 향상된 성능을 보여줍니다.
2. Related Works
(1) 추천 시스템의 시작 : interaction matrix
추천 시스템의 데이터는 어떻게 생성할까요? 우리가 알고 있는 이미지, 텍스트 분류를 먼저 보겠습니다.
이미지 분류를 할 때에 우리는 비행기, 자동차와 같은 여러 이미지들을 모아 같은 라벨을 갖는 것끼리 모읍니다. 텍스트 분류 역시 여러 텍스트를 모아 positive/negative/neural와 같이 분류하여 학습에 사용합니다.
추천 시스템의 데이터 구축 원리는 간단합니다. 어떠한 유저가 어떠한 아이템에 대해 어떤 피드백을 남겼는지를 주시합니다. 이는 곧 어떠한 유저가 어떠한 아이템을 선택했으니, 그 다음엔 어떠한 아이템을 선호할 것이다를 의미합니다. 어떤 피드백이란 특정 상품을 봤다/안봤다, 0-5점의 평점, 더 쉽게는 click 유무로 유추할 수 있습니다. 이러한 정보를 이용해 하나의 저차원 matrix를 생성합니다.
(2) Matrix factorization의 등장
그러나 보통이라면 user, item에 대한 수가 너무 크기 때문에 matrix는 매우 sparse해집니다. 그래서 이 sparse한 user-item matrix를 저차원의 user-item matrix로 분해하기로 합니다.
이는 후에 딥러닝에 적용하게 됩니다.
(3) NCF(Neural collaborate filtering)
User-item feedback을 바탕으로 구축한 user-item을 곱으로 표현하면 각각 user matrix, item matrix를 얻을 수 있습니다.
$(N*M) -> (N*K) X (K*M)$
방법은 다음과 같습니다. 매우 sparse한 matrix 하나를 비교적 dense한 matrix 두 개로 나눕니다. 이는 각각 user matrix, item matrix라 표현합니다. 일반적으로 user의 수(N)와 item의 수(M)는 엄청 크고 K는 상대적으로 작은 수로 잡습니다.
이 두 개의 매트리스를 곱했을 때 원래의 user-item matrix와 비슷하게 되도록 학습합니다. 이를 바탕으로 특정 유저, 아이템에 대한 K차원의 dense한 feature를 뽑을 수 있습니다. 이렇게 user matrix, item matrix를 나누는 이유는 확인되지 않은 matrix를 추정하고자 하는 의도도 있지만, user의 feature, item의 feature를 추출하기 위한 목적도 큽니다.
(4) VAE-CF
다음으로 등장한 VAE-CF입니다. Autoencoder 기반으로 user vector를 학습합니다. User가 item을 소비했다/안 했다(1/0)를 나타내는 input vector를 준비하고, 유저가 전체 아이템에 대해 어떠한 피드백을 줬는지를 다시 복원합니다. 이는 인코더, 디코더를 통해 다시 복원하면서 loss를 통해 중간에서 dense한 feature를 학습합니다. Movie lense라는 Dataset에서 가장 좋은 성능이 이 VAE 방식입니다.
그러나 이는 유저가 아이템을 어떠한 순서로 소비했는지, 최근에 소비한 아이템은 무엇인지를 알 수 없습니다.
1) 지난 11개월 동안 A는 90편의 로맨스 영화를 봤습니다. 그리고 최근 1개월 동안에는 공포 영화를 10편을 봅니다. 그렇다면 그 다음에 추천해야 할 영화의 장르는 무엇일까요?
2) 황금 연휴, A는 마블 시리즈 10편을 달리기로 했습니다. 오늘 날까지 1-3편을 보았습니다. 그렇다면 그 다음에 추천해야 할 영화는 몇 편인가요?
VAE는 시간을 학습하지 않기 때문에 위와 같은 예시에 사용하기엔 적절하지 않습니다. 이를 해결하기 위해 Item2vec이 등장하였습니다.
(4) item2vec
Word2vec은 주변 단어를 보면서 가운데 단어를 추정하는 식으로 word의 vector 표현을 학습합니다. (CBOW 기준) 여기서 word 대신 item의 id로 대체하고, 같은 방식으로 학습하면 item의 feature를 학습할 수 있습니다. token 대신 item id를 넣으면 gensim으로도 간단히 구현 가능합니다.
이를 사용하면 NLP의 환경을 그대로 추천시스템으로 가져와서 학습할 수 있습니다. 또한 Word2vec도 단어의 위치를 고려하고, item2vec도 item의 위치를 고려하는 만큼 어느 정도 시간의 순서를 고려해서 학습된다고 볼 수 있습니다.
(5) Sequential Recommendation
그 후 등장한 Sequential Recommendation은 RNN을 이용하여 sequential한 history를 학습할 수 있게 했습니다. 위 그림을 보면 유저의 history를 보고 ABCD 봤을 때 recommendation model 과 같이 다음 아이템이 뭔지 찾는 방식입니다. Token 대신 아이템을 집어넣고 문장 대신 유저의 Action 을 집어넣습니다.
최근에는 Transformer를 이용한 방법도 나오고 있습니다. Token 대신에 item, 문장 대신에 item을 소비한 sequence로 대체하는 방식입니다.
3. Method
(1) BERT
맨 마지막 단어를 예측하는게 아닌 Masking한 단어를 학습하는 구조입니다. 전체 Sequence의 표현을 학습하기엔 좋지만 sequential recommendation처럼 다음 아이템 예측엔 적합하지 않습니다.
(2) BERT4Rec
저자는 다음과 같이 모델을 설계했습니다.
우선 BERT는 language model을 위한 모델이 아니라고 했습니다. Sequential recomandation처럼 마지막 token을 예측하는데 유용한 모델은 아니기 때문에 Inference할 때 마지막 token에 <MASK>를 붙여서, 마지막 item을 예측할 수 있도록 했습니다. token대신 item_id를 이용하여 BERT를 학습하였습니다.
또한 Next sentence loss, segment embedding을 사용하지 않고 Masked Language Model만 사용했습니다. 이는 BERT 사용 이후 NSP loss를 사용하지 않는 연구가 많이 나오고 있기 때문입니다. 또한 추천 시스템은 단락이라는 개념이 없고 한 유저의 item 소비 순서와 다른 유저의 item 소비 순서는 전혀 연관이 없기에 이러한 방식을 사용했다고 합니다. 이 모든 과정은 End to end 형식으로 변경되었습니다.
4. Experiments
(1) Dataset
여기서 Density는 유저아이템의 수에 비해 interaction이 얼마나 있는가를 나타냅니다. 작을수록 유저의 아이템은 많은데 interaction이 적다는 것을 의미합니다.
- Amazon Beauty
- Steam dataset
- MovieLens
(2) evaluation
추천 시스템에선 실제로 어떻게 동작하는지 평가하는지가 매우 중요합니다. 전체 데이터 중 일부만 사용해서 학습하고, 나머지 데이터와 얼마나 유사하게 예측하는지 평가합니다. 검색 시스템에서 많이 쓰는 Hit@k, NDCG@k를 이용해서 평가했습니다. 추천 시스템도 검색과 같이 유저에게 노출되는 item 개수가 정해져 있기 때문입니다.
$DCG_n = \frac{\sum^n_{i=1} rel_i}{log^{i+1}_2}$
$NDCG_n = \frac{DCG_n}{IDCG_n}$
- HR@k : 내가 추천한 상위 k개 아이템 중 next item이 있는 비율
- NDCG@k : 내가 추천한 아이템들의 상위 점수/k개 아이템의 이상적 상위 점수
- MRR : GT는 몇 순위에 있는가 (위치 별로 점수 획득)
(3) Baseline
- POP : 전체 아이템을 인기 탑K개를 추천합니다. / 예상하는 것보단 성능이 좋습니다.
- BPR-MF : (분해한) positive, negative feedback에 pairwise ranking loss 사용
- NCF : MF기반에 dot product대신 NLP로 학습하였습니다.
- FPMC : 마르코프 체인을 적용했습니다.
- GRU4Rec: GRU에넣고 학습한 것입니다.
- Caser : CNN Base의 모델입니다.
- SASRec (ICDM2018): self attention을 사용했습니다.
5. Results
(1) baseline 비교
단순히 BERT만 사용했음에도 불구하고 다른 모델보다 좋은 성능을 보여주었습니다. HR@1/5/10, NDCG@5/10, MRR과 같은 metric에서 다른 모델보다 좋았습니다.
(2) 성능 향상의 원인이 self-attention 인지 masked learning 때문인가?
(3) 트랜스포머에서 hidden dimension에 따라 얼마나 달라지는가
dimension이 128, 64일 때 가장 좋았습니다.
(4) dataset의 density 비교
Dataset이 적당히 dense할수록 성능 올라갔습니다. 그러나 dataset이 너무 많이 dense하면 성능 저하가 발생했습니다.
(5) N에 따른 결과
Next item prediction에서 최신 아이템을 많이 받을수록 (N클수록) 성능 향상을 보였습니다. 데이터셋마다 결과가 다른 이유는 데이터셋 자체의 avg length 차이 때문입니다.
6. Restrictions
이 논문에서 사용하는 데이터셋은 대부분 아이템, 유저가 정해져 있습니다. 그러나 실제 추천시스템에선 아이템, 유저의 수가 정해져있지 않습니다. 매초마다 새로운 token이 추가되고 삭제되는 등 item이 계속 바뀌고 유저도 계속 유입/이탈됩니다. 즉, Offline evaluation이 online result와 다른 경우가 많다. 즉, user와 item이 계속 바뀌는 만큼, metric이 잘 나왔다고 해서 실제로 성능이 좋다고 볼 수는 없다.
Domain에 따른 item의 lifespan이 다릅니다. 뉴스를 보면 하루 전의 것을 추천하지 않고 시간 별로 추천뉴스 달라진다는 특징을 예로 들 수 있습니다.