ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [논문리뷰-BERT4Rec] Sequential Recommendation with BidirectionalEncoder Representations from Transformer
    Papers Review 2023. 11. 23. 21:24

     

     

    목차

       

       

      BERT나 self-attention의 구조는 이해한 것으로 가정. BERT를 추천시스템에 어떻게 적용하였는지, BERT와의 차이점은 무엇인지 등을 위주로 작성

       

      1. Introduction

      기존 RNN 기반의 Sequential한 모델의 성과를 인정하지만, 단점이 있다. 

      1) RNN 기반의 sequential한 모델은 단방향(왼쪽에서 오른쪽)으로 학습하기 때문에 과거 데이터만 본다는 점에서 한계가 있다.

      RNN based sequential model can only encode information from previous item. Encoding user's historical interactions into a vector using a left to right.

      2) 원래 sequential이라 함은 엄격히 '순서'가 있는 데이터를 의미하지만, 추천시스템에서 아이템 순서는 엄격하지 않다.

      예를 들어, 시계열 데이터, 언어 데이터(문법)는 명확한 order가 존재하지만 추천시스템에서의 sequence는 구매한 아이템의 순서인데 이는 고정적이지 않음. assume a rigidly ordered sequence over data which is not always true for user behaviors in real-world applications.

       

      그래서 bidirectional Sequential model을 학습할 것이고 이때 주의해야 할 사항이 있다.

      양방향으로 학습한다면 target data를 포함해서 학습한다는 의미이기 때문에 data leakage가 발생. 이를 Cloze task(=Masked Language Model, MLM)을 통해 해결. Cloze task는 또한 학습 데이터를 더 많이 만들어내어 원활한 학습이 이루어질 수 있다.

       

       

      2. Related Work

      • General Recommendation
        • CF, RBM, NCF, MF, AutoRec 등등
      • Sequential Recommendation
        • GRU4Rec 등 RNN 기반 모델
      • Attnetion Mechanism
      SASRec Transformer 의 디코더 Last item masking 단뱡향 학습 Sing-head attention
      BERT4Rec Transformer 의 인코더, 디코더 Random Masking 양방향 학습 Multi-head attention

       

      3. BERT4Rec

      - Problem Statement

      - User set = U = {u1, u2, ... , u}

       

      - Item set = V = {v1, v2, ... , v}

       

      - u가 t번째 구매한 아이템의 순서 리스트 =  Sequence S_u = [v1^(u), ... , vt^(u)] 

      논문에서는 t가 아닌 n_u 번째까지 나타냈는데 뭐하러 그렇게까지 나타냈는지는 모르겠음 ㅎ

       

      - user의 seqeunce인 S_u 가 주어졌을 때, next time(t+1, 논문 수식에서는 n_u+1 번째)에 v라는 아이템을 구매할 확률

      모든 item set인 V에 대한 확률 P(v|S_u)를 구한다고한다.  수식은 조금 복잡해보이지만 결국 sotmax로 뽑아내고, 논문에서는 negative sample 100개 + positive sample 1개 총 101개에 대해서 확률P를 구했다.

       

      - Model Architecture

      기본적으로 BERT의 모델을 차용한다. 핵심적인 차이점은 아래 두개.

      1) BERT는 Pre-training model이지만, BERT4Rec은 End-to-end model이다.

      2) BERT는 sentence 단위의 Segment Embedding이 있어서 sentence loss가 존재하지만, BERT4Rec에는 없다.

      추가적으로,

      3) BERT의 token Embeddings -> item embeddings의 순서 sequence. 이때, BERT에서 사용했던 문장을 구분하는 [SEP]은 사용하지 않는다.

      4) positional embedding -> 그대로 이용

       

      BERT에서도 문장 길이가 길면 truncate해주듯, 여기서도 sequence가 길면 가장 최근 n개 까지만 잘라서 item embedding + positional embedding 값을 더하여 input에 넣는다. 특별히 learnable한 positional embedding을 사용했더니 성능이 더 좋았다고 한다.

      -> Multi-Head Self-Attention

      -> Point-wise Feed-Forward Network (sequence의 길이가 길수록 head는 많으면 좋다는 실험이 아래에 나옴)

      -> L개의 layer 통과 (적절한 layer 갯수 역시 실험 결과가 존재) -> softmax로 P(v|sequence)를 구함.

      -> output layer에서는 activation으로 GELU 사용 -> softmax를 취해준다.

       

      - Model training

      BERT4Rec은 학습시에는 Cloze task(중간에 구멍 뚫어서 masking)를, 예측시에는 predict the next item task(마지막 item만 masking하여 예측)를 진행한다.

        train dataset validation dataset test dataset
      user1 A B C D E F
      user2 F B A E D G
      user3 G B D A F C

       

      Train dataset

      전체 sequence 데이터 중, 마지막은 test, 그 전은 validation으로 쓰고 나머지를 가져온다.

      user1의 경우, [A, B, C, D] 라는 sequence를 갖는다면, [A, *, C, D] 혹은 [*, B, *, D] 이런식으로 p확률로 k개의 추가 샘플링이 가능한 cloze masking을 하여 학습한다.

      만약 학습할 때 predict the next item 방식으로 진행되면, [A, B, C, D]를 주고 [C]를 맞춰야하기 때문에 data leakage가 발생한다.

      이를 해결하기 위해 t-1 subsequence로 만드는 방법도 있다. [A, *], [A, B, *], [A, B, C, *] 이런식으로 만드는건데 이때의 sample size는 1 epoch당 (sequence 갯수)*(t-1) 개가 된다. 학습량이 너무 많아져서 학습 시간이 오래 걸린다.

      cloze task는 (sequence 갯수)*(masking 횟수 k) 개를 학습하기 때문에 predict next item보다 학습량이 많으면서 subsequence를 만드는 방법보다는 학습량이 적어 빠르게 학습할 수 있다.

       

      Validation, Test dataset

      전체 sequence 중, predict the next item 방식으로 학습을 진행한다.

      validation prediction : [A, B, C, D, *]

      test prediction : [A, B, C, D, E, *]

       

      Negative log-likelihood loss

      S'_u : masking된 버전의 S_u sequence

      Su^m : S_u sequence에서 masking 된 아이템 집합

      v*_m : true item = Su^m 집합의 true item

      P(v_m) : masking된 sequence가 들어올 때, 정답 item일 확률 = BERT4Rec의 output

      -logX 함수

      P(.)는 0~1 사이이므로 값이 커질수록 = 정답이 확률이 높아질수록 = -logP(.) 값이 작아진다 = loss가 작아진다.

      그러므로 true item의 loss인 -logP를 모두 더해서, masking된 아이템 집합의 길이만큼 나눠주면 loss가 된다.

       

      4. Experiments

      - Dataset

      Beauty랑 Steam은 sequence길이가 짧은 편, ML은 긴 편이다.

       

      - Negative Sampling

      test set에서 하나의 true item 당 100개의 negative sampling을 진행한다. 인기도 기준으로 정렬한 item 리스트 중, 해당 user가 interaction 하지 않은 item 100개를 선정 + positive item 1개 = 총 101개의 데이터로 test한다.

       

      - Overall Performance Comparison

      전반적으로 BERT4Rec이 다 SOTA였으며, 이전의 SASRec보다 큰 향상을 보이는 case도 있음을 자랑한다.

       

      - Effect of bidirectional self-attention and Cloze

      - SASRec : unidirectional

      - BET4Rec (1 mask) : bidirectional

      - BERT4Rec : bidirectional + Cloze

      표에 제시된대로, SASRec보다 BERT4Rec이 높은 것으로 보아 unidrectional보다 bidirectional이 sequential model에서 성능을 더 높일 수 있음을 알 수 있다. 이때 Cloze task를 적용하는 것이 성능 측면에서 양방향, 단방향의 차이보다 더 큰 영향을 미쳤다. 특히나 ML-1m같은 sequence의 길이가 긴 데이터셋에서.

       

      - Why and How bidirectional outperforms unidirectional?

      위 사진은 BERT4Rec로 실험할 때 test item 10개에 대한 attention score를 layer와 head별로 나타낸 것이다.

      (a)는 attention이 왼쪽 즉, 과거 데이터를 위주로 참조하고, (b)는 attention이 오른쪽 즉, 미래 데이터를 위주로 참조한다.

      layer1에서 통과한 attention score를 기반으로 layer2에서는 최신 item 위주로 학습하는 것을 볼 수 있다.

      즉, 양방향적 특징을 살리고 있는 모습이다.

       

      - Impact of Hidden Dimensionality d

      d가 증가할수록 성능이 높이지긴 하지만, 일정 수준에 도달하면 큰 차이가 없다. 특히나, beauty나 steam같이 spare한 데이터에서 더욱 차이가 없는 모습을 보인다.

       

      - Impact of Mask Proportion p

      masking 정도인 p는 sequence의 길이에 따라 다르다. beauty, steam과 같은 짧은 sequence는 p를 높여도 본래의 길이 자체가 짧기 때문에 masking되는 갯수가 적으므로 성능에 큰 영향을 미치지 않는다. 그러나, ML같은 긴 sequence는 p를 높였을 때 masking되는 item의 갯수가 많아지므로 (=sequence안에 많은 양이 masking되므로) 올바르게 학습되지 못해 성능 저하를 이끌 수 있다.

      적정값은 0.2 정도인 것으로 보인다.

       

      - Impact of Max sequence length N

      짧은 sequence에서는 유저의 최근 아이템에 영향을 받고, 긴 sequence에서는 최근 아이템 영향을 덜 받는다.

      계산 복잡도는 N*N*d 를 학습시켜야 하기 때문에 O(n^2d)이다. 그러므로 N이 길수록 학습속도는 느리다.

       

      - Ablation Study

      BERT4Rec의 각 component들이 어떤 영향을 미치는지 각각 실험해봤다.

      (1) PE : Positional Embedding

      ML 데이터셋처럼 긴 sequence에서는 PE를 제거하면 성능이 급격히 감소한다.

       

      (2) PFFN : Position-wise fedd-forward network

      PE만큼은 아니지만, PFFN을 제거할 경우 긴 sequence에서 더 큰 성능 하락을 가져온다. 아무래도 PFFN의 목적이 긴 시퀀스에서 여러 헤드로부터 정보를 통합하는 것이므로 ?

       

      (3) LN : Layer Normalization, RC : Residual Connection, Dropout

      위 컴포넌트는 과적합을 방지하기 위함이며, 해당 컴포넌트를 제거할 경우 짧은 seuqence에서 더 큰 성능 하락을 가져온다. 

       

      (4) L : number of self-attention layer, h : number of heads in multi-head attention

      둘 다 큰 데이터셋에서 더 큰 성능 향상을 가져옴.

       


      [리뷰]

      BERT4Rec이 아주 큰 성능 향상을 이룩한 것은 맞다. 다만, 구매한 목록이 긴 (sequence가 긴) user 수가 많은 데이터가 적합할 것 같다.

      ML-20m의 user가 14만명, Density가 0.54% 정도이므로, 그 이상의 유저와 Density만 갖는다면 사용하기 괜찮은 모델 같다. 현업에서 좀 큰 기업들은 대부분 이 수치를 넘지 않을까 생각해본다.

       

       

      댓글

    Designed by Tistory.