S3-Rec (Self-Supervised learning for Sequential Recommendation)은 2020년도에 CIKM에 발표된 Self-supervised learning 매커니즘을 활용한 순차 추천시스템 연구입니다.
Recap: Self-supervised Learning
Self-supervised learning (자기지도 학습)은 원시 데이터 (raw data) 내에 존재하는 상관관계에서 training signal을 구성하여 이를 통해 모델을 훈련하는 방법입니다. 그 중에서도 이 논문에서는 MIM (Mutual Information Maximization)을 활용하여 데이터를 다양한 view로 나누어, 그 view 들 사이에 존재하는 상호 정보를 최대화하는 방식으로 self-supervised learning을 구현하였습니다.
Mutual Information Maximization
MIM에 대해 보다 자세하게 알아보겠습니다. MIM는 여러 random variable 사이의 의존성 (dependency)를 측정할 수 있는 방법이라고 볼 수 있는데요, random variable X와 Y가 있을 때, X에 대해 아는 만큼 Y에 대한 불확실성을 줄일 수 있다는 가정을 합니다. 이를 수식으로 표현하면 다음과 같습니다.
$$I(X,Y) = H(X) – H(X|Y) = H(Y) – H(Y|X).$$
MIM를 계산하는 것은 intractable 하기 때문에, \(I(X,Y)\)의 lower bound를 구하는 것으로 근사하여야 한다고 하는데요. 저자는 InfoNCE에서 아이디어를 빌려 이를 해결하고자 하였습니다. 우선 InfoNCE의 수식을 살펴보겠습니다.
$$\mathbb{E}{p(X,Y)}[f{\theta}(x,y) – \mathbb{E}{q(\tilde{Y})} [\log \exp{f{\theta}(x, \tilde{y})}]] + \log |\tilde{Y}| $$
여기에서, x와 y는 input의 각각 다른 view를 나타내며, \(f_\theta\)는 서로 다른 view 사이의 관계를 계산하는데 사용되는 함수로, 예를 들어 word와 context 사이의 dot product 등과 같은 연산 등이 될 수 있습니다. \(\tilde{Y}\)는 distribution \(q(\tilde{Y})\)에서 샘플링 된 결과로, positive sample \(y\)와 \(|\tilde{Y}-1\) 개의 negative sample을 포함합니다.
또 저자는 InfoNCE가 cross-entropy와 연관이 있다고 주장하는데요, \(\tilde{Y}\)가 언제나 \(Y\)의 모든 possible values를 포함하는 동시에 (i.e., \(\tilde{Y}=Y\)), 그들이 uniformly distributed한다면, InfoNCE를 maximize 하는 것이 표준 다음 cross-entropy loss를 maximize 하는 것과 비슷하게 된다고 합니다.
$$\mathbb{E}{p(X,Y)} [f{\theta}(x,y) – \log \exp{f_{\theta}(x, \tilde{y})}].$$
따라서, 어떤 \(X, Y\)가 있을 때 그들의 MIM를 maximize 하려면 위 cross-entropy loss를 maximize하여 그 목표에 어느 정도 달성할 수 있다는 것이죠.
Pre-training Stage (Self-supervised Learning)
Base Model
해당 연구에서 사용하는 기본 framework는 embedding layer, self-attention blocks, prediction layer을 쌓아서 만든 순차 추천시스템입니다.
- Embedding Layer
- Item embedding Matrix \(M_I\)와 attribute embedding matrix \(M_A\)를 다루는데요. look-up operation을 통해 이들의 dense embedding으로 projection 시켜줍니다.
- 여기에는 추가로 position encoding matrix \(P\)가 학습되는데, item sequence의 input recommendation을 더 잘 학습시켜주는 목적이 있습니다. 기존 item embedding에 이 position encoding을 더해주는 방식으로 최종 item embedding을 얻습니다.
- Self-Attention Block
- Multiple self-attention blocks를 쌓아올려 item encoder를 구성합니다. multi-head self-attention layer와 point-wise feed-forward network로 two sub-layers를 구성해 주었습니다.
- 추가로, 순차 추천시스템 학습에서는 미래의 아이템을 볼 수 없도록 세팅해야 하기 때문에 mask operation으로 multi-head self-attention의 \(Q_i\)와 \(K_i\) 사이의 연결을 제거해 주었다고 합니다.
- BERT과 유사하게, pre-training 단계에서는 mask mechanism을 없애 item sequence 내의 item들의 양방향 context-aware representation을 학습합니다.
- Prediction Layer
- S3-Rec의 최종 layer에서는 user의 선호도 점수를 계산해주게 되는데, user history (t+1 이전까지의 item sequence) 아이템 \(i\)의 embedding과 step \(t\)의 self-attention block의 output을 dot product 해주는 방식으로 최종 점수를 얻게 됩니다.
Pre-training Stage with Four Modules
자, 그럼 앞서 소개한 Base Model에 self-attention 매커니즘을 어떻게 활용했는지 알아보겠습니다. 부차적인 self-supervised signals을 MIM를 통해 활용한다고 이야기했었는데요. Pre-training stage에서 네 가지 loss function들을 정의하여, 네 가지의 multi-view correlation을 학습합니다. 이 네 가지 모듈 구조는 그림 1에서 확인해보실 수 있습니다. 뭔가 복잡해 보이지만, 하나씩 뜯어보면 어렵지 않으니 하나씩 살펴보겠습니다.
Modeling Item-Attribute Correlation (AAP Loss)
먼저 학습하고자 하는 대상은 item과 attribute 간의 MIM입니다. 각 item의 attribute는 해당 item의 상세한 수준의 (fine-grained) 정보를 가지고 있을텐데요. 따라서 item- 과 attribute-level 의 정보를 item-attribute correlation을 통해 모델링하는 것입니다. 최종적으로 얻고자 하는 것은 유용한 attiribute information을 item representation에 주입 (inject) 시켜 주는 것입니다. 예를 들어, \(i_1\)가 영화 라라랜드에 해당한다면, 이 모듈은 \(i_1\)가 로맨스, 뮤지컬과 같은 attribute 정보를 embedding에 담게끔 학습하는 것입니다.
그림 2를 보시면, item sequence가 encoding 된 결과가 일렬의 초록색 embedding 으로 표시된 것을 확인할 수 있습니다 (이 부분은 위에서 소개한 Base Model 부분과 같습니다). 그 아래에 Item-Attribute MIM 모듈이 있는데, 여기에 밑에서 들어오는 파랑색 embedding block들이 input item sequence의 Attribute embedding 결과물입니다 (왼쪽에 화살표로 위에서부터 아래로 쭉 이어져 내려오는 것이 이들이 대응하는 관계라는 것을 뜻합니다). 이들의 MIM, 즉 Associate Attribute Prediction (AAP) loss는 다음 수식을 통해 minimize 합니다 (위에서 소개한 cross-entropy와 유사한 수식으로 MIM 계산).
$$L_{\text{AAP}}(i, A_i) = \mathbb{E}_{a_j \in A_i}[f(i, a_j) – \log \exp(f(i, \tilde{a}))],$$
여기에서, \(\tilde{a}\)는 샘플링된 negative attribute이며, \(f(\cdot,\cdot)\)는 다음과 같은 수식의 간단한 bilinear network로 정의됩니다.
$$f(i, a_j) = \sigma \left( e_i \cdot W_{\text{AAP}} \cdot e_{a_j} \right)$$
여기서 \(W_{\text{AAP}} \in \mathbb{R}^{d\times d}\)는 AAP의 parameter matrix이며, \(\sigma\left(\cdot\right)\)은 sigmoid 함수입니다.
Modeling Sequence-Item Correlation (MIP Loss)
다음으로 살펴볼 것은 Sequence와 Item 간의 상호관계입니다. 이를 학습하기 위해서는 Masked Item Prediction (MIP) loss를 계산하게 되고요. 왜 Mask라는 단어가 들어갔는지, 또 이 상호관계가 어떻게 계산되는지 그림으로 직관적으로 알아보겠습니다.
그림 3에서 보시면, item sequence를 encoding하는 과정은 AAP 모듈과 유사합니다. 그런데, item sequence에 있는 item들 중 일부를 무작위로 masking 해준다는 차이점이 있습니다 (“[mask]” token으로 교체). 이 모듈에서 하고자 하는 일은, 이렇게 masking된 item을 예측하도록 학습하여, Sequence와 Item 간의 상관관계를 학습하는 것이죠. 아주 간단한 예로, 어떤 사용자의 masking 된 item sequence가 {해리포터와 마법사의 돌, [token], 해리포터와 아즈카반의 죄수} 라고 했을 때, 해당 모듈이 [token]이 해리포터와 비밀의 방이라고 예측하게끔 학습하는 것이죠. 즉, item sequence 내에서 아이템들 사이의 순서 관계를 학습하는 모듈입니다.
AAP loss를 구하는 수식과 거의 유사하여, 아래 수식에 자세한 설명은 생략하겠습니다. (*참고: 논문에서는 \( L_{\text{MIP}}(C_{i_t}, i_t) = f(C_{i_t}, i_t) – \log [f(C_{i_t}, i)] \)로 MIP loss가 정의되어 있는데, contrastive learning 부분의 \(i\)를 \(\tilde{i}\)로 잘못 표기된 것으로 보입니다.)
$$L_{\text{MIP}}(C_{i_t}, i_t) = f(C_{i_t}, i_t) – \log [f(C_{i_t}, \tilde{i})],$$
$$f(C_{i_t}, i_t) = \sigma \left( F_t \cdot W_{\text{MIP}} \cdot e_{i_t} \right)$$
Modeling Sequence-Attribute Correlation (MAP Loss)
다음은 item sequence와 attribute간의 상관관계를 학습하는 모듈입니다. Masked Attribute Prediction (MAP) Loss를 통해 해당 작업을 수행하게 됩니다.
그림 4를 보시면, 그림 3 (MIP)와 거의 유사하게 masking 된 item을 무언가와 비교하는 방식입니다. 그런데, MIP 모듈에서는 item embedding을 그대로 맞추는 것이 목표였던 반면, 이번 모듈에서는 item sequence와 masking 된 item의 attribute 간의 상관관계를 MIM를 통해 학습합니다.
마찬가지로, MAP Loss를 계산하는 수식 자체는 AAP, MIP 모듈과 비슷합니다.
$$L_{\text{MAP}}(C_{i_t}, A_{i_t}) = \mathbb{E}{a \in A{i_t}}\left[f(C_{i_t}, a) – \log \left( \sum_{\tilde{a} \in A \setminus A_{i_t}} \exp(f(C_{i_t}, \tilde{a})) \right)\right],$$
$$f(C_{i_t}, a) = \sigma \left( F_t \cdot W_{\text{MAP}} \cdot e_a \right)$$
Modeling Sequence-Segment Correlation (SP Loss)
마지막으로 sequence와 item sequence 내의 segment 간의 상관관계를 구하는 모듈입니다. Segment Prediction (SP) Loss를 통해 이를 구현했습니다.
그런데, 그림 5을 보면 무언가 이상한 점이 있습니다. item sequence 내에서 하나의 segment를 masking 하는 것까지는 이해가 되는데, 그림에서 막상 MIM 모듈에 input으로 위아래에서 들어오는 것들은 segment가 아닙니다(!). 그림 상에서 MIM 위에서 들어오는 input은 sequence 내에서 masking한 segment가 아니라, sequence의 맨 마지막 item의 context embedding이며, MIM 모듈 아래에서 들어오는 input은 masking 된 segment의 마지막 하나의 item의 context embedding입니다. 왜 이 둘의 correlation을 학습하고자 한 것인지 논문의 원문을 확인해보겠습니다.
However, a major difference between item sequence with word sequence is that a single target item may not be highly related to surrounding contexts. For example, a user has bought some products just because they were on sale. Based on this concern, we extend the Cloze strategy from a single item to item subsequence (i.e., called segment). Apparently, an item segment reflects more clear, stable user preference than a single item. Therefore, we follow a similar strategy in Section 4.3.2 to recover an item subsequence from surrounding contexts. It is expected to enhance the self-supervised learning signal and improve the pre-trained performance.
…음. 하나의 item이 sequence 내 인접한 item과 큰 관계가 없을 수도 있기 때문에 segment를 사용했다는 설명은 되어 있으나, 왜 그림 5에서와 같이 sequence 내의 맨 마지막 item, 그리고 segment 내의 마지막 item을 MIM 계산에 사용했는지 명확한 설명은 찾을 수 없었습니다 (혹시 찾으셨다면, 댓글로 공유해주시면 감사하겠습니다). 대신 억지 추측(?)을 해보자면, {해리포터 1, 해리포터 2, 해리포터 3} 까지는 순서대로 잘 보다가, 사용자가 중간에 뜬금없이 최신 영화인 Wonka 를 시청한 뒤, 다시 이어서 해리포터 시리즈로 돌아오는 시나리오를 생각해볼 수 있습니다. 그렇다면 Wonka는 앞뒤 context (해리포터 시리즈)와는 무관하니, MAP 모듈에서 하필 Wonka가 masking 되었다면 sequence-item correlation 관계를 학습하는 데 부정적인 영향을 끼칠 수 있겠죠. 이러한 시나리오까지 잡기 위해 SP 모듈을 디자인한 것이 아닌가 주관적으로 생각해 보았습니다.
$$L_{\text{SP}}(C_{i_{j1:j2}}, i_{j1:j2}) = \sum_{( )} \left[ f(C_{i_{j1:j2}}, i_{j1:j2}) – \log \exp \left( f(C_{i_{j1:j2}}, \tilde{i}_{j1:j2}) \right) \right],$$
$$f(C_{i_{j1:j2}}, i_{j1:j2}) = \sigma \left( s^\top \cdot W_{\text{SP}} \cdot \tilde{s} \right)$$
Fine-tuning Stage
위에서 소개한 네 가지 모듈로 pre-training을 통해 여러가지 correlation을 학습한 뒤, item embedding은 다양한 view의 정보를 잘 담게 되었을 것입니다. 이어지는 fine-tuning 단계에서는 undirectional Transformer (left-to-right)을 통해 item sequence input을 보고 next item을 예측하는 network를 훈련합니다. 기본적인 DL-based Sequential Recommendation 형태를 띄는 SASRec을 떠올리시면 편합니다.
수식은 다음과 같습니다.
$$L_{\text{main}} = -\log \sigma P(i_{t+1} | i_{1:t}) – P(i_{t+1} | i_{1:t})$$
Experiments
Baseline과 비교 결과
여러 benchmark에서 모든 baseline 모델들보다 뛰어난 성능을 보임을 입증하였습니다.
Ablation Study
저자는 pre-training stage에서 사용한 네 가지 모듈이 각각 얼만큼의 성능 향상을 보였는지에 대한 실험을 진행한 Ablation Study 결과도 제공하였는데요.
그림 8에서 보시면, 네 가지 모듈 중 어느 것을 제거해도 모든 모듈을 사용하는 것보다 성능 저하가 존재함을 입증하였습니다. 참고로 pre-training의 네 가지 모듈을 모두 제거한 S3-Rec은 baseline 모델 중 하나인 SASRecF와 같습니다.
Discussion & 마치며
- Ablation Study에서는 모듈을 단 한 개씩만 제거한 S3-Rec의 실험 결과를 보여주었는데, 이 네 모듈 사이에도 어느정도 duplicate 되는 정보가 존재할 것 같아서 2개, 혹은 3개를 동시에 제거했을 때 성능이 어느정도 저하될지도 궁금합니다 (가령 AAP와 SP의 경우 비슷한 부분이 많아 둘을 동시에 제거했을 때 성능 저하가 크지 않을까 싶습니다).
- SP 모듈에 대한 이해를 제가 잘못한 것이려나요… 아니라면 저자가 의도한 바가 궁금하네요…!
- Pre-training stage가 추가되어 모델이 다소 복잡해지긴 했으나 MIM principle을 이용하여 다양한 self-supervised 모듈을 디자인한 것이 흥미로웠고, sequential recommendation 태스크 외 다른 분야에도 적용해볼 수 있는 potential이 있을 것 같습니다.