포스팅 개요
본 포스팅은 추천 시스템에 대규모 언어 모델(Large Language Models, LLM)을 결합해 연구한 LlamaRec: Two-Stage Recommendation using Large Language Models for ranking이라는 논문을 읽고 정리한 포스팅입니다.
본 논문은 검색 단계인 retrieval 단계와 LLM 기반으로 만든 Ranking 단계로 구성되어 Two-Stage 방법을 제안하는데요. 그 결과로 효율성도 좋은 LLM 기반 추천 시스템을 구성할 수 있었다고 합니다.
본 논문은 아래 링크에서 보실 수 있습니다.
포스팅 본문
본 포스팅은 추천 시스템과 대규모 언어 모델(LLM)을 결합한 방법인 LlamaRec 논문을 리뷰하는 포스팅입니다. LlamaRec 저자들이 주장하는 LLM 기반 추천 시스템 방법은 Two-Stage Recommendation 방법인데요. 어떻게 연구를 진행했고 주장하는지 아래와 같은 순서로 살펴보겠습니다.
1. 핵심 요약
2. 소개(Introduction)
3. 방법론(Methodology)
4. 실험(Experiment)
1. 핵심 요약
- Text feature를 활용해서 LLM도 추천 시스템에 도입되고 있고 다양한 추천 시나리오에서 성능 향상을 보여주고 있음
- 그러나, 대부분의 기존 방법은 훈련이 없는(Training-free) 추천 방법을 실행했고 이는 pretrained knowledge에 크게 의존하게 됨
- 또한, autoregressive generation 때문에 추론(Inference)가 느려 실시간 추천 방법에 효과적이지 못함
- 따라서, 저자들은 Two-Stage recommednation 방법을 제안함. 이 방법은 LLM 모델을 사용하고 ranking based 추천 방법임
- 사용자들의 interaction history에 기반해서 candidate들을 retrieve하는 sequential recommender를 사용하고 그 다음 LLM의 input으로 텍스트 형태로 넣어 랭킹을 수행
- 이때, LLM 모델은 next item title을 생성하는 것 대신 verbalizer 방법을 채택해서 candidate item들의 출력 logit의 확률 분포로 변환함
- 이런 구조 때문에 LlamaRec은 긴 텍스트를 생성하지 않고도 item의 순위를 효과적으로 매길 수 있음
2. Introduction
저자들은 기존에도 추천 시스템에 대규모 언어 모델(Large Language Model, LLM)을 결합한 다양한 연구가 있었지만, 대부분 추천에 LLM을 적용하는데 focus하고 효율적인 inference의 필요성을 무시하고 있다고 주장합니다. 즉, LLM의 autoregressive generation 방법은 real-time recommendation에 너무 느리기 때문에 실제 시나리오에서는 효과적이지 않는다고 합니다.
저자들은 추천의 효율성을 향상시키기 위해 한 가지 가능한 해결책은 토큰 생성을 피하기 위해서 LLM 위에 classification 또는 regression head를 활용하는 것이라고 하는데요. 그러나, 이런 헤드는 추가적인 매개변수를 도입하게 되고 specific settings에 따라 훈련되므로 추천 시스템 applicability에는 부적합하다고 합니다.
그러므로, 저자들은 LlamaRec을 제안하는데요. retrieval과 ranking을 모두 포함하는 솔루션을 제공할 뿐만 아니라 추천 성능과 inference 효율성이 향상된 방법이라고 합니다. 이때, sequential recommender를 도입해 ID 기반 item 검색(retrieval)을 수행하게 해서 사용자 history 길이에 관계없이 효율적으로 candidate를 생성할 수 있다고 합니다.
그 다음으로 사용자 히스토리와 후보를 텍스트로 변환하는 템플릿을 설계하였고 이를 사용해 ranking을 구성합니다. 이렇게 구성된 text prompt는 pretrained(사전 학습된) LLM에서 Parameter Efficient Fine-Tuning(PEFT)를 수행하는데 사용되고 model은 candidate item의 index에 점수를 생성해서 ranking을 매기게 됩니다. 이때 저자들은 LLM 헤드의 출력을 추가 파라미터 없이 probabiltiy distribution(확률 분포)로 변환하기 위해 verbalizer를 사용한다고 합니다. verbalizer를 사용하게 되면 다음과 같은 이점을 얻게 된다고 하네요.
Verbalizer approach ranking 방법의 이점
(1) autoregressive generation을 우회해서 LLM의 추론 시간을 크게 단축한다고 합니다.
(2) 한 번의 순방향 패스(One forward pass)내에서 모든 candidate에 대한 score를 생성하고 beam search와 같은 memory-intensive decoding process를 피할 수 있다고 합니다.
따라서, 저자들이 주장하는 Llamarec은 two-stage framework 구조를 통해 LLM 기반 추천 시스템을 효율적으로 훈련하고 추론할 수 있으며 기존 방법보다 향상된 성능을 제공할 수 있다고 합니다. 그러므로, 아래와 같이 3가지로 저자들이 주장하는 LlamaRec을 요약할 수 있습니다.
(1) retrieval과 ranking을 모두 갖춘 솔루션을 제공하는 LLM 기반 two-stage recommendation 제안
(2) ID 기반의 sequential recommender는 retriever로 사용하고 verbalizer 접근 방법으로 LLM 기반 Ranking 수행하여 추천의 시간과 메모리 효율성을 크게 향상
(3) 벤치마크 데이터 세트와 비교해 LlamaRec의 성능을 입증함
3. Methodology
3-1. Setup
본 논문에서 저자들은 본인들이 제안한 추천 시스템은 LlamaRec을 설명하기 전에 아래와 같이 수식을 먼저 정리해놨습니다.
- 사용자 상호작용 히스토리 : \(x\)
- 데이터 셋 : \(\chi_i\)
- 사용자의 시퀀스 기반 상호 작용 : \([x_1, x_2, \ldots, x_T]\)
- 이때, 상호작용은 순서대로 정렬함 : \(I (\chi_i \in I, i = 1,2,\ldots,T)\)
- 랭킹 점수(Ranking score) : \(\hat{y} \in \mathbb{R}^{|I|}\)
- Optimizer : \(\theta \quad (\text{i.e.,} \hat{y} = f(\theta; x))\)
- Efficient retrieval model : \(f_{retriever}\)
- LLM 기반 랭킹 모델 : \(f_{rankder}(f = f_{ranker} \circ f_{retriever})\)
다음 정리에서 이 수식들을 참고하시길 바랍니다. 또한, 저자들이 주장하는 LlamaRec은 다음과 같은 아키텍처를 가지고 있습니다.
Figure 1은 저자들이 제안한 LlamaRec입니다. 왼쪽이 retrieval stage이며 two-stage framework중 첫 번째 stage입니다. 이렇게 구성된 retriever을 통해 instruction template을 구성하고 사용자 히스토리와 후보 아이템 셋을 텍스트 형태로 변환해 Llama 2 기반의 ranking model로 넣어 랭킹을 매기게 됩니다. 이게 two-stage framework 중 두 번째 stage라고 보시면 되겠습니다.
3-2. Proposed LlamaRec - Retrieval
본 논문에서 저자들은 two-stage framework를 제안합니다. 그 중 하나가 Retrieval인데요. 저자들은 본 stage에서 recurrence 기반 추천 시스템 모델인 LRURec를 채택했다고 합니다. LRURec는 small-scale sequential recommender로 선형(linear) recurrent unit 단위를 활용해 입력 시퀀스를 효율적으로 처리할 수 있다고 합니다.
저자들은 LRURec를 통해 사용자 transition 패턴을 캡처하고 predicted 아이템의 feature를 생성하기 위해 autoregressivie training을 통해서 최적화 한다고 합니다. inference를 위해서 LURRec는 아이템 임베딩과 예측된 feature 사이의 dot product(내적)을 통해 score를 계산하다고 하네요. 이렇게 추천을 진행한 뒤 다음 ranking stage를 위해 20개 정도의 후보 셋을 저장한다고 합니다.
3-3. Proposed LlamaRec - LLM ranker
논문의 저자들은 LLM 모델 중 라마(Llama 2) 모델을 베이스 모델로 사용합니다. Llama 2 모델 중 7b 모델을 사용했으며 이를 활용해 retrieval 단계에서 나온 candidate item들의 랭킹을 매깁니다. 이때, LLM 입력으로 넣을 프롬프트 탬플릿을 설정하는데요. 그 프롬프트는 아래 사진과 같니다.
Instruction에는 사용자 이력이 시간 순서로 정렬되어 있고 candidate pool에서 index letter와 함께 아이템을 추천하도록 설정해놓습니다. 그리고 input에는 사용자 히스토리 및 candidate pool을 넣어주고 response를 예측받도록 해놨습니다.
이때 LLM이 생성하는 출력 값은 candidate에 대한 랭킹 점수를 직접 제공하지 않도록 해놨는데요. 이를 위해서 기존에는 LLM에게 candidate 아이템의 ranking list를 생성하도록 했었다고 합니다. 하지만, 저자들은 이렇게 하면 계산 비용도 많이 들고 제목이 정확하지 않을 수 있기 때문에 추가 처리가 필요하다며, 계산 효율성 등 candidate list에 대한 ranking score를 효율적으로 변환하기 위해 아래 그림과 같이 verbalizer를 사용했다고 합니다.
즉, candidate item(예, (A) Private school(1983) (B)Real Genius(1985) (C)...)을 식별할 수 있도록 하고 해당 ground truth를 index letter에 매핑하도록 합니다. 그렇게 한 다음 candidate score는 LLM 헤드에서 inex letter의 logit을 검색해 계산할 수 있게 되는데요. 즉, 검색된 score는 index letter내의 next token 확률 분포에 해당된다고 저자들은 주장합니다.
저자들은 이를 적용하기 위해 모델을 훈련시키는데요. ground truth item의 index letter를 label로 사용해 ground truth item score를 최대화하도록 합니다. 즉, 저자들은 LLM에서 사용하는 next-token prediction 작업과 동일하다고 합니다.
추론할 때는 one single forward pass만을 사용해 LLM 헤드 출력을 얻을 수 있게 되고 verbalizer로 logit을 검색해 item의 ranking을 매기는 것입니다. 이렇게 one forward pass만을 사용하니까 효율성이 크게 향상되기도 합니다.
마지막으로, 이를 훈련할 때 LLM의 입력 길이를 줄이기 위해 사용자 히스토리 아이템에 대해 최대 값을 20으로 설정하고 retrieval 모델에서 상위 20개의 아이템에 순위를 매기도록 했다고 합니다. 실험에서는 QLoRA를 채택하여 효율적인 훈련을 수행하였다고 저자들은 주장합니다.
4. Experiments
4-1. Datasets & Baseline methods & Evaluation
저자들이 주장한 LLM 기반 추천 시스템이 정말 효과가 있는지 실험적으로 증명합니다. 먼저, 평가를 위해 데이터 셋을 구성하는데요. 저자들이 사용하는 데이터 셋은 MovieLens-100K, Amazon Beauty, Amazon Games 데이터를 사용했다고 합니다.
또한, 사용자의 시간 순서대로 정렬을 해서 사용했으며 5개 미만의 인터렉션은 제거했다고 합니다.
또한, 비교를 위해 선택한 baseline model은 NARM(RNN 기반 추천 시스템), SASRec(Sequential 및 unidirectional 어텐션 기반 recommendation system), BERT4Rec(BERT 기반 추천 시스템), LRURec을 사용했다고 합니다.
평가 지표는 leave-one-out을 사용해 NDCG@K, MRR@K, Recall@K를 사용해서 평가를 진행했습니다.
4-2. Implementation
저자들이 주장한 방법은 two-stage이기 때문에, 첫 번째 단계인 retriever과 두 번째 단계인 ranker 두 개의 구현체가 존재합니다. 먼저, retriever은 앞서 소개한 것처럼 LRURec 추천 모델을 활용합니다. 이때, optimizer로 AdamW, learning rate는 0.001 그리고 epoch는 500으로 설정했다고 하네요. 또한, MovieLens 100K 데이터셋의 경우 최대 길이를 200, 다른 데이터 같은 경우 50으로 설정했다고 합니다. Ranker의 경우 최대 20개의 history를 사용하고 이들의 랭킹을 매깁니다. title은 32 토큰을 초과하면 자르고 Llama 2기반 ranker를 quantize하기 위해 QLoRA를 사용하였습니다. 이외 자세한 구현 방법은 논문을 참고해주세요.
4-3. Main result & Comparison to LLM based Baseline
저자들은 실험 결과를 Table 1과 Table 3, Table 4에 걸쳐서 정리해두었습니다. Table 1은 저자들이 주장한 LlamaRec과 baseline 모델들의 전반적인 비교를 나타내 것입니다. bold로 칠해진 것이 가장 좋은 결과이고 밑줄이 그어진 것이 그 다음으로 성능이 잘 나온 모델입니다. Table 3은 retrieval된 상위 20개의 아이템 중 실제 아이템이 포함된 유효한 retrieval subset에 대한 추천 시스템 성능을 나타낸 것입니다. Table 4는 LLM 기반 추천 시스템 모델들과 비교 했을 때의 성능을 비교한 것입니다.
결과를 보면 저자들이 제시한 추천 시스템 방법이 가장 좋은 성능을 보여준 것을 확인할 수 있습니다. 특히, MovieLens-100K에서 가장 좋은 성능을 보여주는데요. 저자들은 그 이유가 LLM에 이미 MovieLens-100K에 대한 광범위한 지식이 이미 있기 때문에 사용자의 interaction 등을 포괄적으로 이해할 수 있는데 도움이 되었을 것이라고 주장합니다. 또한, LLM 기반 추천 시스템 모델들과의 비교는 최대한 유사한 연구와 비교를 하였고 구현체가 공개되지 않은 것들이 많기 때문에 해당 연구에서 제시된 수치와 비교했다고 합니다. LLM 기반 추천 시스템을 비교 했을 때 Recall@5의 경우 GPT4Rec가 더 좋은 성능을 보여주었지만, 저자들은 GPT4Rec는 5개의 쿼리를 전부 계산하지만, LlamaRec은 one forward pass라는 것을 강조합니다.
4-4. Efficiency of LlamaRec
마지막으로 저자들은 LlamaRec의 inference 효율성을 평가합니다. Figure 3는 LlamaRec와 Llama CausalLM의 비교를 진행한 것입니다. 여기서 CausalLM은 Llama 2 모델을 사용한 것을 뜻합니다.
Figure 3를 보면 LlamaRecdms inference time이 1초 미만인 반면에 Llama CausalLM의 경우 추론 시간이 계속 증가함을 보여줍니다. 이게 가능한 이유는 LlamaRec은 candidate item에 대해 ranking score를 얻기 위해서는 one forward pass만 있으면 되기 때문이라고 하며, 반대로 Llama CausalLM은 generation하는 시간이 계속 걸리기 때문에 효율성 측면에서 LlamaRec보다 뒤쳐진다고 합니다.
마무리
이번 포스팅은 추천 시스템과 대규모 언어 모델(LLM)을 결합한 LlamaRec: Two-Stage Recommendation using Large Language Models for ranking이라는 논문을 읽고 정리한 포스팅입니다. 저자들은 Candidate item들을 효율적으로 검색하기 위해 sequential recommender를 도입한 retrieval stage와 사용자의 선호도를 반영해 랭킹을 지정하는 ranking stage로 구성된 two-stage recommendation 방법을 제안합니다.
해당 논문에 관심이 있으신 분들에게 도움이 되길 바라겠습니다.
긴 글 읽어주셔서 감사합니다.
저에게 연락을 주시고 싶으신 것이 있으시다면
- Linkedin : https://www.linkedin.com/in/lsjsj92/
- github : https://github.com/lsjsj92
- 블로그 댓글 또는 방명록