qcoding

[AI논문리뷰-추천알고리즘] SASRec - Self-Attention으로 순차 추천의 장단기 문맥을 함께 잡은 모델 본문

AI논문리뷰-추천알고리즘

[AI논문리뷰-추천알고리즘] SASRec - Self-Attention으로 순차 추천의 장단기 문맥을 함께 잡은 모델

Qcoding 2026. 5. 6. 21:24
반응형
논문  Self-Attentive Sequential Recommendation 저자  Wang-Cheng Kang, Julian McAuley (UC San Diego) 학회/연도  ICDM 2018 arXiv  1808.09781 코드  official GitHub

한 문단 요약

SASRec은 사용자의 클릭·구매·시청 순서를 다음 아이템 추천 문제로 보고, RNN이나 CNN 대신 Transformer의 self-attention을 적용한 순차 추천 모델이다. Markov Chain처럼 최근 행동에 집중할 수 있으면서도, RNN처럼 긴 문맥을 볼 수 있다는 점이 핵심이다. Amazon Beauty/Games, Steam, MovieLens-1M 실험에서 SASRec은 PopRec, BPR, FMC/FPMC, TransRec, GRU4Rec, Caser보다 Hit@10과 NDCG@10을 일관되게 개선했고, GPU 학습에서는 CNN/RNN 계열보다 한 자릿수 초 epoch로 훨씬 빠르게 수렴했다.

SASRec 학습 구조

원문 Figure 1. SASRec training process. 출처: Kang and McAuley, "Self-Attentive Sequential Recommendation", ICDM 2018. arXiv:1808.09781 - 논문 원문에서 인용.

이 논문은 무엇을 해결하려고 했나?

이 논문의 문제의식은 "사용자의 다음 행동은 최근 행동만 보면 충분한가, 아니면 긴 기록 전체를 봐야 하는가?"로 요약할 수 있다. 순차 추천은 사용자 u의 행동 시퀀스 S_u=[v_1, v_2, ..., v_t]가 있을 때 다음 아이템 v_{t+1}을 맞히는 문제다. 쇼핑에서는 최근에 본 상품이 다음 구매에 큰 영향을 주지만, 영화나 게임처럼 취향의 긴 흐름이 중요한 도메인도 있다.

기존에는 두 축이 있었다. Markov Chain(MC) 계열은 바로 직전 또는 몇 개의 최근 아이템 전이에 강하다. 희소한 데이터에서는 단순한 가정이 오히려 좋다. 반대로 RNN 계열은 전체 히스토리를 hidden state에 압축해 긴 문맥을 다룰 수 있지만, 데이터가 충분히 많지 않으면 과한 모델이 되고, 시간 순서대로 계산해야 해서 느리다.

SASRec의 제안은 이 둘 사이의 균형이다. 모든 과거 아이템을 후보 문맥으로 두되, self-attention이 현재 예측에 중요한 아이템만 골라 보게 하자. 즉 "긴 문맥을 볼 수 있지만, 실제 예측은 관련 있는 소수의 행동에 집중하는" 구조를 만든다.

배경지식과 핵심 키워드

SASRec은 Transformer를 추천에 가져온 초기 대표 논문이다. 다만 단순히 attention을 붙였다는 사실보다, 순차 추천의 데이터 분할, causal masking, position embedding, negative sampling이 어떻게 맞물리는지가 더 중요하다.

Sequential Recommendation
사용자의 행동 순서를 보존한 채 다음 아이템을 예측하는 추천 문제다. SASRec은 각 사용자별 마지막 행동을 test, 그 직전 행동을 validation, 나머지를 training으로 나눈다. Amazon Beauty는 평균 행동 수가 사용자당 7.6개인 매우 희소한 데이터이고, MovieLens-1M은 163.5개로 훨씬 조밀해 같은 모델이 희소/밀집 상황을 모두 버텨야 한다.
Markov Chain vs RNN
MC는 다음 행동이 최근 1~k개 행동에 조건부로 결정된다고 본다. sparse 데이터에서는 parameter가 적어 강하지만, 긴 취향 흐름을 놓친다. RNN은 모든 과거를 hidden state로 누적해 long-term preference를 표현할 수 있지만, t번째 계산이 t-1번째 hidden state를 기다려야 하므로 병렬화가 어렵다. SASRec은 attention으로 두 장점을 섞으려 한다.
Self-Attention
입력 시퀀스의 각 위치가 query, key, value로 변환되고, Attention(Q,K,V)=softmax(QK^T/sqrt(d))V로 관련 위치의 정보를 모은다. SASRec에서는 각 time step이 과거 아이템 중 다음 아이템 예측에 유용한 아이템을 가중합한다. 복잡도는 O(n^2d+nd^2)이지만, 각 위치 계산이 병렬 가능해 GPU에서 RNN보다 빠르다.
Causal Masking
다음 아이템을 예측할 때 미래 아이템을 보면 정보 누수가 생긴다. SASRec은 attention matrix의 오른쪽 위 삼각 영역을 막아 time step t가 t 이후 아이템을 보지 못하게 한다. 그래서 Transformer decoder처럼 왼쪽에서 오른쪽으로 예측하되, RNN처럼 순차 계산하지 않아도 된다.
Positional Embedding
Self-attention은 입력 순서를 자체적으로 알지 못한다. SASRec은 item embedding에 학습 가능한 position embedding P∈R^{n×d}를 더한다. ablation에서 position embedding을 제거하면 Beauty에서는 NDCG@10이 0.3142에서 0.3183으로 조금 좋아지지만, Games/Steam/ML-1M에서는 각각 0.5360→0.5301, 0.6306→0.6036, 0.5905→0.5772로 떨어진다. 짧고 희소한 시퀀스에서는 순서보다 집합 정보가 충분할 수 있지만, 조밀한 데이터에서는 순서가 중요하다는 해석이 가능하다.
Residual Connection + Dropout
SASRec block은 self-attention 뒤 feed-forward network를 두고, 각 sublayer에 residual connection과 layer normalization을 붙인다. Remove RC ablation은 Beauty NDCG@10 0.3142→0.2591, Games 0.5360→0.4303으로 크게 하락한다. Dropout 제거도 Beauty 0.2436, Games 0.4375까지 떨어져 sparse 데이터에서 regularization이 특히 중요하다는 점을 보여준다.
Negative Sampling + Binary Loss
implicit feedback에서는 관측된 행동만 positive로 확실하고, 미관측 아이템은 진짜 negative인지 알 수 없다. SASRec은 각 time step마다 positive next item 하나와 랜덤 negative item 하나를 뽑아 sigmoid 기반 binary cross entropy를 학습한다. padding 위치는 loss에서 제외한다. 이 설계는 전체 아이템 softmax보다 가볍지만, negative sampling 전략이 성능과 재현성에 영향을 준다.
Hit@10 / NDCG@10
Hit@10은 정답 아이템이 추천 상위 10개 안에 들어왔는지 보는 지표이고, NDCG@10은 정답이 더 앞에 있을수록 높은 점수를 준다. 논문은 사용자별 test item 하나와 랜덤 negative item 100개를 함께 ranking한다. Table III에서 SASRec은 ML-1M NDCG@10 0.5905로 Caser 0.5538, GRU4Rec+ 0.5513보다 높다.

핵심 인사이트

SASRec의 본질은 "Transformer를 쓴 추천 모델"이 아니라, 순차 추천에서 필요한 causal 구조를 유지하면서도 attention으로 필요한 과거 행동만 선택하게 한 점이다. 희소 데이터에서는 최근 행동 중심, 조밀한 데이터에서는 더 긴 문맥 중심으로 자연스럽게 움직인다.

기존 방법의 한계

FPMC나 FMC 같은 Markov Chain 기반 모델은 item-to-item transition을 잘 잡는다. 예를 들어 사용자가 프린터를 봤다면 잉크나 토너를 추천하는 식의 짧은 전이는 강하다. 하지만 사용자가 몇 달 동안 쌓아 온 장르 취향, 브랜드 선호, 가격대 같은 긴 흐름은 약하다.

GRU4Rec 같은 RNN 모델은 긴 시퀀스를 hidden state에 누적하므로 이론적으로는 장기 문맥을 볼 수 있다. 문제는 모든 정보를 하나의 state에 압축해야 하고, 순차 계산 의존성 때문에 학습이 느리다는 점이다. Caser 같은 CNN 모델은 local pattern을 병렬로 잡지만, convolution window와 layer 수에 따라 볼 수 있는 문맥 범위가 제한된다.

또 하나의 문제는 데이터 밀도에 따른 모델 선택이다. 논문 초록이 말하듯 sparse dataset에서는 MC처럼 단순한 모델이 유리하고, dense dataset에서는 RNN처럼 복잡한 모델이 유리하다. 하나의 추천 시스템이 여러 도메인을 다룬다면 이 둘 사이를 매번 수동으로 바꾸기 어렵다.

제안 방법의 핵심 아이디어

SASRec은 사용자별 행동 시퀀스를 길이 n으로 맞춘다. 길면 최근 n개만 남기고, 짧으면 왼쪽에 padding을 붙인다. 각 아이템은 item embedding M에서 d차원 벡터로 바뀌고, 여기에 position embedding을 더해 입력 E를 만든다.

그 다음 b개의 self-attention block을 통과한다. 각 block은 masked self-attention과 point-wise feed-forward network로 구성된다. masked self-attention은 현재 위치가 과거 위치만 보도록 만들고, FFN은 각 위치별 representation을 비선형 변환한다. output representation은 후보 아이템 embedding과 내적되어 추천 점수 r_{i,t}를 만든다.

학습 목표는 각 위치 t에서 실제 다음 아이템 o_t의 점수는 높이고, 샘플링한 negative item의 점수는 낮추는 것이다. 즉 sequence를 한 번 넣으면 여러 time step의 다음 아이템 예측을 동시에 학습한다. 이 점이 RNN보다 훨씬 병렬화에 유리하다.

모델 구조/알고리즘 흐름

구현 관점의 흐름은 다음과 같다.

  1. 사용자 행동 시퀀스를 시간순으로 정렬한다.
  2. 가장 최근 행동은 test, 두 번째 최근 행동은 validation, 나머지는 train으로 둔다.
  3. train sequence를 최대 길이 n으로 truncate/pad한다.
  4. item embedding과 position embedding을 더해 입력 행렬 E∈R^{n×d}를 만든다.
  5. causal mask를 적용한 self-attention으로 각 위치가 과거 아이템만 보게 한다.
  6. feed-forward network, residual connection, layer normalization, dropout을 적용한다.
  7. 각 위치의 hidden vector와 candidate item embedding의 내적으로 score를 계산한다.
  8. positive next item과 sampled negative item에 대해 binary cross entropy를 최적화한다.
  9. 추론 시에는 사용자의 최신 시퀀스를 넣고, 마지막 위치의 score로 후보 아이템을 ranking한다.

공식 구현 기준으로 기본 하이퍼파라미터는 데이터셋에 따라 maxlen을 다르게 두고, latent dimension d는 10~50 범위를 실험한다. 논문 Figure 2에서는 d가 커질수록 대체로 NDCG@10이 좋아지고, 모든 데이터셋에서 d≥40이면 만족스러운 성능을 보인다고 해석한다.

논문 그림/표로 이해하기

SASRec Games 데이터셋 NDCG@10 그래프

원문 Figure 2(b). latent dimensionality d에 따른 Games NDCG@10. 출처: Kang and McAuley, "Self-Attentive Sequential Recommendation", ICDM 2018. arXiv:1808.09781 - 논문 원문에서 인용.

SASRec attention weight 시각화

원문 Figure 4(c). ML-1M Layer 1 attention weight. 최근 위치에만 몰리지 않고 더 긴 과거 위치까지 가중치가 퍼진다. 출처: Kang and McAuley, "Self-Attentive Sequential Recommendation", ICDM 2018. arXiv:1808.09781 - 논문 원문에서 인용.

Table III 주요 결과 재구성

데이터셋 지표 강한 baseline SASRec 해석
Beauty NDCG@10 TransRec 0.3020 0.3219 희소 데이터에서도 단순 MC보다 우위
Games Hit@10 TransRec 0.6838 0.7410 전이 기반 모델보다 넓은 문맥 활용
Steam NDCG@10 GRU4Rec+ 0.5595 0.6306 게임 도메인에서도 RNN/CNN보다 강함
ML-1M Hit@10 Caser 0.7886 0.8245 조밀한 데이터에서 긴 문맥 이점
논문 Table III 일부 재구성. 모든 행에서 SASRec이 가장 높은 값을 기록했다.

실험 설정과 결과 해석

데이터셋은 Amazon Beauty, Amazon Games, Steam, MovieLens-1M 네 개다. 모두 review 또는 rating 존재 여부를 implicit feedback으로 보고, timestamp로 순서를 만든다. 사용자와 아이템 중 관련 행동이 5개 미만인 경우는 제거한다. 이 전처리 후 Beauty는 52,024명 사용자와 57,289개 아이템, 0.4M action이고, ML-1M은 6,040명 사용자와 3,416개 아이템, 1.0M action이다.

baseline도 폭넓다. PopRec, BPR, FMC, FPMC, TransRec 같은 non-neural/Markov 계열과 GRU4Rec, GRU4Rec+, Caser 같은 RNN/CNN 계열을 함께 비교한다. 결과적으로 SASRec은 Table III의 모든 데이터셋과 metric에서 최고 성능이다. 특히 Steam NDCG@10은 GRU4Rec+ 0.5595에서 SASRec 0.6306으로 올라가고, Games Hit@10은 TransRec 0.6838에서 0.7410으로 상승한다.

효율성도 논문의 중요한 포인트다. Figure 3에서 ML-1M 기준 SASRec은 cut length 200 조건으로 epoch당 1.7초라고 표시된다. Caser는 cut 200에서 19.1초/epoch, GRU4Rec+는 cut 200에서 30.7초/epoch다. self-attention은 n^2 항 때문에 긴 시퀀스에서 부담이 있지만, RNN처럼 순서대로 기다리지 않으므로 실제 GPU 학습에서는 훨씬 빠르게 돈다.

SASRec 학습 효율 그래프

원문 Figure 3. ML-1M training efficiency. SASRec은 epoch당 1.7초로 표시되어 CNN/RNN 기반 비교 모델보다 빠르다. 출처: Kang and McAuley, "Self-Attentive Sequential Recommendation", ICDM 2018. arXiv:1808.09781 - 논문 원문에서 인용.

실험 해석

SASRec이 흥미로운 이유는 sparse/dense 양쪽에서 모두 강하다는 점이다. sparse에서는 attention이 최근 행동에 집중해 MC처럼 행동하고, dense에서는 더 먼 과거까지 attention을 확장해 RNN의 장기 문맥 효과를 흡수한다.

한계와 비판적 관점

첫 번째 한계는 sampled evaluation이다. 논문은 각 사용자 test item 하나와 100개의 random negative item을 함께 ranking한다. 이 방식은 당시 표준적이었지만, 실제 서비스에서는 수천~수백만 후보를 다뤄야 한다. negative sample 구성에 따라 HR/NDCG 절대값이 달라질 수 있으므로 최신 논문과 직접 수치 비교할 때는 조심해야 한다.

두 번째는 side information을 쓰지 않는다는 점이다. SASRec은 item ID sequence만으로 추천한다. 상품 텍스트, 이미지, 가격, 카테고리, 노출 위치, 세션 맥락 같은 정보는 모델에 들어가지 않는다. 그래서 cold-start item이나 노출 편향 문제에는 취약하다.

세 번째는 attention 복잡도다. n이 수백이면 괜찮지만, 긴 행동 로그 전체를 넣고 싶다면 O(n^2d)가 부담이 된다. Table V에서도 ML-1M에서 max length n을 10에서 600으로 늘리면 학습 시간이 75초에서 1895초까지 증가한다. 성능은 NDCG@10 0.480에서 0.595까지 올라가지만, n=400 이후 개선 폭은 매우 작다.

마지막으로, 이후 BERT4Rec 같은 양방향 모델이 등장하면서 SASRec의 left-to-right 한계도 분명해졌다. SASRec은 미래를 보지 않는 causal 구조 덕분에 다음 아이템 예측에는 자연스럽지만, 시퀀스 중간 아이템의 표현을 양쪽 문맥으로 학습하지는 못한다.

구현하거나 응용한다면 무엇을 봐야 하나?

구현할 때 가장 먼저 확인할 것은 데이터 split이다. 각 사용자별 마지막 1개를 test, 직전 1개를 validation으로 빼는 leave-one-out 방식이므로, random split을 쓰면 논문 수치와 맞지 않는다. 또한 train sequence에 validation item을 포함해 test 입력을 만들었다는 점도 주의해야 한다.

두 번째는 masking이다. causal attention mask가 빠지면 모델이 미래 아이템을 보게 되어 성능이 부풀 수 있다. padding 위치도 attention과 loss에서 제대로 제외해야 한다. 특히 짧은 시퀀스가 많은 Beauty 같은 데이터에서는 padding 처리가 곧 성능 처리다.

세 번째는 negative sampling이다. 논문은 각 epoch마다 각 time step에 대해 랜덤 negative item 하나를 생성한다. 구현체마다 negative를 미리 고정하는지, epoch마다 다시 뽑는지, popularity를 반영하는지에 따라 결과가 달라진다.

서비스 적용 관점에서는 SASRec을 후보 생성 또는 re-ranking 둘 다에 쓸 수 있다. item 수가 크면 전체 item scoring 비용이 부담되므로, 최근 행동 기반 ANN 후보 검색이나 인기 후보를 먼저 만들고 SASRec으로 재정렬하는 방식이 현실적이다. 게임, 쇼핑, 영상, 글 추천처럼 사용자의 행동 순서가 강한 신호를 갖는 도메인에서 특히 쓸 만하다.

한 줄 결론과 다음에 읽을 논문

한 줄 결론: SASRec은 순차 추천에서 Transformer/self-attention을 제대로 작동시킨 초기 기준점이며, "최근 행동 중심 추천"과 "긴 취향 문맥 추천" 사이의 균형을 attention으로 푼 모델이다.

다음에 읽을 논문으로는 BERT4Rec을 추천한다. SASRec이 causal self-attention으로 다음 아이템을 예측했다면, BERT4Rec은 masked item prediction과 양방향 Transformer로 이 흐름을 어떻게 바꿨는지 보여준다.

출처

반응형
Comments