배경 설명
좋은 컨텐츠를 적절한 사람에게 추천해주는 것은 사용자가 서비스를 만족스럽게 사용할 수 있게 해주므로 중요합니다. 하지만 새로운 유형의 서비스를 시작할 때는 추천시스템을 똑같이 적용할 수 없다는 문제가 있습니다. 컨텐츠의 성격이 다르다보니 성질이나 선호도도 달라지고 기존 컨텐츠의 통계나 분석을 사용할 수 없기 때문이죠.
음악 스트리밍 서비스를 하는 스포티파이에서 최근에 오디오북이라는 새로운 유형의 서비스를 도입했는데요. 효과적인 추천 시스템을 구축해 새로운 서비스가 성공적으로 안착했습니다. 스포티파이의 추천시스템 성공비결은 무엇이었을까요?
추천 시스템이 뭔가요?
추천 시스템은 사용자의 이전 기록과 선호도를 바탕으로 적합한 컨텐츠나 서비스를 추천해줍니다. 예를들면, 유튜브나 넷플릭스는 시청한 영상과 유사한 영상을 추천해줍니다. 아마존이나 쿠팡은 사용자가 과거에 구매하거나 관심을 가진 물건과 유사한 물건을 상단에 보여줍니다. 이미 많이 접해보셨을 겁니다.
추천 시스템이 왜 필요하죠?
우리는 다양한 플랫폼에서 다양하게 콘텐츠와 제품이 생산되고 있는 정보 과잉 시대에 살고 있습니다. 취향에 맞는 컨텐츠를 찾아내기 상당히 힘들죠.
그래서 추천 시스템이 필요합니다. 유저는 원하는 것을 쉽게 추천 받을 수 있습니다. 그리고 예상치 못한 새로운 취향까지도 발견할 수 있겠죠?
기업 입장에서도 추천 시스템은 큰 장점이 있습니다. 적절한 추천 시스템이 고객 만족과 수익 증대로 이어지기 때문이죠. 개인화된 추천으로 사용자 경험이 향상되면 고객 유치와 유지가 수월해집니다. 넷플릭스와 아마존의 사례를 보면 추천으로 인한 매출 증가가 크다는 것을 알 수 있습니다. 또한 고객 데이터 분석을 통해 시장 수요를 예측하고 전략을 수립할 수 있습니다. 이를 통해 경쟁력 있는 비즈니스 의사결정에도 큰 도움이 됩니다.
스포티파이의 추천 시스템은 뭐가 다른가요?
앞서 얘기한대로, 좋은 컨텐츠를 적절한 사람에게 추천해주는 것은 사용자가 서비스를 만족스럽게 이용할 수 있게 해주므로 중요합니다. 하지만 새로운 서비스를 시작할 때는 기존의 추천 시스템을 똑같이 적용할 수 없다는 문제가 있습니다. 컨텐츠의 유형이 다르다보니 성질이나 선호도도 달라지고 기존 컨텐츠의 통계나 분석을 사용할 수 없기 때문이죠. 또한 새로운 유형의 컨텐츠이기 때문에 데이터가 부족할 수 밖에 없으므로 정확한 추천을 해주기가 어렵죠.
최근 스포티파이는 오디오북이라는 새로운 서비스를 출시했습니다. 이를 위해 스포티파이는 2T-HGNN(Two Tower Heterogeneous Graph Neural Network)[1]이라는 효과적인 추천 시스템을 개발하여 새로운 컨텐츠의 성공적인 정착을 도왔습니다. 이 추천 시스템을 실제 스포티파이 서비스에 적용한 결과, 수백만 명의 사용자들을 대상으로 한 테스트에서 오디오북을 시작한 사람들의 수가 46%나 증가한 것으로 나타났습니다.
스포티파이가 실제 서비스에 적용한 2T-HGNN에 대해 알기 위해서는 GNN을 알아야 합니다. 간단하게 확인해보고 가시죠.
GNN이 뭔가요?
GNN(Graph Neural Network)은 그래프 구조의 데이터를 효과적으로 처리하고 다룰 수 있는 심층 신경망 모델을 뜻하는데요. 그럼 그래프가 뭘까요?
그래프는 노드와 노드를 연결하는 엣지로 구성되어 있는 자료구조입니다. 위 그림은 제가 사용하고 있는 옵시디언에서 노트들을 그래프 뷰로 봤을 때 확인 할 수 있는 정보입니다. 노드(노트)들 사이의 관계를 빠르게 확인할 수 있죠.
GNN은 기본적으로 그래프에서 노드 간의 관계를 판단합니다. 그리고 각 노드의 표현(representation)을 학습합니다. 여기에서 말하는 표현(representation)은 무엇일까요?
우리가 사물을 인식할 때, 그 사물의 여러 특성들을 종합해서 마음속에 그 사물에 대한 하나의 이미지를 갖게 됩니다. 예를 들어 ‘사과’라는 단어를 들었을 때, 우리는 빨간색이나 녹색, 동그란 모양, 달콤한 맛 등 사과의 다양한 특성들을 종합하여 ‘사과’에 대한 인식을 갖게 되죠.
이렇게 우리 마음속에 있는 사과에 대한 이미지와 같은 것을 ‘표현(representation)’이라고 합니다. 표현은 그 대상의 여러 특성들을 압축적으로 나타내는 일종의 ‘요약’ 개념입니다.
GNN에서도 마찬가지로 각 노드의 여러 특성과 이웃 노드들의 정보를 반영하여 그 노드에 대한 하나의 ‘표현’을 만듭니다. 이렇게 만들어진 표현은 그 노드의 전반적인 특성을 함축적으로 포함하고 있기 때문에 노드 분류나 예측 등 다양한 그래프 관련 작업에 활용할 수 있죠.
HGNN은요?
스포티파이가 사용한 2T-HGNN은 GNN 앞에 H가 붙어있네요. 일반적인 GNN이 아니라 HGNN(Heterogeneous Graph Neural Network)이죠. Heterogeneous는 ‘이질적인’이라는 뜻입니다. 무엇이 이질적이라고 하는걸까요? 바로 노드들의 유형이 Heterogeneous합니다. 스포티파이가 새로운 서비스를 도입한다고 했으니, 여러가지 유형을 다룰 수 있는 그래프 구조를 사용하는 것이죠.
그럼 스포티파이에서는 Heterogeneous Graph를 어떤식으로 구성했을까요?
먼저 유저의 소비패턴을 파악합니다(Figure 1.A). 그리고 유저가 소비한 컨텐츠를 기반으로 co-listening graph를 만드는데요(Figure 1.B), A컨텐츠와 B컨텐츠가 그래프에서 연결되어 있다는 뜻은 A컨텐츠를 소비한 유저들 중 최소 한명은 B컨텐츠도 소비했다는 뜻입니다. 이렇게 생성한 Co-listening Graph는 다른 두가지 형태(오디오북과 팟캐스트)의 노드들로 구성된 Heterogeneous Graph가 되죠.
컨텐츠간의 관계 뿐 아니라 각 컨텐츠의 정보도 feature로써 사용을 해야하겠죠? 각 컨텐츠의 타이틀, 설명을 언어모델을 이용해 embedding값으로 가공하고, embedding값을 앞서 구성한 co-listening Graph의 각 노드에 통합하게 됩니다. 그럼 co-listening Graph는 오디오북과 팟캐스트 각각의 정보와 함께 다른 컨텐츠간의 상관관계를 포함하고 있게 됩니다. 이렇게 구성된 그래프에 GNN을 적용하면 각 노드의 embedding값(representation)을 얻을 수 있습니다.
2T는 뭔가요?
2T-HGNN중에 HGNN까지는 알아봤습니다. 그럼 2T(Two-Tower)도 알아봐야겠죠? 인코더의 역할을 하는 타워가 2개 있다는 뜻입니다. 좀 더 자세하게 설명하자면 사용자와 아이템 정보를 각각 다른 타워(인코더)를 통해 벡터로 인코딩한 후, 이 두 벡터의 유사도를 계산하여 점수로 사용하는 방식입니다.
스포티파이가 사용한 2T 모델 역시 하나는 사용자를 위한 것이고, 다른 하나는 오디오북을 위한 것입니다. 각 타워에 대해 살펴보죠.
왼쪽의 타워는 유저의 정보를 인코딩하는 역할을 합니다. 사용자의 features(나이, 성별, 나라 등)와 과거에 들었던 컨텐츠(음악, 오디오북, 팟캐스트)의 정보를 사용합니다. 특히 음악은 (논문에 공개하지는 않았지만) 스포티파이 내부에 존재하는 별도의 벡터를 이용한다고 합니다. 오디오북과 팟캐스트의 embedding값은 HGNN에서 추출해서 사용합니다.
오른쪽의 타워는 오디오북의 정보를 인코딩하는 역할을 합니다. 오디오북의 메타데이터(언어, 장르 등), LLM embedding(언어모델을 이용해 title, description에서 추출), HGNN embedding(오디오북 노드의 HGNN representation)을 사용합니다.
이렇게 각 타워에서 유저벡터와 오디오북 벡터를 얻고 내적(dot product)을 통해 유사도를 얻습니다. 이 유사도가 높은 오디오북을 유저에게 추천하게 됩니다.
스포티파이에서는 실제로 어떻게 썼나요?
우선 매일 HGNN 모델을 훈련시킵니다. 새로운 컨텐츠가 나타나면 HGNN의 구조가 바뀌기 때문에 매일 학습을 시키는 거죠. 그 결과로 나오는 HGNN embedding을 2T 모델에 전달하여 훈련합니다.
2T 모델이 학습되면 카탈로그에서 오디오북에 대한 벡터를 생성합니다. 그리고 실시간 서비스를 위한 Nearest Neighbor(NN) 인덱스를 만들죠. 초기에 사용되는 오디오북의 수가 적기 때문에 전수 검색(Brute force)을 사용하여 인덱스에서 후보를 검색하죠. 나중에 카탈로그가 증가하면 approximate k-NN 인덱스[3]를 사용하여 추천할만한 컨텐츠 후보를 더 효율적으로 찾을 수 있습니다.
서비스할 때는 유저의 feature를 유저 타워에 전달하고, 유저벡터를 얻은 뒤에 k-NN 인덱스를 검색하여 추천할 오디오북 후보 𝑘개를 검색하여 유저에게 추천하는 식으로 진행이 됩니다.
이게 실제로 효과가 있었나요?
스포티파이를 실제로 사용하는 유저 1,150만 명을 무작위로 세 그룹으로 나누어 A/B테스트를 진행했습니다.
- 첫 번째 그룹은 기존에 사용중이던 추천 시스템이 생성한 추천
- 두 번째 그룹은 2T 모델에 의해 생성된 추천
- 세 번째 그룹은 2T-HGNN 모델에서 생성된 추천
모든 모델은 공정한 비교를 위해 동일한 날짜 범위의 데이터로 학습되었습니다.
2T-HGNN을 적용한 그룹에서 오디오북을 듣기 시작한 유저의 비율이 46%로 크게 증가했습니다. 또한, 오디오북을 듣는 비율도 기존 추천시스템 보다 더 높았습니다. 반면, 2T 모델만 적용한 그룹은 오디오북을 듣기 시작한 유저 비율의 상승폭이 더 낮았습니다. 오디오 북을 듣는 비율은 기존 추천 시스템과 차이가 없었습니다.
마치며
스포티파이가 수 백만 명을 대상으로 A/B테스트를 진행해서 효과를 입증한 2T-HGNN에 대해 알아봤습니다. 벤치마크 데이터가 아니라 실제 서비스에 적용해 확인해본 점이 굉장히 인상적이었습니다.
Reference
- De Nadai, Marco, et al. “Personalized audiobook recommendations at spotify through graph neural networks.” arXiv preprint arXiv:2403.05185 (2024).
- Wang, Xiao, et al. “Heterogeneous graph attention network.” The world wide web conference. 2019.
- https://github.com/spotify/annoy